// Path: src/main/java/de/flapdoodle/embed/process/config/ExecutableProcessConfig.java
// public interface ExecutableProcessConfig {
// 
// 	Version version();
// 
// 	SupportConfig supportConfig();
// 
// 	OptionalLong stopTimeoutInMillis();
// }
// 
// Path: src/main/java/de/flapdoodle/embed/process/config/RuntimeConfig.java
// @Value.Immutable
// public interface RuntimeConfig {
// 
// 	ProcessOutput processOutput();
// 
// 	@Default
// 	default CommandLinePostProcessor commandLinePostProcessor() {
// 		return new CommandLinePostProcessor.Noop();
// 	}
// 	
// 	IArtifactStore artifactStore();
// 
// 	@Default
// 	default boolean isDaemonProcess() {
// 		return false;
// 	}
// 	
// 	static ImmutableRuntimeConfig.Builder builder() {
// 		return ImmutableRuntimeConfig.builder();
// 	}
// 
// 	/**
// 	 * some api hacks to reenable spring boot support until they fix their api usage
// 	 */
// 	static interface Builder {
// 		ImmutableRuntimeConfig.Builder processOutput(ProcessOutput processOutput);
// 
// 		default ImmutableRuntimeConfig.Builder processOutput(de.flapdoodle.embed.process.config.io.ProcessOutput processOutput) {
// 			return processOutput((ProcessOutput) processOutput);
// 		}
// 	}
// }
// 
// Path: src/main/java/de/flapdoodle/embed/process/distribution/Distribution.java
// @Value.Immutable
// public abstract class Distribution {
// 
// 	@Parameter
// 	public abstract Version version();
// 
// 	@Parameter
// 	public abstract Platform platform();
// 
// 	@Override
// 	public String toString() {
// 		return "" + version() + ":" + platform();
// 	}
// 
// 	public static Distribution detectFor(Version version) {
// 		return of(version, Platform.detect());
// 	}
// 
// 	public static Distribution of(Version version, Platform platform) {
// 		return ImmutableDistribution.of(version, platform);
// 	}
// }
// 
// Path: src/main/java/de/flapdoodle/embed/process/extract/ExtractedFileSet.java
// @Value.Immutable
// @Style(strictBuilder=true)
// public abstract class ExtractedFileSet {
// 
// 	@Parameter
// 	public abstract File baseDir();
// 	
// 	public abstract File executable();
// 	
// 	public abstract Set<File> libraryFiles();
// 
// 	public abstract boolean baseDirIsGenerated();
// 
// 	public static ImmutableExtractedFileSet.Builder builder(File baseDir) {
// 		return ImmutableExtractedFileSet.builder(baseDir);
// 	}
// }


import de.flapdoodle.embed.process.config.ExecutableProcessConfig;
import de.flapdoodle.embed.process.config.RuntimeConfig;
import de.flapdoodle.embed.process.distribution.Distribution;
import de.flapdoodle.embed.process.extract.ExtractedFileSet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
	}

	/**
	 *
	 */
	class JobKiller implements Runnable {

		@Override
		public void run() {
			stop();
		}
	}

	public ExtractedFileSet getFile() {
		return executable;
	}

	public synchronized P start() throws IOException {
		if (stopped) throw new RuntimeException("Already stopped");

		P start = start(distribution, config, runtimeConfig);
		logger.info("start {}", config);
		addStopable(start);
		return start;
	}

	private void addStopable(P start) {
		stopables.add(start);
	}

// Path: src/main/java/de/flapdoodle/embed/process/config/ExecutableProcessConfig.java
// public interface ExecutableProcessConfig {
// 
// 	Version version();
// 
// 	SupportConfig supportConfig();
// 
// 	OptionalLong stopTimeoutInMillis();
// }
// 
// Path: src/main/java/de/flapdoodle/embed/process/config/RuntimeConfig.java
// @Value.Immutable
// public interface RuntimeConfig {
// 
// 	ProcessOutput processOutput();
// 
// 	@Default
// 	default CommandLinePostProcessor commandLinePostProcessor() {
// 		return new CommandLinePostProcessor.Noop();
// 	}
// 	
// 	IArtifactStore artifactStore();
// 
// 	@Default
// 	default boolean isDaemonProcess() {
// 		return false;
// 	}
// 	
// 	static ImmutableRuntimeConfig.Builder builder() {
// 		return ImmutableRuntimeConfig.builder();
// 	}
// 
// 	/**
// 	 * some api hacks to reenable spring boot support until they fix their api usage
// 	 */
// 	static interface Builder {
// 		ImmutableRuntimeConfig.Builder processOutput(ProcessOutput processOutput);
// 
// 		default ImmutableRuntimeConfig.Builder processOutput(de.flapdoodle.embed.process.config.io.ProcessOutput processOutput) {
// 			return processOutput((ProcessOutput) processOutput);
// 		}
// 	}
// }
// 
// Path: src/main/java/de/flapdoodle/embed/process/distribution/Distribution.java
// @Value.Immutable
// public abstract class Distribution {
// 
// 	@Parameter
// 	public abstract Version version();
// 
// 	@Parameter
// 	public abstract Platform platform();
// 
// 	@Override
// 	public String toString() {
// 		return "" + version() + ":" + platform();
// 	}
// 
// 	public static Distribution detectFor(Version version) {
// 		return of(version, Platform.detect());
// 	}
// 
// 	public static Distribution of(Version version, Platform platform) {
// 		return ImmutableDistribution.of(version, platform);
// 	}
// }
// 
// Path: src/main/java/de/flapdoodle/embed/process/extract/ExtractedFileSet.java
// @Value.Immutable
// @Style(strictBuilder=true)
// public abstract class ExtractedFileSet {
// 
// 	@Parameter
// 	public abstract File baseDir();
// 	
// 	public abstract File executable();
// 	
// 	public abstract Set<File> libraryFiles();
// 
// 	public abstract boolean baseDirIsGenerated();
// 
// 	public static ImmutableExtractedFileSet.Builder builder(File baseDir) {
// 		return ImmutableExtractedFileSet.builder(baseDir);
// 	}
// }


// Path: src/main/java/de/flapdoodle/embed/process/runtime/Executable.java
import de.flapdoodle.embed.process.config.ExecutableProcessConfig;
import de.flapdoodle.embed.process.config.RuntimeConfig;
import de.flapdoodle.embed.process.distribution.Distribution;
import de.flapdoodle.embed.process.extract.ExtractedFileSet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

	}

	/**
	 *
	 */
	class JobKiller implements Runnable {

		@Override
		public void run() {
			stop();
		}
	}

	public ExtractedFileSet getFile() {
		return executable;
	}

	public synchronized P start() throws IOException {
		if (stopped) throw new RuntimeException("Already stopped");

		P start = start(distribution, config, runtimeConfig);
		logger.info("start {}", config);
		addStopable(start);
		return start;
	}

	private void addStopable(P start) {
		stopables.add(start);
	}

	protected abstract P start(Distribution distribution, T config, RuntimeConfig runtime) throws IOException;