// Path: src/main/java/info/deskchan/gui_javafx/Main.java
// public class Main implements Plugin {
// 	
// 	private static Main instance;
// 	private PluginProxyInterface pluginProxy;
// 	private Semaphore appInitSem = new Semaphore(0);
// 
// 	@Override
// 	public boolean initialize(PluginProxyInterface pluginProxy) {
// 		this.pluginProxy = pluginProxy;
// 		instance = this;
// 
// 		getProperties().load();
// 
// 		pluginProxy.setResourceBundle("info/deskchan/gui_javafx/strings");
// 		pluginProxy.setConfigField("name", pluginProxy.getString("plugin-name"));
// 		pluginProxy.getProperties().putIfHasNot("use-tray", true);
// 		pluginProxy.getProperties().putIfHasNot("skin.name", "illia");
// 		pluginProxy.getProperties().putIfHasNot("sprites-animation-delay", 20);
//         pluginProxy.getProperties().putIfHasNot("balloon.text-animation-delay", 50);
// 
// 		new Thread(() -> {
// 			try {
// 				App.run(PluginManager.getInstance().getArgs());
// 			} catch (NoClassDefFoundError e){
// 				pluginProxy.log("WARNING! JavaFX is not installed. GUI plugin is now closing. Please, install JavaFX.");
// 				appInitSem.release();
// 				instance = null;
// 			}
// 		}).start();
// 		try {
// 			appInitSem.acquire();
// 		} catch (InterruptedException e) {
// 			log(e);
// 		}
// 
// 		return instance != null;
// 	}
// 	
// 	@Override
// 	public void unload() {
// 		synchronized (this) {
// 			getProperties().save();
// 		}
// 
// 		if (SystemUtils.IS_OS_WINDOWS) {
// 			MouseEventNotificator.disableHooks();
// 		}
// 		try {
// 			Platform.exit();
// 		} catch (Exception e){
// 			log(e);
// 		}
// 	}
// 	
// 	public static Main getInstance() {
// 		return instance;
// 	}
// 
// 	public static PluginProxyInterface getPluginProxy() { return instance.pluginProxy; }
// 	
// 	Semaphore getAppInitSem() {
// 		return appInitSem;
// 	}
// 
// 	public void quit() {
// 		pluginProxy.sendMessage("core:quit", null);
// 	}
// 
// 	public static void log(String text) {
// 		getPluginProxy().log(text);
// 	}
// 
// 	public static void log(Throwable e) {
// 		getPluginProxy().log(e);
// 	}
// 
// 	public static String getString(String text){
// 		return getPluginProxy().getString(text);
// 	}
// 
// 	public static synchronized PluginProperties getProperties() {
// 		return getPluginProxy().getProperties();
// 	}
// 
// 	public static void runLater(Runnable runnable) {
// 		PlatformImpl.runLater(new Runnable() {
// 			@Override
// 			public void run() {
// 				try {
// 					runnable.run();
// 				} catch (Throwable e){
// 					getPluginProxy().log(e);
// 				}
// 			}
// 		});
// 	}
// 
// }


import info.deskchan.core.Path;
import info.deskchan.gui_javafx.Main;
import info.deskchan.gui_javafx.panes.sprite_drawers.SVGSprite;
import info.deskchan.gui_javafx.panes.sprite_drawers.Sprite;
import javafx.geometry.Point2D;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;
package info.deskchan.gui_javafx.skins;



class ImageSetSkin implements Skin {
	private final String[][] replacing = {
			{"smile", "happy", "laugh", "love", "bounty"},
			{"vulgar", "confident", "excitement", "grin"},
			{"angry", "serious", "rage", "cry", "sad"},
			{"sceptic", "facepalm", "despair", "disgusted"},
			{"shy", "sorry", "tired"},
			{"scared", "shocked", "tired", "surprised"},
			{"love", "bounty"},
			{"waiting", "normal"},
			{"mad", "grin", "rage", "scared"}
	};
	protected final Path path;
	private final String skinName;
	private final Map<String, List<File>> images = new HashMap<>();
	private final Path propertiesPath;
	private final Properties properties = new Properties();
	
