From 6b33b9f51d726b8f4ed6173cd87960e6b89f6240 Mon Sep 17 00:00:00 2001
From: overflowerror <mail@overflowerror.com>
Date: Wed, 6 Jul 2016 13:03:46 +0200
Subject: [PATCH] i did some stuff

---
 .classpath                                    |  10 ++
 .project                                      |  23 ++++
 pom.xml                                       |  13 ++
 .../java/net/persei/dionysus/AudioPlayer.java |  45 +++++++
 src/main/java/net/persei/dionysus/Main.java   |  27 +++++
 .../java/net/persei/dionysus/MidiTrigger.java |   5 +
 src/main/java/net/persei/dionysus/Player.java |  13 ++
 .../java/net/persei/dionysus/PlayerGUI.java   |  79 +++++++++++++
 src/main/java/net/persei/dionysus/Setup.java  |  37 ++++++
 .../net/persei/dionysus/blocks/Block.java     |  29 +++++
 .../dionysus/blocks/BlockCondition.java       | 111 ++++++++++++++++++
 .../persei/dionysus/blocks/BlockHelper.java   |  21 ++++
 .../net/persei/dionysus/blocks/BlockType.java |   8 ++
 .../dionysus/blocks/ConditionalBlock.java     |   4 +
 .../java/net/persei/dionysus/blocks/Data.java |  15 +++
 .../persei/dionysus/blocks/DelayBlock.java    |  27 +++++
 .../persei/dionysus/blocks/IfElseBlock.java   |  24 ++++
 .../persei/dionysus/blocks/InitialBlock.java  |  23 ++++
 .../java/net/persei/dionysus/blocks/Lane.java |  41 +++++++
 .../persei/dionysus/blocks/SetDataBlock.java  |  32 +++++
 .../persei/dionysus/blocks/SetStateBlock.java |  30 +++++
 .../persei/dionysus/blocks/SetupParser.java   |  63 ++++++++++
 .../persei/dionysus/blocks/SplitterBlock.java |  23 ++++
 .../dionysus/controlroom/ControlRoom.java     |  53 +++++++++
 .../DataValueNotAvailableException.java       |  10 ++
 .../LibrariesNotFoundException.java           |  10 ++
 .../MalformedBlockConditionException.java     |  10 ++
 .../MalformedSetupFileException.java          |  10 ++
 .../UnexpectedDataTypeException.java          |  20 ++++
 .../exceptions/WhatTheFuckException.java      |  10 ++
 .../net/persei/dionysus/AudioPlayer.class     | Bin 0 -> 1477 bytes
 target/classes/net/persei/dionysus/Main.class | Bin 0 -> 1098 bytes
 .../net/persei/dionysus/MidiTrigger.class     | Bin 0 -> 298 bytes
 .../classes/net/persei/dionysus/Player.class  | Bin 0 -> 351 bytes
 .../net/persei/dionysus/PlayerGUI$1.class     | Bin 0 -> 1052 bytes
 .../net/persei/dionysus/PlayerGUI.class       | Bin 0 -> 2491 bytes
 .../classes/net/persei/dionysus/Setup$1.class | Bin 0 -> 603 bytes
 .../classes/net/persei/dionysus/Setup.class   | Bin 0 -> 1506 bytes
 .../net/persei/dionysus/blocks/Block.class    | Bin 0 -> 1448 bytes
 .../dionysus/blocks/BlockCondition.class      | Bin 0 -> 3877 bytes
 .../persei/dionysus/blocks/BlockHelper.class  | Bin 0 -> 1124 bytes
 .../persei/dionysus/blocks/BlockType.class    | Bin 0 -> 1201 bytes
 .../dionysus/blocks/ConditionalBlock.class    | Bin 0 -> 343 bytes
 .../net/persei/dionysus/blocks/Data.class     | Bin 0 -> 948 bytes
 .../persei/dionysus/blocks/DelayBlock.class   | Bin 0 -> 1430 bytes
 .../persei/dionysus/blocks/IfElseBlock.class  | Bin 0 -> 1446 bytes
 .../persei/dionysus/blocks/InitialBlock.class | Bin 0 -> 1255 bytes
 .../net/persei/dionysus/blocks/Lane.class     | Bin 0 -> 1919 bytes
 .../persei/dionysus/blocks/SetDataBlock.class | Bin 0 -> 1782 bytes
 .../dionysus/blocks/SetStateBlock.class       | Bin 0 -> 1603 bytes
 .../dionysus/blocks/SetupParser$Mode.class    | Bin 0 -> 1284 bytes
 .../persei/dionysus/blocks/SetupParser.class  | Bin 0 -> 1942 bytes
 .../dionysus/blocks/SplitterBlock.class       | Bin 0 -> 1550 bytes
 .../ControlRoom$ControlRoomPanel.class        | Bin 0 -> 1554 bytes
 .../dionysus/controlroom/ControlRoom.class    | Bin 0 -> 1193 bytes
 .../DataValueNotAvailableException.class      | Bin 0 -> 444 bytes
 .../LibrariesNotFoundException.class          | Bin 0 -> 432 bytes
 .../MalformedBlockConditionException.class    | Bin 0 -> 450 bytes
 .../MalformedSetupFileException.class         | Bin 0 -> 435 bytes
 .../UnexpectedDataTypeException.class         | Bin 0 -> 646 bytes
 .../exceptions/WhatTheFuckException.class     | Bin 0 -> 414 bytes
 61 files changed, 826 insertions(+)
 create mode 100644 .classpath
 create mode 100644 .project
 create mode 100644 pom.xml
 create mode 100644 src/main/java/net/persei/dionysus/AudioPlayer.java
 create mode 100644 src/main/java/net/persei/dionysus/Main.java
 create mode 100644 src/main/java/net/persei/dionysus/MidiTrigger.java
 create mode 100644 src/main/java/net/persei/dionysus/Player.java
 create mode 100644 src/main/java/net/persei/dionysus/PlayerGUI.java
 create mode 100644 src/main/java/net/persei/dionysus/Setup.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/Block.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/BlockCondition.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/BlockHelper.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/BlockType.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/ConditionalBlock.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/Data.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/DelayBlock.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/IfElseBlock.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/InitialBlock.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/Lane.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/SetDataBlock.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/SetStateBlock.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/SetupParser.java
 create mode 100644 src/main/java/net/persei/dionysus/blocks/SplitterBlock.java
 create mode 100644 src/main/java/net/persei/dionysus/controlroom/ControlRoom.java
 create mode 100644 src/main/java/net/persei/dionysus/exceptions/DataValueNotAvailableException.java
 create mode 100644 src/main/java/net/persei/dionysus/exceptions/LibrariesNotFoundException.java
 create mode 100644 src/main/java/net/persei/dionysus/exceptions/MalformedBlockConditionException.java
 create mode 100644 src/main/java/net/persei/dionysus/exceptions/MalformedSetupFileException.java
 create mode 100644 src/main/java/net/persei/dionysus/exceptions/UnexpectedDataTypeException.java
 create mode 100644 src/main/java/net/persei/dionysus/exceptions/WhatTheFuckException.java
 create mode 100644 target/classes/net/persei/dionysus/AudioPlayer.class
 create mode 100644 target/classes/net/persei/dionysus/Main.class
 create mode 100644 target/classes/net/persei/dionysus/MidiTrigger.class
 create mode 100644 target/classes/net/persei/dionysus/Player.class
 create mode 100644 target/classes/net/persei/dionysus/PlayerGUI$1.class
 create mode 100644 target/classes/net/persei/dionysus/PlayerGUI.class
 create mode 100644 target/classes/net/persei/dionysus/Setup$1.class
 create mode 100644 target/classes/net/persei/dionysus/Setup.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/Block.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/BlockCondition.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/BlockHelper.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/BlockType.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/ConditionalBlock.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/Data.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/DelayBlock.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/IfElseBlock.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/InitialBlock.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/Lane.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/SetDataBlock.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/SetStateBlock.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/SetupParser$Mode.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/SetupParser.class
 create mode 100644 target/classes/net/persei/dionysus/blocks/SplitterBlock.class
 create mode 100644 target/classes/net/persei/dionysus/controlroom/ControlRoom$ControlRoomPanel.class
 create mode 100644 target/classes/net/persei/dionysus/controlroom/ControlRoom.class
 create mode 100644 target/classes/net/persei/dionysus/exceptions/DataValueNotAvailableException.class
 create mode 100644 target/classes/net/persei/dionysus/exceptions/LibrariesNotFoundException.class
 create mode 100644 target/classes/net/persei/dionysus/exceptions/MalformedBlockConditionException.class
 create mode 100644 target/classes/net/persei/dionysus/exceptions/MalformedSetupFileException.class
 create mode 100644 target/classes/net/persei/dionysus/exceptions/UnexpectedDataTypeException.class
 create mode 100644 target/classes/net/persei/dionysus/exceptions/WhatTheFuckException.class