	ImageSetSkin(Path path) {
		this.path = path;
		skinName = Skin.getSkinsPath().relativize(path);

// Path: src/main/java/info/deskchan/gui_javafx/Main.java
// public class Main implements Plugin {
// 	
// 	private static Main instance;
// 	private PluginProxyInterface pluginProxy;
// 	private Semaphore appInitSem = new Semaphore(0);
// 
// 	@Override
// 	public boolean initialize(PluginProxyInterface pluginProxy) {
// 		this.pluginProxy = pluginProxy;
// 		instance = this;
// 
// 		getProperties().load();
// 
// 		pluginProxy.setResourceBundle("info/deskchan/gui_javafx/strings");
// 		pluginProxy.setConfigField("name", pluginProxy.getString("plugin-name"));
// 		pluginProxy.getProperties().putIfHasNot("use-tray", true);
// 		pluginProxy.getProperties().putIfHasNot("skin.name", "illia");
// 		pluginProxy.getProperties().putIfHasNot("sprites-animation-delay", 20);
//         pluginProxy.getProperties().putIfHasNot("balloon.text-animation-delay", 50);
// 
// 		new Thread(() -> {
// 			try {
// 				App.run(PluginManager.getInstance().getArgs());
// 			} catch (NoClassDefFoundError e){
// 				pluginProxy.log("WARNING! JavaFX is not installed. GUI plugin is now closing. Please, install JavaFX.");
// 				appInitSem.release();
// 				instance = null;
// 			}
// 		}).start();
// 		try {
// 			appInitSem.acquire();
// 		} catch (InterruptedException e) {
// 			log(e);
// 		}
// 
// 		return instance != null;
// 	}
// 	
// 	@Override
// 	public void unload() {
// 		synchronized (this) {
// 			getProperties().save();
// 		}
// 
// 		if (SystemUtils.IS_OS_WINDOWS) {
// 			MouseEventNotificator.disableHooks();
// 		}
// 		try {
// 			Platform.exit();
// 		} catch (Exception e){
// 			log(e);
// 		}
// 	}
// 	
// 	public static Main getInstance() {
// 		return instance;
// 	}
// 
// 	public static PluginProxyInterface getPluginProxy() { return instance.pluginProxy; }
// 	
// 	Semaphore getAppInitSem() {
// 		return appInitSem;
// 	}
// 
// 	public void quit() {
// 		pluginProxy.sendMessage("core:quit", null);
// 	}
// 
// 	public static void log(String text) {
// 		getPluginProxy().log(text);
// 	}
// 
// 	public static void log(Throwable e) {
// 		getPluginProxy().log(e);
// 	}
// 
// 	public static String getString(String text){
// 		return getPluginProxy().getString(text);
// 	}
// 
// 	public static synchronized PluginProperties getProperties() {
// 		return getPluginProxy().getProperties();
// 	}
// 
// 	public static void runLater(Runnable runnable) {
// 		PlatformImpl.runLater(new Runnable() {
// 			@Override
// 			public void run() {
// 				try {
// 					runnable.run();
// 				} catch (Throwable e){
// 					getPluginProxy().log(e);
// 				}
// 			}
// 		});
// 	}
// 
// }


// Path: src/main/java/info/deskchan/gui_javafx/skins/ImageSetSkin.java
import info.deskchan.core.Path;
import info.deskchan.gui_javafx.Main;
import info.deskchan.gui_javafx.panes.sprite_drawers.SVGSprite;
import info.deskchan.gui_javafx.panes.sprite_drawers.Sprite;
import javafx.geometry.Point2D;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.ThreadLocalRandom;

package info.deskchan.gui_javafx.skins;



class ImageSetSkin implements Skin {
	private final String[][] replacing = {
			{"smile", "happy", "laugh", "love", "bounty"},
			{"vulgar", "confident", "excitement", "grin"},
			{"angry", "serious", "rage", "cry", "sad"},
			{"sceptic", "facepalm", "despair", "disgusted"},
			{"shy", "sorry", "tired"},
			{"scared", "shocked", "tired", "surprised"},
			{"love", "bounty"},
			{"waiting", "normal"},
			{"mad", "grin", "rage", "scared"}
	};
	protected final Path path;
	private final String skinName;
	private final Map<String, List<File>> images = new HashMap<>();
	private final Path propertiesPath;
	private final Properties properties = new Properties();
	
	ImageSetSkin(Path path) {
		this.path = path;
		skinName = Skin.getSkinsPath().relativize(path);

		propertiesPath = Main.getPluginProxy().getDataDirPath().resolve(