diff --git a/.classpath b/.classpath
new file mode 100644
index 0000000..3c96d64
--- /dev/null
+++ b/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/.project b/.project
new file mode 100644
index 0000000..65ce72c
--- /dev/null
+++ b/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Dionysus</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..6a825c7
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,13 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>net.persei.dionysus</groupId>
+  <artifactId>Dionysus</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <dependencies>
+  	<dependency>
+	    <groupId>uk.co.caprica</groupId>
+	    <artifactId>vlcj</artifactId>
+	    <version>3.8.0</version>
+	</dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/src/main/java/net/persei/dionysus/AudioPlayer.java b/src/main/java/net/persei/dionysus/AudioPlayer.java
new file mode 100644
index 0000000..a389ba2
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/AudioPlayer.java
@@ -0,0 +1,45 @@
+package net.persei.dionysus;
+
+import uk.co.caprica.vlcj.component.AudioMediaPlayerComponent;
+import uk.co.caprica.vlcj.player.MediaPlayer;
+
+public class AudioPlayer implements Player {
+
+	private AudioMediaPlayerComponent player;
+	private boolean loop = false;
+	private String name;
+	
+	public AudioPlayer(String name) {
+		this.name = name;
+		player = new AudioMediaPlayerComponent();
+	}
+	
+	public boolean isLoop() {
+		return loop;
+	}
+	
+	public void playFile(String file) {
+		getMediaPlayer().playMedia(file);
+	}
+	
+	public void play() {
+		getMediaPlayer().play();
+	}
+	
+	public void pause() {
+		getMediaPlayer().pause();
+	}
+
+	public void setLoop(boolean loop) {
+		this.loop = loop;
+		getMediaPlayer().setRepeat(loop);
+	}
+	
+	public MediaPlayer getMediaPlayer() {
+		return player.getMediaPlayer();
+	}
+
+	public String getName() {
+		return name;
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/Main.java b/src/main/java/net/persei/dionysus/Main.java
new file mode 100644
index 0000000..5842d8b
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/Main.java
@@ -0,0 +1,27 @@
+package net.persei.dionysus;
+
+import net.persei.dionysus.exceptions.LibrariesNotFoundException;
+import uk.co.caprica.vlcj.binding.LibVlc;
+import uk.co.caprica.vlcj.discovery.NativeDiscovery;
+
+public class Main {
+
+	public static final String TITLE = "Dionysus";
+	private static PlayerGUI playerGUI;
+	
+	/**
+	 * @param args
+	 * @throws LibrariesNotFoundException 
+	 */
+	public static void main(String[] args) throws LibrariesNotFoundException {
+		if (!findLibs())
+			throw new LibrariesNotFoundException();
+
+        System.out.println(LibVlc.INSTANCE.libvlc_get_version()); 
+	}
+
+	private static boolean findLibs() {
+		return new NativeDiscovery().discover();
+	}
+
+}
diff --git a/src/main/java/net/persei/dionysus/MidiTrigger.java b/src/main/java/net/persei/dionysus/MidiTrigger.java
new file mode 100644
index 0000000..40f68da
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/MidiTrigger.java
@@ -0,0 +1,5 @@
+package net.persei.dionysus;
+
+public class MidiTrigger {
+
+}
diff --git a/src/main/java/net/persei/dionysus/Player.java b/src/main/java/net/persei/dionysus/Player.java
new file mode 100644
index 0000000..7100668
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/Player.java
@@ -0,0 +1,13 @@
+package net.persei.dionysus;
+
+import uk.co.caprica.vlcj.player.MediaPlayer;
+
+public interface Player {
+	boolean isLoop();
+	void playFile(String file);
+	void play();
+	void pause();
+	void setLoop(boolean loop);
+	MediaPlayer getMediaPlayer();
+	String getName();
+}
diff --git a/src/main/java/net/persei/dionysus/PlayerGUI.java b/src/main/java/net/persei/dionysus/PlayerGUI.java
new file mode 100644
index 0000000..f7dee8f
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/PlayerGUI.java
@@ -0,0 +1,79 @@
+package net.persei.dionysus;
+
+import java.awt.HeadlessException;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.JFrame;
+
+import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent;
+import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
+
+public class PlayerGUI extends JFrame implements Player {
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 6068058949441154348L;
+
+	private EmbeddedMediaPlayerComponent player = new EmbeddedMediaPlayerComponent();
+	
+	private boolean loop = false;
+	private boolean fullscreen = false;
+	
+	public boolean isFullscreen() {
+		return fullscreen;
+	}
+
+	public PlayerGUI(boolean fullscreen) throws HeadlessException {
+		this();
+		dispose();
+		if (fullscreen) {
+			setExtendedState(JFrame.MAXIMIZED_BOTH); 
+			setUndecorated(true);
+		}
+		setVisible(true);
+	}
+	public PlayerGUI() throws HeadlessException {
+		super(Main.TITLE);
+		setBounds(100, 100, 600, 400);
+		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
+		setVisible(true);
+		
+		setContentPane(player);
+		
+		addWindowListener(new WindowAdapter() {
+            @Override
+            public void windowClosing(WindowEvent e) {
+                player.release();
+                System.out.println("release");
+                System.exit(0);
+            }
+        });
+	}
+	
+	public boolean isLoop() {
+		return loop;
+	}
+
+	public void setLoop(boolean loop) {
+		this.loop = loop;
+		getMediaPlayer().setRepeat(loop);
+	}
+
+	public void playFile(String file) {
+		getMediaPlayer().playMedia(file);
+	}
+	
+	public void play() {
+		getMediaPlayer().play();
+	}
+	
+	public void pause() {
+		getMediaPlayer().pause();
+	}
+	
+	public  EmbeddedMediaPlayer getMediaPlayer() {
+		return player.getMediaPlayer();
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/Setup.java b/src/main/java/net/persei/dionysus/Setup.java
new file mode 100644
index 0000000..2712b3f
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/Setup.java
@@ -0,0 +1,37 @@
+package net.persei.dionysus;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import net.persei.dionysus.blocks.InitialBlock;
+
+public class Setup {
+	private List<InitialBlock> initBlocks = new LinkedList<InitialBlock>();
+	private List<Player> players = new LinkedList<Player>();
+	
+	// ugly, but necessary for flexible states
+	private List<String> states = new LinkedList<String>(){{
+		push("none");
+	}};
+	private int state = 0;
+	
+	public List<InitialBlock> getInitBlocks() {
+		return initBlocks;
+	}
+
+	public List<Player> getPlayers() {
+		return players;
+	}
+
+	public String getState() {
+		return states.get(state);
+	}
+	
+	public void setState(int state) {
+		this.state = state;
+	}
+	
+	public List<String> getStates() {
+		return states;
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/Block.java b/src/main/java/net/persei/dionysus/blocks/Block.java
new file mode 100644
index 0000000..9565f33
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/Block.java
@@ -0,0 +1,29 @@
+package net.persei.dionysus.blocks;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import net.persei.dionysus.exceptions.UnexpectedDataTypeException;
+
+public abstract class Block {
+	protected String name;
+	protected BlockType type;
+	protected List<Lane> lanes = new LinkedList<Lane>();
+	
+	public List<Lane> getOutputLanes() {
+		return lanes;
+	}
+	public String getName() {
+		return name;
+	}
+	public BlockType getType() {
+		return type;
+	}
+	
+	public boolean preMagic (Data input, Lane lane) throws Exception {
+		BlockHelper.addPassLog(input, "blocks", this);
+		return magic(input, lane);
+	}
+	
+	abstract public boolean magic(Data input, Lane lane) throws Exception;
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/BlockCondition.java b/src/main/java/net/persei/dionysus/blocks/BlockCondition.java
new file mode 100644
index 0000000..d5731bf
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/BlockCondition.java
@@ -0,0 +1,111 @@
+package net.persei.dionysus.blocks;
+
+import java.util.Map;
+
+import net.persei.dionysus.Setup;
+import net.persei.dionysus.exceptions.DataValueNotAvailableException;
+import net.persei.dionysus.exceptions.MalformedBlockConditionException;
+
+public class BlockCondition {
+	
+	private String condition;
+	
+	public BlockCondition(String condition) {
+		condition = condition.replace(" ", "");
+		condition = condition.replace("	", "");
+		condition = condition.replace("\n", "");
+		condition = condition.replace("\r", "");
+		
+		this.condition = condition;
+	}
+	
+	public boolean parse(Data input) throws MalformedBlockConditionException, DataValueNotAvailableException {
+		String tmp = new String(condition);
+		
+		while(true) {
+			if (tmp.indexOf("(") < 0)
+				break;
+			
+			int open = 0;
+			while(tmp.indexOf("(", open + 1) >= 0) {
+				open = tmp.indexOf("(", open + 1);
+			}
+			int close = tmp.indexOf(")", open);
+			
+			if (close == -1)
+				throw new MalformedBlockConditionException();
+			
+			String sub = tmp.substring(open + 1, close - 1);
+			String before = tmp.substring(0, open - 1);
+			String after = tmp.substring(close + 1);
+			tmp = before + (minTerm(sub, input)) + after;
+		}
+		
+		return minTerm(tmp, input);
+	}
+	private boolean minTerm(String sub, Data input) throws DataValueNotAvailableException, MalformedBlockConditionException {
+		if (sub.equals("true"))
+			return true;
+		if (sub.equals("false"))
+			return false;
+		if (sub.indexOf("&") >= 0)
+			return minTerm(sub.substring(0, sub.indexOf("&")), input) &&
+					minTerm(sub.substring(sub.indexOf("&") + 1), input);
+		if (sub.indexOf("|") >= 0)
+			return minTerm(sub.substring(0, sub.indexOf("|")), input) ||
+					minTerm(sub.substring(sub.indexOf("|") + 1), input);
+		if (sub.indexOf("^") >= 0)
+			return minTerm(sub.substring(0, sub.indexOf("^")), input) ^
+					minTerm(sub.substring(sub.indexOf("^") + 1), input);
+		if (sub.indexOf("!") >= 0)
+			return ! minTerm(sub.substring(sub.indexOf("!") + 1), input);
+		if (sub.indexOf("==") >= 0)
+			return stringValue(sub.substring(0, sub.indexOf("==")), input).equals(stringValue(sub.substring(sub.indexOf("==") + 1), input));
+		if (sub.indexOf(">") >= 0)
+			return intValue(sub.substring(0, sub.indexOf(">")), input) > intValue(sub.substring(sub.indexOf(">") + 1), input);
+		if (sub.indexOf("<") >= 0)
+			return intValue(sub.substring(0, sub.indexOf("<")), input) < intValue(sub.substring(sub.indexOf("<") + 1), input);
+		if (sub.indexOf(">=") >= 0)
+			return intValue(sub.substring(0, sub.indexOf(">=")), input) >= intValue(sub.substring(sub.indexOf(">=") + 1), input);
+		if (sub.indexOf("<=") >= 0)
+			return intValue(sub.substring(0, sub.indexOf("<=")), input) >= intValue(sub.substring(sub.indexOf("<=") + 1), input);
+		if (sub.indexOf("data") >= 0)
+			return minTerm(getDataValue(sub, input), input);
+		
+		throw new MalformedBlockConditionException();
+	}
+
+	private int intValue(String substring, Data input) {
+		try {
+			return Integer.parseInt(substring);
+		} catch (NumberFormatException e) {
+		}
+		try {
+			return Integer.parseInt(getDataValue(substring, input));
+		} catch (NumberFormatException e) {
+		} catch (Exception e) {
+		}
+		throw new NumberFormatException();
+	}
+
+	private String getDataValue(String string, Data input) throws DataValueNotAvailableException {
+		if (string.equals("setup.state"))
+			return ((Setup) input.getEntry("setup")).getState();
+		if (string.indexOf("data.") == 0) {
+			String key = string.substring("data.".length() + 1);
+			if (input.getEntry("blockData") != null) {
+				Map<String, String> blockData = (Map<String, String>) input.getEntry("blockData");
+				if (blockData.get(key) != null)
+					return blockData.get(key);
+			}
+		}
+		throw new DataValueNotAvailableException();
+	}
+
+	private String stringValue(String string, Data input) throws DataValueNotAvailableException {
+		if (string.substring(0, 1).equals("\"") && string.substring(string.length() - 1).equals("\""))
+			return string.substring(1, string.length() - 1);
+		
+		return getDataValue(string, input);
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/BlockHelper.java b/src/main/java/net/persei/dionysus/blocks/BlockHelper.java
new file mode 100644
index 0000000..922a16d
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/BlockHelper.java
@@ -0,0 +1,21 @@
+package net.persei.dionysus.blocks;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import net.persei.dionysus.exceptions.UnexpectedDataTypeException;
+
+public class BlockHelper {
+	static void addPassLog(Data input, String type, Object object) throws UnexpectedDataTypeException {
+		Object obj = input.getEntry(type);
+		List<Object> log;
+		if (obj == null) {
+			log = new LinkedList<Object>();
+		} else if (! (obj instanceof List)) {
+			throw new UnexpectedDataTypeException(type);
+		} else {
+			 log = (List<Object>) obj;
+		}
+		log.add(object);
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/BlockType.java b/src/main/java/net/persei/dionysus/blocks/BlockType.java
new file mode 100644
index 0000000..f8033f7
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/BlockType.java
@@ -0,0 +1,8 @@
+package net.persei.dionysus.blocks;
+
+public enum BlockType {
+	PassiveBlock,
+	ActiveBlock,
+	ConditionalBlock,
+	MultiplexingBlock
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/ConditionalBlock.java b/src/main/java/net/persei/dionysus/blocks/ConditionalBlock.java
new file mode 100644
index 0000000..d20855f
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/ConditionalBlock.java
@@ -0,0 +1,4 @@
+package net.persei.dionysus.blocks;
+
+public abstract class ConditionalBlock extends Block {
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/Data.java b/src/main/java/net/persei/dionysus/blocks/Data.java
new file mode 100644
index 0000000..b5791bc
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/Data.java
@@ -0,0 +1,15 @@
+package net.persei.dionysus.blocks;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Data {
+	private Map<String, Object> map = new HashMap<String, Object>();
+	
+	public Object getEntry(String key) {
+		return map.get(key);
+	}
+	public Object setEntry(String key, Object obj) {
+		return map.put(key, obj);
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/DelayBlock.java b/src/main/java/net/persei/dionysus/blocks/DelayBlock.java
new file mode 100644
index 0000000..bb6747c
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/DelayBlock.java
@@ -0,0 +1,27 @@
+package net.persei.dionysus.blocks;
+
+public class DelayBlock extends Block {
+	private long sleepTime = 1000;
+	
+	public long getSleepTime() {
+		return sleepTime;
+	}
+
+	public void setSleepTime(long sleepTime) {
+		this.sleepTime = sleepTime;
+	}
+
+	public DelayBlock() {
+		super();
+		name = "DelayBlock";
+		type = BlockType.PassiveBlock;
+		lanes.add(new Lane("delayed lane"));
+	}
+
+	public boolean magic(Data input, Lane lane) throws Exception {
+		Thread.sleep(sleepTime);
+		
+		return lanes.get(0).invoke(input);
+	}
+
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/IfElseBlock.java b/src/main/java/net/persei/dionysus/blocks/IfElseBlock.java
new file mode 100644
index 0000000..10fbadf
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/IfElseBlock.java
@@ -0,0 +1,24 @@
+package net.persei.dionysus.blocks;
+
+public class IfElseBlock extends ConditionalBlock {
+	
+	private BlockCondition condition;
+	
+	public IfElseBlock(BlockCondition condition) {
+		super();
+		this.name = "IfElseBlock";
+		this.type = BlockType.ConditionalBlock;
+		
+		this.condition = condition;
+		this.lanes.add(new Lane("false lane")); // 0
+		this.lanes.add(new Lane("true lane")); // 1
+	}
+	
+	@Override
+	public boolean magic(Data input, Lane lane) throws Exception {
+		if (condition.parse(input))
+			return lanes.get(1).invoke(input);
+		else
+			return lanes.get(0).invoke(input);
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/InitialBlock.java b/src/main/java/net/persei/dionysus/blocks/InitialBlock.java
new file mode 100644
index 0000000..00ffa59
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/InitialBlock.java
@@ -0,0 +1,23 @@
+package net.persei.dionysus.blocks;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import net.persei.dionysus.MidiTrigger;
+import net.persei.dionysus.Setup;
+import net.persei.dionysus.exceptions.UnexpectedDataTypeException;
+
+public abstract class InitialBlock extends Block {
+	protected List<MidiTrigger> triggers = new LinkedList<MidiTrigger>();
+	
+	public List<MidiTrigger> getTriggers() {
+		return triggers;
+	}
+	
+	public boolean trigger(MidiTrigger trigger, Setup setup) throws Exception {
+		Data input = new Data();
+		input.setEntry("trigger", trigger);
+		input.setEntry("setup", setup);
+		return preMagic(input, null);
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/Lane.java b/src/main/java/net/persei/dionysus/blocks/Lane.java
new file mode 100644
index 0000000..ae0cb72
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/Lane.java
@@ -0,0 +1,41 @@
+package net.persei.dionysus.blocks;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import net.persei.dionysus.exceptions.UnexpectedDataTypeException;
+
+public class Lane {
+	private List<Block> attachedBlocks = new LinkedList<Block>();
+	static private int count = 1;
+	final private int id;
+	final private String name;
+	
+	public List<Block> getAttachedBlocks() {
+		return attachedBlocks;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public Lane(String name) {
+		super();
+		this.id = count++;
+		this.name = name;
+	}
+
+	public void attach(Block block) {
+		attachedBlocks.add(block);
+	}
+	
+	public boolean invoke(Data input) throws Exception {
+		BlockHelper.addPassLog(input, "lanes", this);
+		
+		boolean res = true;
+		for (Block block : attachedBlocks) {
+			res = block.preMagic(input, this) & res;
+		}
+		return res;
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/SetDataBlock.java b/src/main/java/net/persei/dionysus/blocks/SetDataBlock.java
new file mode 100644
index 0000000..caebe57
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/SetDataBlock.java
@@ -0,0 +1,32 @@
+package net.persei.dionysus.blocks;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class SetDataBlock extends Block {
+	
+	private String data;
+	private String key;
+	
+	public SetDataBlock(String key, String data) {
+		super();
+		name = "SetDateBlock";
+		type = BlockType.ActiveBlock;
+		this.key = key;
+		this.data = data;
+		lanes.add(new Lane("lane"));
+	}
+	
+	@Override
+	public boolean magic(Data input, Lane lane) throws Exception {
+		Map<String, String> blockData = (Map<String, String>) input.getEntry("blockData");
+		if (blockData == null) {
+			input.setEntry("blockData", new HashMap<String, String>());
+			blockData = (Map<String, String>) input.getEntry("blockData");
+		}
+		blockData.put(key, data);
+		
+		return this.lanes.get(0).invoke(input);
+	}
+
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/SetStateBlock.java b/src/main/java/net/persei/dionysus/blocks/SetStateBlock.java
new file mode 100644
index 0000000..85f2351
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/SetStateBlock.java
@@ -0,0 +1,30 @@
+package net.persei.dionysus.blocks;
+
+import net.persei.dionysus.Setup;
+
+public class SetStateBlock extends Block {
+
+	private String state;
+	
+	public SetStateBlock(String status) {
+		super();
+		name = "SetStateBlock";
+		type = BlockType.ActiveBlock;
+		this.state = status;
+		lanes.add(new Lane("lane"));
+	}
+	
+	@Override
+	public boolean magic(Data input, Lane lane) throws Exception {
+		Setup setup = ((Setup) input.getEntry("setup"));
+		int i = setup.getStates().indexOf(state);
+		if (i >= 0)
+			setup.setState(i);
+		else {
+			setup.getStates().add(state);
+			setup.setState(setup.getStates().indexOf(state));
+		}
+		return this.lanes.get(0).invoke(input);
+	}
+
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/SetupParser.java b/src/main/java/net/persei/dionysus/blocks/SetupParser.java
new file mode 100644
index 0000000..6b58860
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/SetupParser.java
@@ -0,0 +1,63 @@
+package net.persei.dionysus.blocks;
+
+import net.persei.dionysus.Setup;
+import net.persei.dionysus.exceptions.MalformedSetupFileException;
+import net.persei.dionysus.exceptions.WhatTheFuckException;
+
+public class SetupParser {
+	private enum Mode {
+		none, players, triggers, blocks
+	}
+	static public Setup parse(String file) throws MalformedSetupFileException, WhatTheFuckException {
+		String lines[] = file.split("\n");
+		
+		Mode mode = Mode.none;
+		
+		for (int i = 0; i < lines.length; i++) {
+			String line = lines[i];
+			if (line.length() == 0)
+				continue;
+			String tokens[] = line.split(" ");
+			for (int j = 0; j < tokens.length; j++) {
+				String token = tokens[j];
+				if (token.length() == 0)
+					continue;
+				
+				// comment line
+				if (token.substring(0, 1).equals("#"))
+					break;
+				
+				// mode selection
+				if (token.equals("*players")) {
+					mode = Mode.players;
+					break;
+				}
+				if (token.equals("*triggers")) {
+					mode = Mode.triggers;
+					break;
+				}
+				if (token.equals("*blocks")) {
+					mode = Mode.blocks;
+					break;
+				}
+				
+				// TODO
+				switch(mode) {
+				case blocks:
+					break;
+				case players:
+					break;
+				case triggers:
+					break;
+				case none:
+					throw new MalformedSetupFileException();
+				default:
+					throw new WhatTheFuckException();
+				}
+			}
+		}
+		
+		
+		return null;
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/blocks/SplitterBlock.java b/src/main/java/net/persei/dionysus/blocks/SplitterBlock.java
new file mode 100644
index 0000000..64fae48
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/blocks/SplitterBlock.java
@@ -0,0 +1,23 @@
+package net.persei.dionysus.blocks;
+
+public class SplitterBlock extends Block {
+
+	public SplitterBlock(int n) {
+		super();
+		for (int i = 0; i < n; i++) {
+			this.lanes.add(new Lane("split lane " + i));
+		}
+		this.name = "SplitterBlock";
+		this.type = BlockType.MultiplexingBlock;
+	}
+	
+	@Override
+	public boolean magic(Data input, Lane lane) throws Exception {
+		boolean res = true;
+		for (Lane l : lanes) {
+			res = l.invoke(input) && res;
+		}
+		return res;
+	}
+
+}
diff --git a/src/main/java/net/persei/dionysus/controlroom/ControlRoom.java b/src/main/java/net/persei/dionysus/controlroom/ControlRoom.java
new file mode 100644
index 0000000..4f54de6
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/controlroom/ControlRoom.java
@@ -0,0 +1,53 @@
+package net.persei.dionysus.controlroom;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.util.List;
+
+import javax.swing.JFrame;
+import javax.swing.JPanel;
+
+import net.persei.dionysus.Setup;
+import net.persei.dionysus.blocks.InitialBlock;
+
+public class ControlRoom extends JFrame {
+	
+	private ControlRoomPanel panel;
+	private Setup setup;
+	
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 7130672040530068619L;
+
+	public ControlRoom(Setup setup) {
+		super();
+		this.setup = setup;
+		setBounds(50, 50, 1000, 800);
+		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+		setVisible(true);
+		
+		panel = new ControlRoomPanel();
+		
+		setContentPane(panel);
+	}
+	
+	private class ControlRoomPanel extends JPanel {
+
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 7915937062340285742L;
+		
+		@Override
+		protected void paintComponent(Graphics g) {
+			super.paintComponents(g);
+			g.setColor(Color.BLACK);
+			List<InitialBlock> initBlocks = setup.getInitBlocks();
+			
+			for (int i = 0; i < initBlocks.size(); i++) {
+			
+			}
+		}
+	}
+}
diff --git a/src/main/java/net/persei/dionysus/exceptions/DataValueNotAvailableException.java b/src/main/java/net/persei/dionysus/exceptions/DataValueNotAvailableException.java
new file mode 100644
index 0000000..45f098a
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/exceptions/DataValueNotAvailableException.java
@@ -0,0 +1,10 @@
+package net.persei.dionysus.exceptions;
+
+public class DataValueNotAvailableException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 3826451107086625794L;
+
+}
diff --git a/src/main/java/net/persei/dionysus/exceptions/LibrariesNotFoundException.java b/src/main/java/net/persei/dionysus/exceptions/LibrariesNotFoundException.java
new file mode 100644
index 0000000..b2c59bb
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/exceptions/LibrariesNotFoundException.java
@@ -0,0 +1,10 @@
+package net.persei.dionysus.exceptions;
+
+public class LibrariesNotFoundException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -1839814203088638288L;
+
+}
diff --git a/src/main/java/net/persei/dionysus/exceptions/MalformedBlockConditionException.java b/src/main/java/net/persei/dionysus/exceptions/MalformedBlockConditionException.java
new file mode 100644
index 0000000..bb09435
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/exceptions/MalformedBlockConditionException.java
@@ -0,0 +1,10 @@
+package net.persei.dionysus.exceptions;
+
+public class MalformedBlockConditionException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -8751303849610920723L;
+
+}
diff --git a/src/main/java/net/persei/dionysus/exceptions/MalformedSetupFileException.java b/src/main/java/net/persei/dionysus/exceptions/MalformedSetupFileException.java
new file mode 100644
index 0000000..e4054ac
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/exceptions/MalformedSetupFileException.java
@@ -0,0 +1,10 @@
+package net.persei.dionysus.exceptions;
+
+public class MalformedSetupFileException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -2464874594169642335L;
+
+}
diff --git a/src/main/java/net/persei/dionysus/exceptions/UnexpectedDataTypeException.java b/src/main/java/net/persei/dionysus/exceptions/UnexpectedDataTypeException.java
new file mode 100644
index 0000000..6265caf
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/exceptions/UnexpectedDataTypeException.java
@@ -0,0 +1,20 @@
+package net.persei.dionysus.exceptions;
+
+public class UnexpectedDataTypeException extends Exception {
+
+	private String dataKey = null;
+	
+	public String getDataKey() {
+		return dataKey;
+	}
+
+	public UnexpectedDataTypeException(String string) {
+		dataKey = string;
+	}
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 3634084166179938086L;
+
+}
diff --git a/src/main/java/net/persei/dionysus/exceptions/WhatTheFuckException.java b/src/main/java/net/persei/dionysus/exceptions/WhatTheFuckException.java
new file mode 100644
index 0000000..fa63285
--- /dev/null
+++ b/src/main/java/net/persei/dionysus/exceptions/WhatTheFuckException.java
@@ -0,0 +1,10 @@
+package net.persei.dionysus.exceptions;
+
+public class WhatTheFuckException extends Exception {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -2453004182880966130L;
+
+}
diff --git a/target/classes/net/persei/dionysus/AudioPlayer.class b/target/classes/net/persei/dionysus/AudioPlayer.class
new file mode 100644
index 0000000000000000000000000000000000000000..5eb9cd46cafeda4bbd6d81584678df74e7b1ded2
GIT binary patch
literal 1477
zcmbVL+fEZv6kVscY0FT`U0MYZkant!paKelhQ#<#(TJ%L6O*AFaj?ux+9?VD<bx&x
zL8BkwM;Z4%t?dZoiw|>d`|P#XUhB-yUtfO!n8!m65rGLu`lcuA4QZRZw(A@<nho<&
zla|kG){(4hhzVr(twYPKS<asMY-e9qeGLhLTv%!=OCaH?bb;k^^MhG+&8p?q?W$!S
z)~froKk!^fI)1CvQ@Lwft;~%-krjbh&2>Eiu}w?II*<Yb<t~#gzivBwbS<%JJGQ?j
zFkHA8E><Xc!`+o>MA5IK7Xt#(La~y9z>tm<(!3hc(F0w>C4t5N<D14P`WY&(Lqk%a
zuWUPVvw5&1>o2XHnqu!(ty;yZ+q`cd#{BnoLtwHTre?qhZq#m+l_JESG)c0=kL?<@
zCNQmI2G<2Ld(sccDNrmF!yIVYV+O9SXej(;bxYtL7`UOKBrp>q%taU-H!&xW;)p^Q
zD1`X(Cd4ZC`5pB`6K8Yf1s%88vAAb78<J1%>bT7(T0{CRHDZPBVueHZblk@h)uzx3
z=}F6HQ>N)IiL$94&=9E+@`Tb`ZnIvMEG9`1P<@UsW0C}p(if*O!tT-!6yc|%W_ma@
zCn?^G42^xXd#i2&IpY*rBYKQMqjZd6;~Pd_pJMD7xz8&1GL0jI3&MyIVoG6TFh(d>
zR4hVc4&#`hnO9tm{s~-Fthkn`_CVbDg29h;5COv`=olDKFq}dc+AspwIz*qeiDr!x
zOqHVFF?)t$6tBAU(uBt(`$)?!rEG^%mI$;ckyBKMDJ{1tr5W`M^8)Aba@1-*z%AY3
zM(&2A+_{J{PAC(hD2rHXqm+q1caSymYy%O>pJ6!?V3Z*ZK$^rcMeL{l(Iwl>!qaco
sMqW^RvYv#`onYk?p#-&`4KPb~`dh_=c7D*f;q%F*Kyuf(HC1B$H^8$GfB*mh

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/Main.class b/target/classes/net/persei/dionysus/Main.class
new file mode 100644
index 0000000000000000000000000000000000000000..fe4fd7157fdabe41a4343e5876505846d50edc2f
GIT binary patch
literal 1098
zcmah|TTc@~6#j-5mM)8wLb0HTh?jDa5pRe^jNxKPY9(oHqCSx6cC3Tj-DY>&*uUa$
z@I@ZLOQP@oDC3!hf`lgSCNq2Hob!F(oOAZ~pYJ~bEa9nv9)^r7L*9^nAQi7F&us_I
zfWHvRH4tY=?unM*j&N)IWo1v=AwzFzyOiH#Naas`#n4x7Eypmp?zurI+^{U1rtC+8
zp?~8Tl_Ak^L|gjLUu`o?<+~B@bOH#gZ&kS}Tw{o3XUh!nb+0N-#E`ULVUS@cuUuJZ
z)+^F4iHak&B+nL3S@=rZ$A|Ioy$Tp6y7K9Z5>>oTJHuG^?fFY-ZgcaaEgK<SBrq_}
zu+mMtJc;3XRq;uM3<_Sj<u%>vNxlh&OBOC;k}C5~xm5}!b#%oyCNfASa23}KOrI%z
zu^oi6Zea%3Db#CH7t%*UmB)9e^dU7sih3@Ao5&it#W3Ccz-^D)qTwrB@Rnom@e0vV
zo3y&JV_TTT9EsR26id$v>(tSi{C|^j1H`ak;Wiej+>WXc@NP|pyDgd^Di6bGcJ_P?
zP29m<14|4e(a@ZgZQ&m7GZ-Y*4IRQrXU{`KBOv@56>FqRmkc~&Sm>g^ssh_1b!}b{
zp=!yEj%{KYNxkGOtVZqVgi^nYUemYbmeNy|&_lAQbz_>k7o(r22jl2PA6Z6Z^~0oh
zfWBjNM$<{_1+qBpjP~BSLkxY1LWgP9iJ;UJt=3ThMlecN0%?p9{6+eXlP43w6zN1~
zOn$}0Ck*^R=Jg@2{MyIVK5l%&Ji`I_DSV1jfnlOaQTiwiTlycWNj$(q@|$`H30CWz
fCj$Kt^fE!O9N_V1GJ6Q5qc#&k=rD#Sk#FrUsqz95

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/MidiTrigger.class b/target/classes/net/persei/dionysus/MidiTrigger.class
new file mode 100644
index 0000000000000000000000000000000000000000..dc175c83b48ad8a85dbb437d6d35ff176bcccd9b
GIT binary patch
literal 298
zcmaivu};HK3`MWgq=8Uq#1Eiuz`zqThy{r$(1EJ^OJW6A;RU@UNPHF(5(6K=M<M(w
z2DUEu`r5K}{QdL!1>h2SiimLHcrY*Qdlpkm=id6UH}_J@%1hI*PZ1OHjeWJIwXQMC
za>La?m|lyM;f63dJzEpv+pgve6YS5BU`m)5;`m{FF4?ba*)rj{=qlT;t(TDhn(^=?
zJz-Joz_=o0kKO1izLRh)|A%-H=&*pY=wnc)z@VCHGTRI!=O5U6*G7a)HH@JP2dcAe
Oov0sbA{?nknEwK1<U+In

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/Player.class b/target/classes/net/persei/dionysus/Player.class
new file mode 100644
index 0000000000000000000000000000000000000000..eefc1ac87c8465881bad095a855b6ba80b296f41
GIT binary patch
literal 351
zcmZXQu};H45JYE#V}}GnfY9&-cEgD}J(Yn-ky4~PE-UMdv8_8hQhtqs58$H^Ya0n9
znj5Y3W_I>IzurFp++!JGM7S-vQ8hcyR_$$79)0W8y3j{<5dy*@*9WZ%U1sX}C1=wR
zLhIA2stG4?vLj4tp&x9)gqt}1#W#(!WwuJTgrGxuUWRe4TQ6|rxfybTc-K+$jGIT^
zTRp5NByp0qugX-)=-OGM)uAxC>cZHmKj=!*#Qdb+BzGyUe=P{pP1QQXL($o=;;!RD
qf>e_)0U|kgj1b-75hlH!V%qEMN6&EH&vRV#y1=D430LxtaQzK7XHo3{

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/PlayerGUI$1.class b/target/classes/net/persei/dionysus/PlayerGUI$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..7d7fbb6b78e734f20561c123ac2ed93c9aa9e777
GIT binary patch
literal 1052
zcmbVLZBG+H5Pp`PTsaS@Rj4l@FIFueEXDWKn3x6(NiihV^2IO9-KH#F_nNyc$j{O!
z5<mC@{87f)Yt@*Tl6cA8?#|3UGxN-I-+z4l2B3<^E=CyUv^2aclT<1ms#u?-y_D}p
z;zTAd-)xtwE*yrLLvbXyI5u1!Np1L^(qVl3A{1RC6NXW9pwjX>fi;Gr)hP6t(#kw%
zSgf2AyVPQE>TxK?z;MyW1&n&gVcds{35Hz7223`Tmalr9eVM!#`;lZQHsU};Es-dD
z9vB^4Aj87&l;tWFIDVY<R*&LT={B`gY5cSKO-n>=spVlBS6!4CW{39f;~K6r<V6t3
zG%Z&d-k!@qqxX&nF%LvHQGwt`QE*7-PB+$e2%FS(7|L)*hD!7&R{!O!d6>aX7qbjc
z{~N@|oMqZgWF$pOb6CJF7mEyqjFCv_HgBG!Ms|FZahqlm_YA{SpD-2k-9%~AG>H_Q
zS{`#ADp+>0#BezS_&dVK3hq%h>Q$Ra6V8D7ejY>ScE<Mt)_ib~+#LB{Q9`G(ZMDE?
z`ZL3Z#o#sLUJ}SHWtB4VTjguE91_!}4*Fx?k>(%{8T@UnWm1nsn#vUOB*Yy3I;>Ez
zYNXu=y)N=(AEVt9I$Mjkyz-eoU*LbpVkWIE^Dw%%iUOT|x?`=EP^6U@!Ic5Z-T<Yv
z{0ZI}rcQC=Bj$^DPH{JPhSfiiML2YIoj|GtvOzk$pFvM&sY(NAphW%+0?(1(mizz@
RX>}-m9FJ({k<S)G&rhlG1SJ3f

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/PlayerGUI.class b/target/classes/net/persei/dionysus/PlayerGUI.class
new file mode 100644
index 0000000000000000000000000000000000000000..41afb69a051b08e90118484596abcf9f7505034b
GIT binary patch
literal 2491
zcmbVN>vGdZ7(E+1v13Hy5bi0EKmc1@)Nlz&1GJFD#HoQa7l#17EY=1T6v<=B0p6nh
z)0w_Qf0UVGhIZNq=)3R=ot~9UVuHC$Gh=CYwcpwEoju=|fByaBZvZ2xrqCg9$Wx(J
zRkc7lmhJf7v!EVWbFO@*YB!dODI^7Ut;r4f)C!(B-a~7)P?PH_g)V`E?++Eo2CC*r
zw@hTBE)}N)#H_&1N#6@X>4jzK)>Y@?X#d9RpI)C9=&D9%3QUyhkFAPtRb;j1RHU`x
zR@OLQulk<yLTh^cfwFC7-&D3EW1f?5K28WEUEi<rsJjB0)w=5jm6}qXfZ+s%mT4lF
z=Z@s0Z>w$y>@ko<uRw3f@zkw4kEkum2d-l7CBMQfBy-`sxtI(eIf1~D()$IVc4X6a
z+3}q4Do@JY&6i1O`e{W~Lkbe4aF_~eWi9z6v}TmFT@?hI8#1IdXy71*1jx3m=f?~T
z>v_s{f~p@Vy>`ODN#r8E!|A7?@~F*1C_{2j=8AEgY2XwF1bPA$E^$M}uW^H|!_OEv
zt3PG<sq6#}lT71tf%H_<3mGJEPV+cVnR2Cwuq$bVg|J3HOytWcTof4p-<Oub1q|v-
z7&BmCryhM_pa;F0-em(<K>fN&@48?2Y|5U>75Nuu_LYHaI{W?nKBZP=-3=#QDs!8T
zmRe^GGHGB6({cK=A2kZ+q(_1FHS^IIpg&07el5!A25<L+mpeR?K><ZA3|)OR_Yo_^
zY)b}i;+8<4wC!cbv;8L}Cm<bFiy$`5pf<GA-`+u5^pg{mB7dituO8|2<_#=hk?B2D
zVM|p|#$3K#Eyaaqsb(RytEh<`DC15F%L1cqF7^`;46JBd>3f@3RV71ON{1C3m(Alo
z{kq*r`pEALe2*U(rng492;|zB?p_-o>Uv%!x~|#n*eu1QhSX;$0~K9FomE*6lwNsc
zU=>5!hw}pY4~o{JFEP`yQen*wj|klVr~}$v#V5D5%z|I9Rg_kb7d;oXO17A@I#D*a
zqDK!+x-tk<fFXJ!!CxnmbY}`_j=S0MJCNazB^HfYV9}d>kMAAa(}!Jr_H$<OE%@#<
zf5+}$qiuWn?1~l-U?0auyaD@hfHQV73=sS?j+2}nieMbBba3U6`4UIW296H=f*v#5
z)xdEx*+5=DPCw^{4rutp<jTziI84q*c*GzX4e_{R1Rjo#-5UcokJY<1f6bPSlHcAY
z@G~{gdCZu*td|%u|HOrrml%D4OJ?E)#`R;jnYFWaU&oz3@nZuMW}<;FBVHzRztq5W
z1{GGAz)S;QZ*euLC2)e0^i#Jz<iD2!oJ1Zu_R~Dhv*AwQ3~u0Ji(E6Ca@}sL_4szJ
z$6A6rH-qPRRD4k-rmPjtngcqY2EG}1g{2N`5$&NBfXfu(3Wd7bB4Tz^#H{YNk%)Im
zJVu^jT#QW6Q;END?-jmHV0jB!n+fc`y}14!REY->D$A{jIu^}=jHdbuwrF7*<4x15
zg_f){n_06&+oL>u7o|v)*|sR`lueX#O)ly9qMhHEO>D&2=Qms8(=m(eHFnyyX8iGH
qe5cN3docgEL~zKa@fhwqA@tVvkp4FzWU(Fvd+_<zExy1v|NaBVWCYd#

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/Setup$1.class b/target/classes/net/persei/dionysus/Setup$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..04566c80057189940f72dbe1a2538373b5729405
GIT binary patch
literal 603
zcmaJ;%T59@6g>rGWE^08KM=))1!CgJ8pA@PiOHx74Eq5ZD2^R6?U?vkF4V+@AK*tB
zZwD8~1l#m+Z_hnFJ^lQ8{{Ya!frSi1MRM&;d91kbh9Z(rDp6jS>ttGQS;#T0O@hb3
zOSA|*U&wnt^o7z4c|8`YenJHPT!uEmPK6Y@!?4%*2Y1+G$el++UI4?Ag9YSmWKncr
zp~R4F9QGFB5=KUn+k{zhu!=QGOcOO`Sa0~L$}o^4@3ueT1Kl>9Wm3#<l7~Kz?}C2F
zsnCxGLD&moVd9@;&b)=8I$vSEMQ^dYQ4$aMr7%Qx>d~>emZ8uUBN^x<ri128${)i{
ze+lgBSjbVkLzLwUIS3;~;WgLeXlP-dVSBEj49=C5JU$NtrMN<ktjN-5GS@YpnH>!a
zi?kMKcZLjgz-=DAz;3?5X|9xCvHVQA4AyBb&FZPTNEIb)P|itNTx?>Cq8zqU^bRWN
Sx{GR>-J`ii!+eLimD)Ex@QrE!

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/Setup.class b/target/classes/net/persei/dionysus/Setup.class
new file mode 100644
index 0000000000000000000000000000000000000000..75a6bdd54adf6a64603fec7992138b43b062f7c5
GIT binary patch
literal 1506
zcmb7@>rc~A7{;HoTUjahn=plO5x0R9yz9n3Kw`3FQIi=GK6c||7HUV<&V>I;6A4ih
z<7fXU<8!(TWm^m`>3ZIC&ii{W&)eUBzW)TUhoXjvz@jUC^ISGPX`3f@!@clYo>`H8
z>s&)jVDi-ZWSNfT*3GxoQ(5x`blbK41E*0t^LSnkF0_2xG0V2+=LM1#yY5<kt0@KY
zeaD6JuyEA?W|qjcEhj+dizI31j&;G*1a@x4c^6y{Toaye`I4R+1D@9vRs5#y)`R=;
z;J$z;2_y=t!lFPllRXlM9X3v+jwogfOkh&OoWN|jYWGZ@sM>YRVkQZJI|kxNsMV5z
zBoZ3#3Z#Zr9yEGmPe%&NioPPSoEh4q;ATF1q^PR~M%(;#17jE$m?+z>eAD_^mCg57
z)nVtS%Z-}l99d0U*`3Xp|G{QYQvZk`FjkkolA<f|bSB%^LrSwhu=#(|>I~ABi}~!{
z5*E^Tg#HyJF}3J=2UFV7bQHUIq+w5BJS>&x8+eQ-l$QPibD2`7w$Oy<H9Wg9_-&-X
zh}Vl5qa#Nn+0BAQY<AP=eG7$l+rnw7sn#ovR<kBw+e#)q&~-=UC}5OaS2hnF%k!j%
zRVp3jml{JvjT0@6Rs<t_I8;4br_FKb*#>P61@EdoPAvbYXq}QI_}<Q4VLJB%v&UDM
zzr@1za*@l_F^}(EBAts~V(m*1afAO$q=B(xj6DIJ_82zF-s0YUo)~R5_a4v^$RNu+
z+8O79_$GH%{CMsw7Cv(kfdZ=}fte5_-h*s~Aln0w#eT@bP{>2<Fofzro*`ARDQ1x7
zv-S;U1i$dKACwA#rh3^t$BPcANKi!Oo=e?ml9B>gp<L;JFyFq_A*foFFscnNLzTT6
cs4U%|(0VALZhIoEM>Vm4eZF-<Q+)IH7o<-)Qvd(}

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/Block.class b/target/classes/net/persei/dionysus/blocks/Block.class
new file mode 100644
index 0000000000000000000000000000000000000000..a974abef745f95f8654f2e7fb4c291ac55aa32ab
GIT binary patch
literal 1448
zcma)6+fEZv6kVsCGG!PGl;ZtTP@yfzsED@`9#9Mq6-Xc?`ZjG(>Oh$`of#wl<bx(E
zMiW24k20=vrczQ#;h{5U_GRt0_THzz|NQs`-~pCRBn0xl44t;@1k!WrUdulWqQI#(
zTebbbSye9+hQQdK``&e$uHSGrt9!B*3K+h7AO*6Oo@+bocz&ZyUwGK2Z>Dk<_zvS3
zpCYmhSSALGLa*smydb1&c-w3EZWwilx7g=i9)w>ZWO;=ML(87;g)0KdLUEVeUbO1c
zLK5RPE+AuKLLjF#bj$ktvaX6-$YOjL0vBxz!x9*+c)r|-4yv-V<5rtme5>X*cioPs
zzPm;veCJWi^dNG&v*ea($Z#_X+fk_KGAmms_K9TF(tpPDDL09}p{JDlhoDE;os-fw
zWg~?l0Trr-Ay8oGxyGi_@7get7D%@{^0nLWY65G8LFq5u&@B%N&|@pU6|mMm)MPv4
zN(LrM0u#MGJNBe8&-upNYGDEQO*mY;v*@qOCO6*Z9eBt(ZoR(c20^9O5LiD4`5upM
zA5YwX_;QqsyB3@C$i@<8x!nhGXHuTeL9^$B^y>z3OF1YGV_>Lm6$Na!qE1b|^3+CJ
zdb1W3M`MZ{lDz6k7;4Bo8ERVk&4s3Sgy#fo`h>a*e2&tx$_&BxSm}trpUA#BLhdUj
zKkMjAd}cImns_73NaHeXcASGNxXLeqYq(DAxWWyM>(HujQ>8DM{KP{73QQGOkUfyp
zG008aqF0eRnVj!W9zQjC8n;hLzSEzaJ2iO*v*cG`WrH9^&0&kORYNm#*}2kp+$+t^
vf5YNOT4E&@-yoVv{z^?gj_#^a8Xw~c(bVZFo*}`1R&EF_y*dKVHD38Ia>7d)

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/BlockCondition.class b/target/classes/net/persei/dionysus/blocks/BlockCondition.class
new file mode 100644
index 0000000000000000000000000000000000000000..cffc19cc0592d0c04bc1e2d3ab2f7d78ef3b3e5e
GIT binary patch
literal 3877
zcmbVP?Q>jJ8ULN^-R#Zgrb)MHN($)<LfGBAO@Q=`yp<+xASF$Klt`<D-fV8tZ8p2h
z=5A~etJardRaC6jl&S@RAVw_$8#FVvpBTp(zd3&5li&RdoDqM|y>~Yo5-H>C%stO}
z&h!3u&i?g3fBG|k2T%;5N+Fi9o%WoapS4r%6RB+G+-zaCeLS5_PS3XY$<m+AOr#v1
zgrF%joU!Jt_Oz9mYCkr9#!fm4HOUf%LS$&=e8kD8GE-d&)!nH~%IQ_u99?@H8&%Ny
zvlDh00n{1@!B7Z9W1~7YD5xDe8Wa#l1dSnVT4jKzz`$lSDTMNNE^Q@kg+rBE`cGT=
z5&OA<ok`kV71~$fV-*L!)jIB=_8J{qxrBAx#igzW3fl|>QLRuvl*-t{g_&_Xf7}{R
zQ*UG_o3zrSRz4+rAE`N~Q?m-@&}R-a0~X9#%!k4~(NAMLWI0w>?4&~Y@Y$rDlN8N{
zaG%0~^>o=~n)ahsdNP}zu_spNw=5-um_pBOgoyT0D_yXMv(CXeE0q?f%OWISrX*9>
zv5TRL3ZmV>{dj<>N@XVOv&Sa?M?nk<ZHLhAR%ohBrk|U^*r1NRlo|`86}3YCkbzDx
zay7Gs@maU-gmrLmoy-b(kC3|sxgJFb4=Zf>WFhwzQt1ghFYJ8=`f-Sk%t-*mk=9Bx
zy~gNTSN8#!VOG&21|G#ACCsEU$L;)#!rn>=zN4QZ`(YfwV+MwBlznF9a&~4y;jZY(
zwaR__yM*JIa6GQCYaOMZ&iSN)5gb?0ovdf1LSu9-ixhDxlPhpM?7XcP?007-$1#wl
z`AjS05=^GE(g6YHla7tsELd)X)}&+Sbv#RACtu*qh`=&1jwFfL<yM-#wra|ha&c0J
z@K2J$)-gpbtvXU%UeGbkWlRT?pmyrWDpd9KNRpm2kOu|UdKKkXJ5#q#%x>%AIuX)Q
zpu%2J^d$plagISvWgK72|5py|i!W1Xw~nvSi{2g`U*+1(_3Mn-1Y1_reZ#;v#V=#Z
zcFJuW#<%fe2p1JLu2lYD#<8dDyn*jX-|FsIA})mQDr{dN^Tyx+XNu)ijDSn14dEq)
zO)He;Qyo8)z}ikB*EZ`|4wLdS^W!4IxQw5M@Du7-ZwUF9lUQ!x3Vuez=*Z!WlV=E5
zHKN}}mBIJxA%v?6&Fe`Y5tG80$29{#cPpL3M?4FENed;2ZBloy8h8!AV%??f%#?H5
zy|ftrH#me`3&p+=78L4S_X|!c&B>dq#hduGfw%D+a!~XqOfJ=H#f{{n!ib`l>bznk
z^R!KW>pjAfboO1->TBp+u5=acSxwqqp~4T;T1;=3j(1s6ck`AR$rkcSdmtru-KN!7
zN1M2aovf_@pB5}Rxg!Zx6XqSjZw+_P^R$X<TYL#&Gg23+FJj}68QD?-noGc)9uPO*
zN6S0psKR!Bw^0^Q2Mrtetw$3Yh~LP#Y{D)yVh2x~JPowvZtkedwS*qvbGV0R_Yzml
zwUu17Nj*$yI&qhm5jhcm4=qcGA5BCOMYLT*^#aZYdKXYfM2mK+hzEPi(6x{Mm5A(V
zA#Sg>S*yB^+GVt!Si-)WLb_SgCW_eK8B7FPJg7QB97S|@hL&;QM052AIJktv@#dhp
zgn=TCG>3{9F5-!!3m;#ICj_}jyFAbP=qa!T2Db9Gb0_XV3!!cNZpVFGJLqpWJ?x{8
zN9fz<iM8nAG-9}fW_%wBH#$#xzLukN8Bbx9u`%!>c_c1dk;BtC!Ax~y7$*s7Jn6s}
zcp9Y47`{lTnv%EU8LoUo%1y>^DY8-OXJo5hCOxY`ePl+)ia0foptfj67!?5n1Sc8e
zS6B>Yz=IjD1ihX|bKLYWZoE7knT6+c1&_c!&sC2{FlC;rqD54mad}!@Jp%hYqC~c3
zh6|)kyR<EGCSdt&9-+VjG!d6^NusVefjx0KVUcZ#B}Yd|?YPvYOD(WRJtx$%Em6<C
zF5wXmpRZsLxPn2pWro*E3@=nL2wcG++cLweC5H1A3<6g$$aXEm*Ib7Bc-&+zE=WEW
zOSN9E(DQDGwlnkhqn3Xz8u1`|v4hy%g!W*7>k;hb<6$2rv7fVGAI{?;T;xOS3cBzX
z*SA@7@1h5PLofcpSIWQn4%2W@CD5n#pkF=1H`gQ%tCujKuHX@M6OXFD@D=rUJmyyS
z4zJ!y)vZ2qtCs&B2uYn+@yC1CpGFr+t<nA#^8<WqaoBUt1)1pKWn5x2fA6M<Bw3Jc
zRLzmo;IEBrDX%rR5)V91iYEviC&g2Aew1zc^omhz)Y3p|p`$Vuskm$uZ)3lKG@iJF
z3IC+#AgRX8$Pe6}X-GtVRK$;OVZMl0ZkUl@Fe_Kl=>pf?qzxw`uan|K-0K0i@Mfph
ztnK<E-m1cfs4s!H5V^68DE(W!Neuxvb#BwLxog<gO&BBYS(rG*v{_8WIFpy8SCg(!
zyFJUwK8@kGzE5MmPbPVPM_hosTkr;c&lujIE`$Dgn0JV&lK0gb&(HBhqTXQ!G}dP1
z53c(=O|yvWGE2LCOuea<Q2TFq=@S)RS~j>M&d}Ux&c2z7RLHFK?uL%C*&V*w3h%iR
G-v2KovYJu=

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/BlockHelper.class b/target/classes/net/persei/dionysus/blocks/BlockHelper.class
new file mode 100644
index 0000000000000000000000000000000000000000..c3606812b2fff56298ed3d7fb2d812a3ef193e44
GIT binary patch
literal 1124
zcma)5T~8B16g@+?-Lh0@`KVSw1QA<kSuv3ZO8TH;cxccB#NgYuoz#VOx9Ls|{1yLz
z&%Q{M#E&Nvew6V{yVeSXxDPXT=G=SFoqNxo{rd71z$zY^7!p|YrLtSH9ZJ`3xPgBh
zc0#-61@*(weyq1G=@B+z2&503caH5je$#$lJCJoHkl1j2S5*XJ`NE!n@g!(S3o#6*
z5Jy5_tm^u5yYsdt+q+K9lLF(_pze5kPTSSz=+aPc+)yB2{l99;0+!Qgyl}#>8Z-sA
zt_*zYD5qTgTl<b`yMA-<ruUk%eu1@lRF^HqPJ|}L1=cUCNcMf~m%cn|u@$nRX?BlW
zvY)`hB(f%^1ZFQw5;a+erEncL1d>guHhtAT=2-F<3oZ;?MHQR4DKOc6T1UB_&2Asc
zM%4|Kg&c-W%m|DQ!Wzh6R!`@Sz|>_ddn1^}d<u85z_GH;=luRO>$O1K^;;dPVD759
zb=yyADE3B=|H2@sq9BsfAR6(o2BKU&J?V5WJbG-XsD$jlf+9;Ks)cjD8w1o)@`_f{
zPS9!B<ug~SGd-aB6<sOjKyLmpzz{8pnybl^&0TPhFP$Lyu?t&VH4G#%!Zp=%;C`)p
zH;OSPNz*onWV&h2m^{v#wWZ}xnAk4;#Mmiv`zN@yZhSzl^aIoHkvc_YfB6Krzm>jY
zdfmtw#m|@<!Yj=igXWzlCuk+eW|40KqnIJzB6*5DJ)#(OO%-~O4flxXZw>d6@7B47
n0+v``0uQiEE5@i8V@s^I$ecZEg)v!r^)S1SX-hCtw`uh^RU#5p

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/BlockType.class b/target/classes/net/persei/dionysus/blocks/BlockType.class
new file mode 100644
index 0000000000000000000000000000000000000000..2f85c372588190dfa9dd565715aa740cb7cc1c06
GIT binary patch
literal 1201
zcma)5-%ry}6#g#V)@>9R6Nd~Ce;{lFsZ$}wEd(Tx5C@nPmMlJXrDCzPOMeje?jNM%
z0iu!k>>p)3_flD3Oty!e``w=No$u>8{r%_rHGnGCWDGIPJ7%DEOwTth_1JQqt{?hp
z+jfmlzWRoT!*0ivkzg1-)z5X+)}0e|+X>GYly|!CTj!=oV_0YmLRDiJ-ZX-KS#Ha9
zj;(-N>vqI6z8Bho)v?XbmU9x_4R7xs?aeng8%Nt3!{Ylvo2Bc9Z8=u3&LEY_O@_pl
zdu*nW%z|NDK^}J)QuQdMP-^sDYJo@nYrExUhH~#JNFtSn%)vbcG6!i6rWK?)$Z&99
zK?W&)dY~YSVTQ4W<(T{7S=;mu^|oy?<QuM`+fCiGI2M;#NEjz^!AHv{J?FX|nsg|a
z$^$yhqJ)Z!GD9xrpz8<bnSv!OGh}qn)4PV-=`vK}J`dWbrV-S3W7hv&k#`1Js5$t+
z@H$==y`J)5li&uQDR_!1!)lyn%cd==#d_cJ_I>buqs7T;Zs-~2j>TW%=<Rl{@I>;b
zStpJjgdRP7731T@^}$50*EXs&If=fH<i-@AH$ag_Eh0@>L>e%VEAsJDW`d@#V1(*M
z34I~Ve}_N7TKO^Q61fXZ2vA4}Fe$)PQh=fWGbsUP<)2g}^)R8e5<N_6tz-{Ht(EFw
zR=dF5H{u<_L;5d}Hr{!JVv*D=lE#;$`;o}tS+v)YqAJ~UM{;Fp<`R$lBq>TjRHTTr
zjCpR2Huwn^qVhFr!OIIh%(dQ1mFrfWtK5^OudulMm7d&4x?y9t5;8RFm58H4IlNak
X&nj0?e}VnKZV1l>=L<5#xmW)JyJinj

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/ConditionalBlock.class b/target/classes/net/persei/dionysus/blocks/ConditionalBlock.class
new file mode 100644
index 0000000000000000000000000000000000000000..18dbb8514afad1556f36d0aeb724b30215698ffe
GIT binary patch
literal 343
zcmaJ-yH3ME5S(@F7)(MC5<PSf1gF$N6hxx3Xh7-D_DL+5JLIz?<+D;DQRD;oD8!yc
zl_JgT&g^TnKfm8w05hDVhzQr#wCd9|-mt3J*|qPyDr#50d$n-3;#NdmKLjO3OgP^&
z(037rcWk-6Ck!sHmV|iWDwAP=!x0h;36q?ydFnn2)4b@SHiXmMmAYQ)h6Dc><Mx$3
z;U?d6ao6IUkUhJuDa|8?#b>(>w{Lo-;|qv6`2r+TFeR7@Q#}Wg=@$+*B1FgpLm4t~
RBsl8xMB-Q&;aD)j<PS|RRL}qb

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/Data.class b/target/classes/net/persei/dionysus/blocks/Data.class
new file mode 100644
index 0000000000000000000000000000000000000000..6821fd802d66cb07fc8935bb5965d0740dc1f882
GIT binary patch
literal 948
zcma))TWeE66ouEE#H2}1u4=v8)=N!N@!*3Xq*U;RNURT$f{%03A)PcmC!CAWf2E+5
zD)<BZQR14Dp-r@+FEi{tdw*-~nfdYa>vsSTu~CF0uo9@mo2n>Q+S}D(a2Tht=TE}n
ze(XJ$i7X;7&=|`P(woR&<h}LBYM2P*4&+pz-p@|bL{Gdoa@rFp4fH6GNg64EM~kPM
zvoOO9l1K-m-dtt|?ro7#*wleewkXo>><Hwag}bVZ9I7r#C>K!|XrAi6lJOq3%c!AR
zf<Vi~ITVaH9jNW}z*o^b=}+jV)enbqvLhpHVw=n-dpZ_a>;K~-=xb@Dk{3Y|9SW?s
z=d9adI&&#IO$AqRy@+c9)l<VX>*5A(ay|loW7)<tSS;UHly1$*SY=v^PpmyY!`fWS
z-vx}>J1*{Gol?`3&K6L%@xM?6g#LKZtL+yk55hDWs+ZclNy&V&2j+6H#>dO?YYI5#
z1-Ta)Iap$rg(!2aF!MBvfkyWTZuc8%?~l;<g65~J`aIWK#wj3ALY<@w%(?7l4=!Sv
zyTBz}w!A0QaG0xfKcl&Ej4KX4GIU^2#s(;D5X-YNi(ms*u*!4(9^A69*OWFxxEbvJ
eF>dGnpj9*4>a6aB=31JudJk=C33Nzu(ESCq$J0Ro

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/DelayBlock.class b/target/classes/net/persei/dionysus/blocks/DelayBlock.class
new file mode 100644
index 0000000000000000000000000000000000000000..8c2e457cf50b4eff6d98ed32560958b97724f622
GIT binary patch
literal 1430
zcmah}YflqF6g|_|(q*Mm9szt%6rtTBE55ae%1gltBs4YZr)@ha17+KEw?zJve$a@B
zCdSYH5`Ts9&a~+&CTl<J-nl#X+;h&{>5pGuz5$rSmWB|+6^DCPgEw6+tcs{Rhi=QY
zO0{}<&$X6$%|2X|v4#jkDqySH#SnLEoHq($pEIy^2BXToZ9f%GXDAt2s#ka%47~=T
zh%qGc!r>dO{St2$>{5+tllgktt`+U3kn2t|;_V2RVLBhc!>631?(SdRBkA=_ks&rO
z9N{f65SyZoFop~yF%TtF=okLkgHZ<E2a-(B890v%MBTBav}AtQKCrEt?NqI8uPK~r
zE{<_bXh<<k2GCPB6%HHRz$IKJhFiAliUZ!UZz@Pyx0ZU*xfz&}2oaCaWFl=K1Ct?2
ztT@?pw#~8SiJFxcu9wp=!!RB|E>DF$m?c&fdGNfFl2AIbxF#K%V;D;RD?C%|#SPrj
zaFd}=+0t!k;5P1%&vvD9s&=!q%gbIa^NRTH+f`9!SV;$oU$#9v7qmf=S9to$n=)^B
zG|H}qd4>W1sJdTtEZ~ubhvbs~wXoCVcE!MB^b;#J$Wqyofn}_a3L0gpVlDHB2OS;K
zqbCNQVvWX2I0yAT8j{KX3sU-p(`XU$M36cqpAK6d$bYsfBWQrP>#b&)uL^mc68<#L
zO2L?*feF*JGlb+7q$onMh8}vxX=PEK(K~8>g#M0#5Da?8R8qqkijDRL^dUhjauWUY
zl*J1KEx}{v_!0E?6t$~$dIP=G&`=1&Y8~q!NOVbs{y5}y>|pIGV!(`fj6rh{!-Qxi
zM~*ONe!#^eOcKHAugJbkUOk3&g6ko?@H>tvX$iuJP+!TgA0vdGC467QOjpBQ+#^o+
ziKVn7r_{Wrj8ro!t@w-wvSIiHiy?eRHv0*yZ%+vvCLc!>e5zg86*!7@JR@KNLmtlw
Km|;UzZ~g{oRzrRO

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/IfElseBlock.class b/target/classes/net/persei/dionysus/blocks/IfElseBlock.class
new file mode 100644
index 0000000000000000000000000000000000000000..a71dd742f2f8fdc4703adb36c3891fac8b625748
GIT binary patch
literal 1446
zcmb7E+fvg|6kR7xNiX461aF{#h)t_RylVj!D2i5nfT<&IX&UN*kaU`akx%dw{0Coj
zL<XI4eD<Rp_en7pok_>(Oy=x;&f068wRg{tpI^QKn8h;%62r7(`Fhi8c^22}+;#T6
zz|(8CYi@h`>So#YtVIzhkQs_GXO~>3&V4Fi*dc%+ZT?OXvJwLg&qw$YL(d#{xWB+K
zlm8E#R%MWv+`5%P0$CLbRE9)etESM$knOlk8Vmy}29YC#W9(QAxyqKYYv{J&H1svU
z#hpeejT0DAFw8L3P5k;^(^7E~r>Jgpk;sVYu9pya;$t|Y;;g75`;-xhF%?Plh}C%&
z<CtJbl19rTqPF6|=eAzqo?lXMflkFptq?GUiwv1fgZery3S}^fOTw!>!*Kpz6SQg;
z1zc88WatYmiU?I)!3;TU)a!p?U(~iN(=TZoDO{yF@LNHfjG@269qW0pQ?pv@M$Hb5
zcTK~t8Z9p3qonM==5)o_?sxQ)MkcvqG`Pu7j>Rk+zEO(nhOmfqlSSn>rqvYl>?yd*
zF!X0UqMZy%m{%~zpvAa;e7aRE;6BN18uX8&$?7gw+YlXisA3UI<aWdIh1;uIN3V|j
z7QHO1SP=w0+}U-vi6P0IW<ZdMxNC>L(A0^E=yEi4i2PY|gO+KnaM8noj$X_NqcA}O
zo1j;QK@#&zD~Z+$QuIwz^cFH@fce4!GKF04KKctEF|?1<h2lO&3!iZAD<)s%rVcQD
z2u;GvD5XcK4`JC^`ktfGpyDzW&(LoWDn`%?4SkqHKd#a4NShGXaf2eF4uvribQ8B|
z?>6ORitdC01ImaC=)^l({EU0=Ff1g<hj<|2J0>Z&{9a@d$1((w=xqfN3-}PS^oooT
cxsWj4E*VMC@d%HJl4!7sCxm2pN|A)hFV)m@&;S4c

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/InitialBlock.class b/target/classes/net/persei/dionysus/blocks/InitialBlock.class
new file mode 100644
index 0000000000000000000000000000000000000000..b93dbecd42cdc1b2d504434409817f30ae108af7
GIT binary patch
literal 1255
zcma)5T~8B16g^W~wropVmf}ZIOZ}oPlog4INeL!sO-KqplwkC2+fLSjx@~r6jr=Dc
zG*L(-@dx;$jCZCR+~CIeva|Qjx#ymHX6EOw?>_)+V#`2^Vb$Z(o^U_l!XApTcN&C&
z-5-qyCxN}^2`QY>u8It#8CL!Q)+mOo^o8pZA492o?0j(SP>PY=6@hFs%=LupIWqJ)
z!`7AU?QRnLz8H$bDP?<y7-qKxsoG(fsW*-o($B|3Zej-WdCb8yP-G~_+j=K_sG6H7
zV15n^RvsD5G8DVQ;|JmUKKBou{)hxw-SNN~9XY;Gag<EUcY<bVB#KM$i6rJ+E+ffQ
zY1JE71|`Uozmoqqy%D*~@T{JwC~j9GpvPr6X*b?7n4OOUK9O|hfq^>=i`ur4<GJ?b
zj)4`1YSOtxqrY&ZW1@=rEGlZfpT`3{q-zjx+3}=*%J8&4onJHeXaLV`$1<<_$9y2$
zkx3d9rLw3qWQZu7m~?Q>Jl3#I)DxfYJFXZobdpVoX=^8%5COW5$F&u;L{!{MhUG-e
z)J~Eqyh$h-l9}Ry$oSqk^auQ<P?v5Y{>V1e5u|H0><m3oy4~uk(rQqYLYA`hgrLmG
zQD#@iK&g3-eDeZ@H|HpQ!@?JhUZih9^O(ewLy_vrl*>~!)nEzNXl1yL8^k^Ba8vWz
zlvS8a^D7oU(@zSDObJnxe@HTyBo!<Z>K5&%33Xf31k^lDnd$|qq^x$(vhJ>(;oj?(
zwYsj>W{aJn@rfYQ29}0fH0L7eE0eAz-K;sKiJB21DrjjjRn)OT)mfUt#v|>=rsjM6
E8|}h79RL6T

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/Lane.class b/target/classes/net/persei/dionysus/blocks/Lane.class
new file mode 100644
index 0000000000000000000000000000000000000000..d3c243a03a2d38793e832839bc9d94bef01362eb
GIT binary patch
literal 1919
zcma)7TUQ%Z7~Llf3>n5!F6AbrluMh7WxTXS4WMnI(we4KYAQTAOpaknI>VZobk!IC
zgm3-<UwrU}ExMM=Xa9$PL*3^jkQ7{@Su2@y`M&+_{aq%1{qx%&0N%ouiIl*FKqk(f
zjAH3K6+aBVitDknT?@V4*eSY!G+_vwee6DUothg|o%`F5rI!etag)ULc4XzIwxvx`
z8`TrP<`n%nDF~!D{A%DP^+*a_J$AiR>=0OE7FGz+?S=J#;lv$*lwT1r0{02w1{-ji
z(nb>bL6ye6OJ2<n{A5L-E0ZnL_*PhvY0%t88kRtR(GO&){$yK558dsW1`0j5R(2y_
z?VE=KRhis4rf)ElJtlz>ub()4C0&ZrxQ%Y~kYlpr#{w5S<wF&M(M-}RY5Bv4aoZE1
zP%qf9@tQ!-QZo_fGAA>YEnDcqtc_{(o0u0EZZBQ1D=Vsi7UnRkFf%s#RPuTnB^Q{_
zbRyd*UbftaH?Uyh3VWp;K2B^nc#|b^E3D^B{2I+w$ZoOlx(5YjP7g(9e(*HhWi{tI
zGFx>MSA$z?&pf%8u-#)5ivmNf{yw_t#d~DI{L0uu0m~+q1TLM{wCl3QVY0D;4+JbK
zeBj1$F{}!#pHA&$rP@vobEETm!^TbAV#oW5jNBxQ1V#>9LQmkG=6RtHYxu~-ZO%Ze
z3Wv8g*1^Ft0{M(H_Ht7-<C*waVEQ!K7VhGnjS}vY(_SR+xmDj2SbGJ{9iVmFXSbAu
zPi%aO4UWK$8<#X&PPl3lKiI32d&lw7b!Wpxl7lAbWo?A@$dk8y^#(|*FbgU<xX5nr
z;>*!MN)0D>CU+_H!cy-Kt_Rg9=qJaF&mP{LK|d|eayQSX`g9vVW8g<FQW)Z|0s`HJ
z^$EB;hY{X2z(=*K!&7C|o%;o2KWM|2Yrl528wQxb>%143#CiUzxb4nU$DN1%*Lhlt
zRnA{(xxh^BIlsSSZu2=V?PDzW69zVoFQ{Z6mvi}jOtln^Fg?I1J<}9FMk?dPo6wPz
zGNLtUs+CHWQkO-pNqChu%F0%1^9RVM@Ti4u>AUkx^;8?8eS~Q9-|KCS_ztep_8O54
z?yu`)e8Undc8mGJcXKcBzOk%=9N<I2^>-K@Hx95W@F(t;uH<vSqB!~WvO0Sp@a?~U
zPkv9=M%gA<I8c^}S<0NFka^_!yoSq~R*pd#=7`oJ9^y07NMiwIJR-^r*NSQvPe0eV
GoBshEAF_M^

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/SetDataBlock.class b/target/classes/net/persei/dionysus/blocks/SetDataBlock.class
new file mode 100644
index 0000000000000000000000000000000000000000..2c942d4d863a5c15d4b845cfdad7c91445277c9e
GIT binary patch
literal 1782
zcma)7Yf}?R6g`~;CWPh{6<>(pMj!zhU%0MeT}2RGBR)V7pEV?1I1(nQ%!FEg!2TP*
z?A8W~waW6FRsJZ;)14HAO)74slIgyE``k09Pv3m~_U|VEm+;m?NMO`cfn8K3U%7V9
zEqL30*|*p7h3tlJFREbH37i={vk(y&YLRTR1R^=^5Qt~qJ6n#Ocf56bF(|p-dRid7
zp|%Cur(MqtZnE@PV^U)zxlGVIg`A2Z3@H&s7m>!2%Te?Q$SOx=s&_!3Pa=+XZt<K=
z)q$hvw{T1#@gwF-+eIaD947=iZ)XE{s|qPFlKDSd)4KL4iPIV&5)e!W&PZ5j*Q2u%
zZPn4R#5w#V&_->PFVI_k<#OQW?TqUOX$$9>-=b)S8>1Ly9Sspf0!b}PO5j)%MU%^&
zn82ik3j*EdQ1(kn*tkeBom}oedmpX6SJ@z)d?C=2aXqzA-dt0qC1)+K^w}1&PJY=b
zxq4m;MuK-P-zM2gt$IJv4sDyxx|<c48*8;mJ22fULCay7#^(OWs$xJB`xbr?IC5aY
z{go(KxWo8c1IO?yezQO`wh~-tO5DP2f#|vl=DeUpACEK>yUxEg4K3Ue=sFPop;NRl
zN24Bu?m7NDhGUq8)Qs*)+{f=M=I<A~-lSM#tz=`U6Enz2Jj4PIx>ybb4nfsOHtuT*
zHG#(xPw<pb)IodZev>@y$R&wq;LUA!y{*CqO_TWXA#1m_xt<|8-0H-QB?MaL7*}Zb
z9>`3IdHDT@-OHO=bMVyR)ag1+Y8|XGa+83u#X`B1Rd-!|H~Q*5KB;SCnAbndjvL~K
zJ;03E70i=o4BZ}Loc)Q2$+J_t=uE}CE9g!AjUyGDOpRACkeaAqF!c|HJ|eLiAKAs&
z9>zmh`O5%Z;_o1v4Il~AMZj+Kp$GlwWl!qEB)j5et`1d8;0msC1~vdqMVOH$7vgvd
z*ZBOIu?T0^4Y>-(5k}_6<2QCN{TVY07rx*$XCE=Ux{JFzm|v+|BhdkV2lwzGj1^5g
zyoX02d`4n?2a6vF73O~saLOpr&mzZ3`2+@V5+kHMg)@e5s#<oR@H|%V+z_6}C{{^S
Z-<ULB5bq`NB-g5uSBwa}W-Np^-vQCm#!3JH

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/SetStateBlock.class b/target/classes/net/persei/dionysus/blocks/SetStateBlock.class
new file mode 100644
index 0000000000000000000000000000000000000000..5cbff2ca043f15fb8f164f53293d064d8f5b1bc5
GIT binary patch
literal 1603
zcma)6-%}G;7(F*^*sv^6qd}1t!BR+qxYkl@jV+==8%?1#7=J%3$!)w6Hkssxk-w#X
zfG>T~DKNA%j?>5fQ60~{FrbzOA9iQId+&F?^L^*+{pa65Ujz6OPh7+V(vj3bLpEDd
z1r=3~Hd^gguu`j+S6e|*>Y@&{ylz4lj=*S#)Ap1=yk$}Zl7(mCdKlEgs2UV?Q$^LB
zK=)M@DgC`bD*fN>Oi94GQLji3UFh}U!WZaDXG#h53-rCmrUwF__&A1c=0xF|?7?xQ
zT$~UXKZ@h>Mnn1-#7TkPxw2O4yA29V6h0<3XKD}mIBftNO)#_YsgF3i&DV&JGZ^I{
z*t%?y=5D8Lt!hC*wRFzKS%EVhN)?!xz&OzjgoiOqm}w+>kw(@<Mxfu$b|2Em6wYy0
zVWslHXqQ%=$+FI69tsQ;R3sPMYb&z39In)?MD=o5D}_yE;=M&jKUHL%?KF$`q%g7?
z&D+e1uZ2}r7MM?WO1~NEFxTmT8Gz;N%|9>8hNdrDE-nciKk(H4P6C&W>!fZsJY2z5
z7i83Fyr#U5??4+Ss#4EKy17B|4|C)@Cf%E)i)&Q>F!4AP!(bNIecZrJfgXa}|A&J~
zrZXSfz^J+4;|KgG;Hs!1pD+FTKkDTT>@6R+Q6OiwYGLV*bUsruIEy}(@G~92k_IEc
zSB?Iu27AnnkM8&=Vwr-eXuZBl3ydEvl<`hnMU6I*$2zHIWj*4IRaRj5P#il!iYFAG
zynt7%x0_|TpsZQBYumQ>%z0x3HpG^BnF++q-^Z^Qzxk)|-NUE}hburfyA3a!?AydZ
z_7#$wIF+5+#BlZxeD)W{9wa~C#uq!7jN#r(i!sgjX^ZC(p%)&^Rnx~iqaPUz;5_#S
zcaag`0wdPomD<g^0vGWW_hz`}F#6gu`I|iBT)97${ALT^zQOF`^cLpGV0Z`fF<f#|
z&TsIiQ_dFhFL3r?)3BO82ziz#4D+rX{1n3*j7@Ffm*0sUgW)~G{=v)8!wC!_#dr{t
uI7J>qSirF5KC{bZpZk5>MTuO=597E;BoB+Y%&3c5vv`1qwwFh?%Hy|CqmKpv

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/SetupParser$Mode.class b/target/classes/net/persei/dionysus/blocks/SetupParser$Mode.class
new file mode 100644
index 0000000000000000000000000000000000000000..d87f9165fad4ac9c4e240fd4329de225e741dc52
GIT binary patch
literal 1284
zcmb7DT~8B16g}g%yKPyaR0Js?ejv8xV?hN!+8~5rLM&ji(4_HcTgJM$>^A#B?7!0T
z0MST%_D31-3>Egp#O}k+oSA#?oO9>QuixJ;04(E`h8qlXE)R`1_XBPlhqmW-f+#Q=
zj@SGY7$y&+_B)IA{Fxo^kZVXV3?5l0mf=`#%h+<GV}^w5xtw94+DD}_gVuJe4xP)8
z3VplPl2i5aWQKvQ-GiN(+D7$Y%Vb!5-)HeurRmtN9j-Abg<_3JZW8|#k{K`z>&W32
zgIei@j25cbqD*4rw#wVZTAE^S>qtUPK@;GP4o!fR024Y=0;C1Ft0N6n%<k#PV1Qw$
zYP)<lI&N@(-)cD2pj_2!T29UKZGq)t1`39WT=>zZKBy;_6LFd>6^i`{&Y*yjh9W~Y
zCZrRD{8+~v<{8qK?^~Uw*X}Ts;&S&IN4y!9w__dnyF@LZYm%h)J}_*=(|TPh_H{2p
z?vjoLEHkXct8F?~5R_vSuF7A_5oROXWK1veoBWL}TAGbHbWwzoP}6R?Rv7uT{W?}r
zq*wZ4yGEz!+pf!fNsk8_UNFr5pUde|#fw>AB1<Ur+>-0#!bkv(<RLkdedI{a0kV1F
z8;VSjt#sU^yg@>r35#$4J6Jt8q?{ppiV+D$6B3L`FrJhkFTtcL!Ibucl9Vn+%zC1W
zF|(fRB5&5!E~d;=On;@iH*lZ+85%(jenw|MkgH;c9!ZbIGHDPhw9?$<86I9IsuX};
zk}l^OW`rCn_6W1R^i`5B(nq_PuD?}E7xju@wxdj(<MI3#+PS20S&dy$NRw3-do@ZF
kBhJd?Sm_+bPq2UIDR?4lJ|#h-_6k--Cgn3c$IJEnAF5a?mjD0&

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/SetupParser.class b/target/classes/net/persei/dionysus/blocks/SetupParser.class
new file mode 100644
index 0000000000000000000000000000000000000000..7f75c75b528de499e90d3029f7a35bee9c04c6bd
GIT binary patch
literal 1942
zcmb7F-%}e^6#j00Z3wGHXlO%A0h>Y+C~2t$3$#KJY}y2{K_W$3H(?74%LX?|$3E$3
zM@L_L*73y|XENhBBhry}MCp@t#__=iUmX7z^}8EFafqWn+}%Cro^$SZzH`pqpZ@rE
z2f$h66u1OBExj0D*X@FC#21acb+=F|#It5Tw_1p&^<rs#TH~Irz$4JGqTSKrre-b0
zr?M-0t|)LJoX#X>#;)9&8NHkw4>MS}5-eN|7On&f?+X@A<rj4U*L*_2H*8o&@sfZ$
z5}g(BjBzUfH|kX=@CzJD8kRm;TFdJ8jFvU&)|kxaG;>z74Jq#`J;i0CAP`CZw{(UC
zyz4SCfp{eOB&~GOHms$gXw5KA2J{S!znRn5izKU{;IP18tuysKn|MkyZ|ChbebEUp
zVVL?}00qqg=l;b%v#b?omi38JZgtPmkD~%25I_r#D>(MI+EkKI(TWpHv#@R&EL2ym
zH0KYdUWax(tDr-myB4g2o#7Ny#Yu!&Ju7dK($h8R`v=z{nM0?FE=1T3rfw}2mz{1%
z_z`1{?Q*|I#cA{k)D=qEf>R@b=13wDJ(z$WXXtfOdiAL|hvyhof1{+CY>(i65-Ke`
z6usd`zkolsZfbWq2a<s2Ra}tyD7!j8SoXRY4_;c@HMywbk~HyGm41xSAy&y!2Dz+a
zOj`IVssIGWRd_K$o+8otM1VF|R3v2HO5R>HEX@p{3H1R4QBR}W>=fDV2ilWWH8~Yb
zsHsK;>AB|2moP{~f}%7gj$(dQx9B8R7{C$gi0M^{$tS_wP%)3!Xn036OEUTy!u(&Q
zRB%(E<q6)&e7cldo-lNCaoo1^HfJZDFWEU=4gq_1-<{Aay#&;RW$E^qsTB$mfk)mH
z=palt?<~;}kXZTUriRx8pLLYtd<(w4u?Glz%?}q;K7Ec-!BhNJD+YKPhbYyd0ngB?
z(Xn!o^q>qReq>-jb-%|Nk8B~7+(cW-eW{Gc-K~9to{(n?r#^wNjQb%^W0VGiUUxsm
zPeb0IuWwKZDOH2_LyDW$-Hq`roc&n3yd6>+&pSe369cI-@>C2~6~k2Aq~e9DVw8&1
zL%i6tg_nB2AS5P9fLtD~F0Kx)FxQDPLS;0U(X@@Gxd*uVXd6MkuRXfw6G30dyYtzf
z*?Vr$+Rcwau|by#J@2sOk{E@g)RPcNNsyGZl8$y9MwC(<&FIGww)#<w;uxlJ9BH&+
zffgDeEOPEG!mx1)CBk|O5xh&!_c*Q}aDB-LU-4hF$wB-E=kYxT@B`!i!qa}kMW-~^
zE0iON6!9qd6_c1^s`a#*W^5O&e#XnV&f)~I&GS<vA&N3)Xy-)_KF2HE^%3bunB}h0
z;Foj87_vJ)bh-t&x{1u(V|X?)4>7m%UEo@56QiV8nJUARq0mObQxyg%c&oxN1z$y&
yyN}EU&u>78Tr7~SPGVU=j2ZUxJ%AC8{X&fvbP<aSx18teWDk&6LOWM>q~$M9B*ljS

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/blocks/SplitterBlock.class b/target/classes/net/persei/dionysus/blocks/SplitterBlock.class
new file mode 100644
index 0000000000000000000000000000000000000000..801dc5d9193bd82c84ff9f7cfde7322ff76a21b8
GIT binary patch
literal 1550
zcma)6TT|0e5dOAJo6<&sf+$k7C~8|T@q#y^peQO@@d8#seF*ItJQ~tYk}~-2Z*WFu
zeDH}EUvvZpopF5jC-`I3JpnJ3nd(Dwa`x=*xBKmP^5xryPXLbKp^gY4=Ze6r3C|bO
ztjMbS)UW&Ij8iQ?@y&^vBZEMABWkNdBV?O+hhBvE8R^Pkh@j=h@+Dp_R4XEhC|V4}
zkR(KN`BDoAhJj7kOo%zQD||v*@v%K`oAp3CW>NZqrK63ovk79619hYcTf<1sGiy!+
zo^)qN>e8tQFM&=%%2#b<6-qXVc66yawi34F)&Tzqv+^b7(QRNmdbkz4RugW8kl|J~
zIIm+^Dx%lG4(uc(g6diUgwEW?5cX|FR|>n(uVXi1b7RK__Fyj)WLFrop}ZS2k3~7K
z^3w_A2%8!Pqqr;>*pCBDwrkG`LV827RtpZ{unv>Z--OX{hLcZg!eD_MCA43!JAte@
zVnLCrWI)(k{GS92NEk41T&2+hPDyAjN>_~6=VpXAY0o%eq1CeOlx$C`{kl;L9!b_i
zp&3pC0~Uc?e#ZEbET}nqR+b5)xn>zI+JS8~b5QDH#tF&Mg|esxd^vm_=LsFZ)%NQ|
z&GdqSix_1QNWL?6Q1u91KSdC#dTiZprEnQzI<D}fek<VTse!Awrba0ig1=?7t^*~b
z>juVggGDOc`RWtqvj5-h=BE|%Ed#ePLC_!B{&)z&SCadTNw-#K$i8N*gtT#W>N@?y
zH6)Pb?5W#L3_uQ(IZ>^9WpPP{<8K(_A;ksyST|ArK>-o|iXqN#op;aqOWDsAR*;CE
zUBte^d!#<1b?PJ9r_voO*pgYswq;~ikX=Pz1b3fBDAV)$``1Ex-xBhLcR09&V{gOE
zC-}W1%o~TsYYP%6@Ol(UoI(o2FmRH6vTK-ZJIy;r#~>`OD2@X-!(Xb#vl!xam`^p{
zoeQ(RVoRJYmNulyT*U}sFt&(Y-LX|%B78>cpw_MJUq<l-QoS#rYm3mLL+bb@;pO+Q
zy>B=?0##@i(*U&bt{oYqVe)z!one6k;hFWTKns(&!(}iuO1R505%#@@DQ+Z#4otI6
Km3cqR{@@1y?S5?l

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/controlroom/ControlRoom$ControlRoomPanel.class b/target/classes/net/persei/dionysus/controlroom/ControlRoom$ControlRoomPanel.class
new file mode 100644
index 0000000000000000000000000000000000000000..6af9a0edb2d1ba4243cba8fe2a6349ba2b0d8f4e
GIT binary patch
literal 1554
zcmb7E%Tg0T6g{1U41@s!Xb==diI@j4LGhUwg&>$1ElVU-E{D(sqm!A`^hCt9pWqL;
za;>GHF8ly@uKf>}>g~ycpjnv3^z`lSd+xdSp6+kIzI+9+fPw-aL&oB+R^^W1hPGwc
z)}E*dt!!JaW1Eg`SF~Jx{)pz$w)sQd;--QC!^l(px&A^EyN0!`6})wZu;7lNn<WA!
z(2e{G11m5L5Q1=Z%Pr|<jrUZ341RwS-I!+xx;uu5rWodmT@Xr>W5%!yH_MQUb>$f^
zF$8k<7ViVGRS`me2!4#HP%+BjkI4f=MZ@9`YL!jyJk~c&PRSPSGNq+ca%49a1Cl&L
zwi^Qf)RJ-;tm=m4=Ilz<wz%aoL}Eo*Tut9~wKYet?igi}j+Z3SlPXSOoG2dk5q&s~
zDFtT;t>v1tP1{j%7UvjxmWxZddzA7avbUWMA&MCV=NX1uj?I`VE+EFxD>$(uEQZlG
zW_5o_D}h-BNrq$>JybCV5<stBE_2~YpwML}JC=Q&yR|AMmBK{@3k>6(D0zoeT*4wr
zbDO()lG3tim!DBLM`H1MiE6H4YDGi1>3&?nH3e6jwQcRFxQ-j7Ct<uKjgWToB=>Eq
z(qWOCrKC28q+*+48hvO%(LOWiBZSCNt?gBtdQ1OBEYq<9n_eQC%!zKI7cZS9c&oee
zcEtYQ2f`C8!yS361}O7&yXKVnsv)mZxa~EWmy%;p^OnV(oT&@JsRivPymtjtbXooM
zdigMc9t6o!JgYYxmN%H@e%hm0v@=N7B3VBAhZ4z;7)l&q_?>tD7>&{!n8tA$Rc{_b
z1Y=|ca025EgxBOBptVFId4P%Jdra<QI`IKRpAg@NcHf_Ui{L9io1FcO%M5RR|CAB@
zkP#xp5tyZMjv~wxb_#J)n~a#Kqc$Q+JB<v*9K$GXB1=)n5ymatCafhoFB#VNmf;Ia
jJJ(=1LuX}8f|B7%=lo<1d|36yHQc3th`bp^&BONxPI#8*

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/controlroom/ControlRoom.class b/target/classes/net/persei/dionysus/controlroom/ControlRoom.class
new file mode 100644
index 0000000000000000000000000000000000000000..2a4127f56925c25d4014d23e0605f06d9d2c1fb1
GIT binary patch
literal 1193
zcmbtU-A>d{5dNn72Wy3b$j^cZD@eBpMO3(eaN!aX$VQE56TLeuN3ALCrl%Es0xx_6
zpF$H^5>34F%D3>&7x30Nr|boZiwUtw&zUnbo%!aQIsN|o^H%^jv08#bm=9&*wq&fN
z@9z6i_(rA5ZAM`dM?oA#2X6gDe#mkOdBWgJ@k+dQ)uA6gcXzg8aUcnWmI!4)*l3(1
z+{~%a5A^qI97xF|Z4t)12HMp|_Og_WeGzyJn;}2m-Xzct;UWiAi3k%<1gR|S{aSDR
zc>nDkp}6jcezHNBwEq#e<`MGsXkV6*!=Q;iTq5M`n%4`$WfLXzlvx@vF^VxlFGIZ>
zrQyCJl<aMOYM!=_o0z~A!YJD}<uj26Nj->^yw5C)gz<6~yW@M+#1y6pW%l)a<?jVd
zX5M~U^GdizSpOe3%cx>jS8<&XcCY)4KCg8p=?v$;yLdvFZK8mpCd4r@j~j$OE>gE#
zhKX)BGif*UFuCF|$;M3hp^Vpb8~Ph8-b)YmWc)~EqzpEqCU;zL-}&58=93pbv%hd2
zygWWVqS=&6%`6di&PPnGYo^`KSeAFAG;Yc*Uw6^crSc`x7iUqINierVF0dX5r6j{X
z?UBttrkSlAU(Os1O&&{zo;uzu=!NF;LZ&lW&wQevSBo`o+1ucK)j7t1Gk=63$6B_Q
z2Xa3La#L*#JH<9CPQHyv=L@P&96H9#5#}7{6Xx2eeawO`@LJ81jUtaRPFTSR#(9`0
z7}z8hc~n<eT4cZBlXP&g#3xRi!6d7P|0~NKP_w)f+X|dz=mQG|bc$l8w6ZW7vw>UL
PdK-6m*ELr8U4iij|GPPA

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/exceptions/DataValueNotAvailableException.class b/target/classes/net/persei/dionysus/exceptions/DataValueNotAvailableException.class
new file mode 100644
index 0000000000000000000000000000000000000000..065ce0ab4815ce2e171e4d443bee7eb3705cc9c7
GIT binary patch
literal 444
zcmbtQJx{|h6ug%v4Qf+b3M}0a3m}BW(1|ah7Nnx63y|GSEiejB6+0FDEG8rdegHoT
z@e%<e3(NW4d-lEaeSE&X131KH2#;`LloJb8Sf#~W=jPd#R;Z^`EgUl|#?r||W~G|u
z?tCeACTE$t_?d_B3F{AXDMcpDo%kIPdR7%$W(iBP(CuVQpesUW#HvmjSBnP2!Nl8-
zGd9vZ)<(NiLStt)A^4+wu3BhdH9`w*LO0e%P0PobDsCzdgnpc-yg>3A=HE@<-D^uY
zi~senBSPysFN;)N>T1>Y-!U9i31ACso}(oU5TMCt$jrkESFDFNW5gX%b0FAzMdziy
Y(q*h3fCYMtQC$aEL!TK(%;;g`3%h!8zyJUM

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/exceptions/LibrariesNotFoundException.class b/target/classes/net/persei/dionysus/exceptions/LibrariesNotFoundException.class
new file mode 100644
index 0000000000000000000000000000000000000000..2a95a296aed02019d41d3c28932cb6d9ed970318
GIT binary patch
literal 432
zcmbVIyG{c^3>+tS3Ce?n01XYI1B$FDQ4mca66ll$NWV!eSaj?~w|fD8i3%#D6np^R
zfhhR|gzp4&G&Hjwdp-8}^>gt8U=Qn6lnDEly_#|A*r=&V?7hpJ;=2jYyfCLCGfs7C
z*bNguNHRM;{;5?F5LU1CT&q~yOZ8hIv>m5L$0Lyyk&BZf0-X|?eNpt<`jL(^4&QGd
z7H{2;M?&SmSmO@~<?WpjA?PPluAz+O25P7iT9L6l%x=b<p6hYUgie%9WPogz^Y3Kf
zuZ$z~qJMkp5o%{imQHwJ@-dr#+wbPiu?1OL&Pmunh>E;bVI?d{BwDBoHYB484ureU
cXg(ERT7r24M4&C$DB=(+=m?Y33YM_;1!6#PhyVZp

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/exceptions/MalformedBlockConditionException.class b/target/classes/net/persei/dionysus/exceptions/MalformedBlockConditionException.class
new file mode 100644
index 0000000000000000000000000000000000000000..afb1f7fe40565225a0b7df6e6e3dfe29f1736dad
GIT binary patch
literal 450
zcmbtQO)mpc6g{`?w9*f)Vq+r~5-hw}R|rKy$_CxP&RjgE?=|yggtf%ZkFk=7_yK-~
zy}uytG}v0$oO{pxI5+paeLlYeSi@`u1;VD~RE;?CY*b{Nz4e(_d=v6073S5Uj?Y{&
z<Y+r~;Z@h!$mEUPpNR@egy~CttyQe;x%zDoTAmZ5<GzT?#_9eJfer`_5%H<EX<x?~
z2lo&2cklM)gHT>K)}$MR;?i=TQ0lsft0-c!jw)(|X3tnY%7z0@PV^vVLc8ZeIiTf?
z@b6+Ny)d4z)%)jX9YXckWl6|;CO@|LmldnI3s`_WAO;iW5TGovBCLQ3$wUz~!Maq`
hm;=Ge6B>`>k)~k201;>j*2j5(DYS)&&4LBYd;!p>ck}=N

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/exceptions/MalformedSetupFileException.class b/target/classes/net/persei/dionysus/exceptions/MalformedSetupFileException.class
new file mode 100644
index 0000000000000000000000000000000000000000..f9e949672ec0ec3639055aeea6b782b2c85ce58e
GIT binary patch
literal 435
zcmbVIF;2rk5S(@51UU`~0U9cx0t!yF5YYsXK!GNZ{$ek1$gwT^jNma8@B<o<D0l$8
zfv+Ie7En^q%<b&n&ECx0=gTXAEi5+S5Vm8sD&;I^qe7F!w|S8(z6m(B!g6)2qw^%2
zayVjJqz5MA{hwhIb;A6WzSb(z@rC*w5V|>MMn_}O6_vBYJpvsO+5?faI<{jS73_Yz
z)7{g<>OG;+H?gt1gxcErm{1=iA$zD{)`y1{p))iwpA^#xXQz4+F`+k10$HGCjqvYg
z-CmlU&>#Na)DFQLB}Eo+>6NhjM*y3pcdS6ZEr}AA;G!XCQ<#GpsYDDdL0>wm;()vH
cjP_%7r6X8AfCzL2{i=2`hn_GASJ1)27xsa1l>h($

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/exceptions/UnexpectedDataTypeException.class b/target/classes/net/persei/dionysus/exceptions/UnexpectedDataTypeException.class
new file mode 100644
index 0000000000000000000000000000000000000000..f8816adfa09ceb9c928bd82cf61b5af3a44b5a84
GIT binary patch
literal 646
zcmbVJO-~b16g{_}v`i_sfP#|1#<V4IqDv)i0283W1<?JYy{XUC*JkFG&?Wy!6OD-r
ze}KQi#D8Kq^8{RISddB1yPxOWd*{dRZ{Gnt$9fq#!Aqw;o@kP)jR$t@X6ZDI^`fs6
zPcMy6onB0|?{%<iyg8XobnhlvMnTYgZ_Z6TGHw{(CIsaHiw|`sXmtM;9Q(w&;VZ#n
zs);qD9%U(Vy1y%s13_(virzTiGoz^%U$~!#m!)4%1=XSYOg=C!wc7vVEbNR2S^>!;
z6j2h?yVmK^^uw7ZC+2LV*(~EeRSmW2Uk3~RolOPX-TNPc8<n=Lv;MVUx%KaG?Oqjm
zJc_W4RYAVh?y(^a$KY<q<7v{@H#VDa<BoGb%MOW6ZkXr)%kkrywAN6@9HW&Gtuii%
zP$Mod67v<l#m;BcKZcSA#8L>(p+P(PQ-CIx=y3(C5VPjDK?bOIzT#m=zR=hrd}1nx
gjHZDCah_PDe#E9)pj=^|ZP%2UwH71=k3;X1D^K2(?f?J)

literal 0
HcmV?d00001

diff --git a/target/classes/net/persei/dionysus/exceptions/WhatTheFuckException.class b/target/classes/net/persei/dionysus/exceptions/WhatTheFuckException.class
new file mode 100644
index 0000000000000000000000000000000000000000..01273eff638aad0125e3ceaaf354ae8b06fbcf6c
GIT binary patch
literal 414
zcmbVIyH3ME5S&fy80AfX0y;W~1Sf=`0nr2^fh-z=sV~k79~e8b&j>y%6%qv>Ku^hM
z&>}V#P*Ks$?d;vo-0bV;^9z6-tazvpb`!R0%301vO-!0R=0&dfA>^qQmaD5s+fl^B
zBD_8M>3VPoOE>ynt5_%3>i2@s%{enV4n$DKFHesNbVg_mM9b>L20AX-egD{+?Z5Tg
zgxaA=j6EV$H#P%;Ge{>~M-}ZR>Sz!;zDfAJxEpge(&Ly3JwFY_K#Ps=@1|oTlN0v*
zf227e)GyK^3wdbf2CIKX-kzt$I^?6WJi;1W)a3MpRj?qHsGuR(l#VJn;P#);nw3vF
Xg7X20Kv%F?)-D#&6DI2vtYG;Ie<NsA

literal 0
HcmV?d00001