diff --git a/src/MineCase.Core/Registry/IRegistry.cs b/src/MineCase.Core/Registry/IRegistry.cs new file mode 100644 index 00000000..1b1bc741 --- /dev/null +++ b/src/MineCase.Core/Registry/IRegistry.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Registry +{ + public interface IRegistry + { + TV GetObject(TK name); + + // Register an object on this registry. + void PutObject(TK key, TV value); + } +} diff --git a/src/MineCase.Core/Registry/RegistryNamespaced.cs b/src/MineCase.Core/Registry/RegistryNamespaced.cs new file mode 100644 index 00000000..0b0317b5 --- /dev/null +++ b/src/MineCase.Core/Registry/RegistryNamespaced.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Registry +{ + public class RegistryNamespaced : RegistrySimple + { + /** The backing store that maps Integers to objects. */ + protected readonly Dictionary underlyingIntegerMap = new Dictionary(); + + protected readonly Dictionary underlyingInversedIntegerMap = new Dictionary(); + + /** A BiMap of objects (key) to their names (value). */ + protected readonly Dictionary inverseObjectRegistry; + + public RegistryNamespaced() + { + // this.inverseObjectRegistry = ((BiMap)this.registryObjects).inverse(); + } + + public void Register(int id, TK key, TV value) + { + underlyingIntegerMap.Add(id, value); + underlyingInversedIntegerMap.Add(value, id); + PutObject(key, value); + } + + public override TV GetObject(TK name) + { + return GetObject(name); + } + + /** + * Gets the name we use to identify the given object. + */ + public TK GetNameForObject(TV value) + { + return inverseObjectRegistry[value]; + } + + /** + * Does this registry contain an entry for the given key? + */ + public new bool ContainsKey(TK key) + { + return base.ContainsKey(key); + } + + /** + * Gets the integer ID we use to identify the given object. + */ + public int GetIDForObject(TV value) + { + return underlyingInversedIntegerMap[value]; + } + + /** + * Gets the object identified by the given ID. + */ + public TV GetObjectById(int id) + { + return underlyingIntegerMap[id]; + } + } +} diff --git a/src/MineCase.Core/Registry/RegistrySimple.cs b/src/MineCase.Core/Registry/RegistrySimple.cs new file mode 100644 index 00000000..f5bf443d --- /dev/null +++ b/src/MineCase.Core/Registry/RegistrySimple.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Registry +{ + public class RegistrySimple : IRegistry + { + /** Objects registered on this registry. */ + protected readonly Dictionary registryObjects; + private TV[] values; + + public RegistrySimple() + { + registryObjects = new Dictionary(); + } + + public virtual TV GetObject( TK name) + { + return this.registryObjects[name]; + } + + /** + * Register an object on this registry. + */ + public void PutObject(TK key, TV value) + { + if (key == null) + { + throw new ArgumentNullException(); + } + + if (value == null) + { + throw new ArgumentNullException(); + } + + this.values = null; + + if (this.registryObjects.ContainsKey(key)) + { + // LOGGER.debug("Adding duplicate key '{}' to registry", key); + } + + registryObjects.Add(key, value); + } + + /** + * Gets all the keys recognized by this registry. + */ + public Dictionary.KeyCollection GetKeys() + { + return registryObjects.Keys; + } + + public TV GetRandomObject(Random random) + { + if (values == null) + { + var collection = registryObjects.Values; + + if (collection.Count == 0) + { + return default(TV); + } + + values = new TV[collection.Count]; + collection.CopyTo(values, 0); + } + + return values[random.Next(values.Length)]; + } + + /** + * Does this registry contain an entry for the given key? + */ + public bool ContainsKey(TK key) + { + return registryObjects.ContainsKey(key); + } + } +} diff --git a/src/MineCase.Mod/MineCase.Mod.csproj b/src/MineCase.Mod/MineCase.Mod.csproj new file mode 100644 index 00000000..5766db61 --- /dev/null +++ b/src/MineCase.Mod/MineCase.Mod.csproj @@ -0,0 +1,7 @@ + + + + netcoreapp2.0 + + + diff --git a/src/MineCase.Mod/MinecraftMod.cs b/src/MineCase.Mod/MinecraftMod.cs new file mode 100644 index 00000000..07384e03 --- /dev/null +++ b/src/MineCase.Mod/MinecraftMod.cs @@ -0,0 +1,30 @@ +using MineCase.Mod.common.eventhandler; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod +{ + public class MinecraftMod + { + /** + * The core Forge EventBusses, all events for Forge will be fired on these, + * you should use this to register all your listeners. + * This replaces every register*Handler() function in the old version of Forge. + * TERRAIN_GEN_BUS for terrain gen events + * ORE_GEN_BUS for ore gen events + * EVENT_BUS for everything else + */ + public static readonly EventBus EVENT_BUS = new EventBus(); + public static readonly EventBus TERRAIN_GEN_BUS = new EventBus(); + public static readonly EventBus ORE_GEN_BUS = new EventBus(); + // public static readonly string MC_VERSION = Loader.MC_VERSION; + + static MinecraftMod() + { + EVENT_BUS = new EventBus(); + TERRAIN_GEN_BUS = new EventBus(); + ORE_GEN_BUS = new EventBus(); + } + } +} diff --git a/src/MineCase.Mod/common/Loader.cs b/src/MineCase.Mod/common/Loader.cs new file mode 100644 index 00000000..fc2bb5d9 --- /dev/null +++ b/src/MineCase.Mod/common/Loader.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod.common +{ + public class Loader + { + // public static readonly String MC_VERSION = net.minecraftforge.common.ForgeVersion.mcVersion; + /** + * The singleton instance + */ + private static Loader instance; + /** + * Build information for tracking purposes. + */ + private static String major; + private static String minor; + private static String rev; + private static String build; + private static String mccversion; + private static String mcpversion; + + /** + * The class loader we load the mods into. + */ + private ModClassLoader modClassLoader; + /** + * The sorted list of mods. + */ + private List mods; + /** + * A named list of mods + */ + private Dictionary namedMods; + /** + * A reverse dependency graph for mods + */ + private ListMultimap reverseDependencies; + /** + * The canonical configuration directory + */ + private File canonicalConfigDir; + private File canonicalModsDir; + private LoadController modController; + private MinecraftDummyContainer minecraft; + private MCPDummyContainer mcp; + + private static File minecraftDir; + private static List injectedContainers; + private ImmutableMap fmlBrandingProperties; + private File forcedModFile; + private ModDiscoverer discoverer; + private ProgressBar progressBar; + + public static Loader GetInstance() + { + if (instance == null) + { + instance = new Loader(); + } + + return instance; + } + + public static void injectData(Object[] data) + { + major = (String)data[0]; + minor = (String)data[1]; + rev = (String)data[2]; + build = (String)data[3]; + mccversion = (String)data[4]; + mcpversion = (String)data[5]; + minecraftDir = (string)data[6]; + injectedContainers = (List)data[7]; + } + + private Loader() + { + modClassLoader = new ModClassLoader(getClass().getClassLoader()); + if (mccversion != null && !mccversion.equals(MC_VERSION)) + { + throw new LoaderException(String.Format("This version of FML is built for Minecraft %s, we have detected Minecraft %s in your minecraft jar file", mccversion, MC_VERSION)); + } + + minecraft = new MinecraftDummyContainer(MC_VERSION); + InputStream mcpModInputStream = getClass().getResourceAsStream("/mcpmod.info"); + try + { + mcp = new MCPDummyContainer(MetadataCollection.from(mcpModInputStream, "MCP").getMetadataForId("mcp", null)); + } + finally + { + IOUtils.closeQuietly(mcpModInputStream); + } + } + } +} diff --git a/src/MineCase.Mod/common/MobContainer.cs b/src/MineCase.Mod/common/MobContainer.cs new file mode 100644 index 00000000..e54557c5 --- /dev/null +++ b/src/MineCase.Mod/common/MobContainer.cs @@ -0,0 +1,134 @@ +using MineCase.Mod.common.eventhandler; +using MineCase.Mod.common.versioning; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace MineCase.Mod.common +{ + + + public abstract class ModContainer + { + public enum Disableable + { + YES, RESTART, NEVER, DEPENDENCIES + } + + /** + * The globally unique modid for this mod + */ + public abstract string GetModId(); + + /** + * A human readable name + */ + + public abstract string GetName(); + + /** + * A human readable version identifier + */ + public abstract string GetVersion(); + + /** + * The location on the file system which this mod came from + */ + public abstract string GetSource(); + + /** + * The metadata for this mod + */ + public abstract ModMetadata GetMetadata(); + + /** + * Attach this mod to it's metadata from the supplied metadata collection + */ + public abstract void BindMetadata(MetadataCollection mc); + + /** + * Set the enabled/disabled state of this mod + */ + public abstract void SetEnabledState(bool enabled); + + /** + * A list of the modids that this mod requires loaded prior to loading + */ + public abstract List GetRequirements(); + + /** + * A list of modids that should be loaded prior to this one. The special + * value * indicates to load after any other mod. + */ + public abstract List GetDependencies(); + + /** + * A list of modids that should be loaded after this one. The + * special value * indicates to load before any + * other mod. + */ + public abstract List GetDependants(); + + /** + * A representative string encapsulating the sorting preferences for this + * mod + */ + public abstract string GetSortingRules(); + + /** + * Register the event bus for the mod and the controller for error handling + * Returns if this bus was successfully registered - disabled mods and other + * mods that don't need real events should return false and avoid further + * processing + * + * @param bus + * @param controller + */ + public abstract bool RegisterBus(EventBus bus, LoadController controller); + + /** + * Does this mod match the supplied mod + * + * @param mod + */ + public abstract bool Matches(Object mod); + + /** + * Get the actual mod object + */ + public abstract Object GetMod(); + + public abstract ArtifactVersion GetProcessedVersion(); + + public abstract bool IsImmutable(); + + public abstract string GetDisplayVersion(); + + public abstract VersionRange AcceptableMinecraftVersionRange(); + + public abstract Certificate GetSigningCertificate(); + + public static readonly Dictionary EMPTY_PROPERTIES = ImmutableMap.of(); + + public abstract Dictionary GetCustomModProperties(); + + // public Class GetCustomResourcePackClass(); + + public abstract Dictionary GetSharedModDescriptor(); + + public abstract Disableable CanBeDisabled(); + + public abstract string GetGuiClassName(); + + public abstract List GetOwnedPackages(); + + public abstract bool ShouldLoadInEnvironment(); + + public abstract string GetUpdateUrl(); + + public abstract void SetClassVersion(int classVersion); + + public abstract int GetClassVersion(); + } +} diff --git a/src/MineCase.Mod/common/ModMetadata.cs b/src/MineCase.Mod/common/ModMetadata.cs new file mode 100644 index 00000000..12d84614 --- /dev/null +++ b/src/MineCase.Mod/common/ModMetadata.cs @@ -0,0 +1,66 @@ +using MineCase.Mod.common.versioning; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod.common +{ + public class ModMetadata + { + public string modId; + public string name; + public string description = ""; + + public string url = ""; + + //Never really used for anything and format is undefined. See updateJSON for replacement. + public string updateUrl = ""; + /** + * URL to update json file. Format is defined here: https://gist.github.com/LexManos/7aacb9aa991330523884 + */ + public string updateJSON = ""; + + public string logoFile = ""; + public string version = ""; + public List authorList = new List(); + public string credits = ""; + public string parent = ""; + public string[] screenshots; + + // this field is not for use in the json (不参与序列化) + public ModContainer parentMod; + // this field is not for use in the json (不参与序列化) + public List childMods = new List(); + + public bool useDependencyInformation; + public HashSet requiredMods = new HashSet(); + public List dependencies = new List(); + public List dependants = new List(); + // this field is not for use in the json (不参与序列化) + public bool autogenerated; + + public ModMetadata() + { + } + + public string GetChildModCountString() + { + return string.Format("%d child mod%s", childMods.Count, childMods.Count != 1 ? "s" : ""); + } + + public string GetAuthorList() + { + return Joiner.on(", ").join(authorList); + } + + public string GetChildModList() + { + return Joiner.on(", ").join(childMods.stream().map(ModContainer::getName).iterator()); + } + + public string PrintableSortingRules() + { + return ""; + } + } +} diff --git a/src/MineCase.Mod/common/eventhandler/Event.cs b/src/MineCase.Mod/common/eventhandler/Event.cs new file mode 100644 index 00000000..26db297b --- /dev/null +++ b/src/MineCase.Mod/common/eventhandler/Event.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod.common.eventhandler +{ + /** + * Base Event class that all other events are derived from + */ + public class Event + { + public enum Result + { + DENY, + DEFAULT, + ALLOW + } + + private bool _isCanceled = false; + private Result _result = Result.DEFAULT; + private static ListenerList _listeners = new ListenerList(); + private EventPriority _phase = null; + + public Event() + { + Setup(); + } + + /** + * Determine if this function is cancelable at all. + * @return If access to setCanceled should be allowed + * + * Note: + * Events with the Cancelable annotation will have this method automatically added to return true. + */ + public bool IsCancelable() + { + return false; + } + + /** + * Determine if this event is canceled and should stop executing. + * @return The current canceled state + */ + public bool IsCanceled() + { + return _isCanceled; + } + + /** + * Sets the cancel state of this event. Note, not all events are cancelable, and any attempt to + * invoke this method on an event that is not cancelable (as determined by {@link #isCancelable} + * will result in an {@link UnsupportedOperationException}. + * + * The functionality of setting the canceled state is defined on a per-event bases. + * + * @param cancel The new canceled value + */ + public void SetCanceled(bool cancel) + { + if (!IsCancelable()) + { + throw new InvalidOperationException( + "Attempted to call Event#setCanceled() on a non-cancelable event of type: " + + GetType().Name + ); + } + _isCanceled = cancel; + } + + /** + * Determines if this event expects a significant result value. + * + * Note: + * Events with the HasResult annotation will have this method automatically added to return true. + */ + public bool HasResult() + { + return false; + } + + /** + * Returns the value set as the result of this event + */ + public Result GetResult() + { + return _result; + } + + /** + * Sets the result value for this event, not all events can have a result set, and any attempt to + * set a result for a event that isn't expecting it will result in a IllegalArgumentException. + * + * The functionality of setting the result is defined on a per-event bases. + * + * @param value The new result + */ + public void SetResult(Result value) + { + _result = value; + } + + /** + * Called by the base constructor, this is used by ASM generated + * event classes to setup various functionality such as the listener list. + */ + protected void Setup() + { + } + + /** + * Returns a ListenerList object that contains all listeners + * that are registered to this event. + * + * @return Listener List + */ + public ListenerList GetListenerList() + { + return _listeners; + } + + public EventPriority GetPhase() + { + return _phase; + } + + public void SetPhase(EventPriority value) + { + if (value == null) + throw new ArgumentNullException(); + int prev = _phase == null ? -1 : (int)_phase.Values; + + if (prev < (uint)value.Values) + throw new ArgumentException( + string.Format("Attempted to set event phase to %s when already %s", + value.ToString(), + System.Enum.GetName(typeof(EventPriority.Priority), _phase.Values))); + _phase = value; + } + } +} diff --git a/src/MineCase.Mod/common/eventhandler/EventBus.cs b/src/MineCase.Mod/common/eventhandler/EventBus.cs new file mode 100644 index 00000000..afe76c24 --- /dev/null +++ b/src/MineCase.Mod/common/eventhandler/EventBus.cs @@ -0,0 +1,184 @@ +using MineCase.Mod.common.eventhandler; +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod.common.eventhandler +{ + public class EventBus + { + private static int maxID = 0; + + private Dictionary> _listeners = new Dictionary>(); + private Dictionary _listenerOwners; + private readonly int _busID = maxID++; + private IEventExceptionHandler _exceptionHandler; + + public EventBus() + { + ListenerList.Resize(_busID + 1); + _exceptionHandler = null; + } + + public EventBus(IEventExceptionHandler handler) + { + if (handler == null) + throw new ArgumentNullException(); + _exceptionHandler = handler; + } + + public void Register(Object target) + { + if (_listeners.ContainsKey(target)) + { + return; + } + + ModContainer activeModContainer = Loader.GetInstance().activeModContainer(); + if (activeModContainer == null) + { + // FMLLog.log.error("Unable to determine registrant mod for {}. This is a critical error and should be impossible", target, new Throwable()); + activeModContainer = Loader.GetInstance().GetMinecraftModContainer(); + } + _listenerOwners.Add(target, activeModContainer); + } + + /* + public void Register(Object target) + { + if (_listeners.ContainsKey(target)) + { + return; + } + + ModContainer activeModContainer = Loader.instance().activeModContainer(); + if (activeModContainer == null) + { + FMLLog.log.error("Unable to determine registrant mod for {}. This is a critical error and should be impossible", target, new Throwable()); + activeModContainer = Loader.instance().getMinecraftModContainer(); + } + listenerOwners.put(target, activeModContainer); + bool isStatic = target.getClass() == Class.class; + @SuppressWarnings("unchecked") + Set> supers = isStatic ? Sets.newHashSet((Class )target) : TypeToken.of(target.getClass()).getTypes().rawTypes(); + for (Method method : (isStatic? (Class) target : target.getClass()).getMethods()) + { + if (isStatic && !Modifier.isStatic(method.getModifiers())) + continue; + else if (!isStatic && Modifier.isStatic(method.getModifiers())) + continue; + + for (Class cls : supers) + { + try + { + Method real = cls.getDeclaredMethod(method.getName(), method.getParameterTypes()); + if (real.isAnnotationPresent(SubscribeEvent.class)) + { + Class[] parameterTypes = method.getParameterTypes(); + if (parameterTypes.length != 1) + { + throw new IllegalArgumentException( + "Method " + method + " has @SubscribeEvent annotation, but requires " + parameterTypes.length + + " arguments. Event handler methods must require a single argument." + ); + } + + Class eventType = parameterTypes[0]; + + if (!Event.class.isAssignableFrom(eventType)) + { + throw new IllegalArgumentException("Method " + method + " has @SubscribeEvent annotation, but takes a argument that is not an Event " + eventType); + } + + register(eventType, target, real, activeModContainer); + break; + } + } + catch (NoSuchMethodException e) + { + ; // Eat the error, this is not unexpected + } + } + } + } + + private void Register(Class eventType, Object target, Method method, final ModContainer owner) + { + try + { + Constructor ctr = eventType.getConstructor(); + ctr.setAccessible(true); + Event event = (Event)ctr.newInstance(); + final ASMEventHandler asm = new ASMEventHandler(target, method, owner, IGenericEvent.class.isAssignableFrom(eventType)); + + IEventListener listener = asm; + if (IContextSetter.class.isAssignableFrom(eventType)) + { + listener = new IEventListener() + { + @Override + public void invoke(Event event) + { + ModContainer old = Loader.instance().activeModContainer(); + Loader.instance().setActiveModContainer(owner); + ((IContextSetter)event).setModContainer(owner); + asm.invoke(event); + Loader.instance().setActiveModContainer(old); + } + }; + } + + event.getListenerList().register(busID, asm.getPriority(), listener); + + ArrayList others = listeners.computeIfAbsent(target, k -> new ArrayList<>()); + others.add(listener); + } + catch (Exception e) + { + FMLLog.log.error("Error registering event handler: {} {} {}", owner, eventType, method, e); + } + } + */ + + public void Unregister(Object obj) + { + _listeners.Remove(obj); + var list = _listeners.Values; + if (list == null) + return; + foreach (IEventListener listener in list) + { + ListenerList.UnregisterAll(_busID, listener); + } + } + + public bool Post(Event evnt) + { + IEventListener[] listeners = evnt.GetListenerList().GetListeners(_busID); + int index = 0; + try + { + for (; index < listeners.Length; index++) + { + listeners[index].Invoke(evnt); + } + } + catch (Exception e) + { + _exceptionHandler.handleException(this, evnt, listeners, index, e); + } + return (evnt.IsCancelable() ? evnt.IsCanceled() : false); + } + + public void HandleException(EventBus bus, Event evnt, IEventListener[] listeners, int index, Exception throwable) + { + // FMLLog.log.error("Exception caught during firing event {}:", event, throwable); + // FMLLog.log.error("Index: {} Listeners:", index); + for (int x = 0; x < listeners.Length; x++) + { + // FMLLog.log.error("{}: {}", x, listeners[x]); + } + } + } +} diff --git a/src/MineCase.Mod/common/eventhandler/EventPriority.cs b/src/MineCase.Mod/common/eventhandler/EventPriority.cs new file mode 100644 index 00000000..132d8ff8 --- /dev/null +++ b/src/MineCase.Mod/common/eventhandler/EventPriority.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod.common.eventhandler +{ + public class EventPriority : IEventListener + { + /*Priority of event listeners, listeners will be sorted with respect to this priority level. + * + * Note: + * Due to using a ArrayList in the ListenerList, + * these need to stay in a contiguous index starting at 0. {Default ordinal} + */ + public enum Priority : uint + { + HIGHEST, + HIGH, + NORMAL, + LOW, + LOWEST + } + + public Priority Values { get; set; } + + public void Invoke(Event evnt) + { + evnt.SetPhase(this); + } + } +} diff --git a/src/MineCase.Mod/common/eventhandler/IEventExceptionHandler.cs b/src/MineCase.Mod/common/eventhandler/IEventExceptionHandler.cs new file mode 100644 index 00000000..7b79857a --- /dev/null +++ b/src/MineCase.Mod/common/eventhandler/IEventExceptionHandler.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod.common.eventhandler +{ + public interface IEventExceptionHandler + { + /** + * Fired when a EventListener throws an exception for the specified event on the event bus. + * After this function returns, the original Throwable will be propagated upwards. + * + * @param bus The bus the event is being fired on + * @param event The event that is being fired + * @param listeners All listeners that are listening for this event, in order + * @param index Index for the current listener being fired. + * @param throwable The throwable being thrown + */ + void handleException(EventBus bus, Event evnt, IEventListener [] listeners, int index, Exception throwable); + } +} diff --git a/src/MineCase.Mod/common/eventhandler/IEventListener.cs b/src/MineCase.Mod/common/eventhandler/IEventListener.cs new file mode 100644 index 00000000..116224d8 --- /dev/null +++ b/src/MineCase.Mod/common/eventhandler/IEventListener.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod.common.eventhandler +{ + public interface IEventListener + { + void Invoke(Event evnt); + } +} diff --git a/src/MineCase.Mod/common/eventhandler/ListenerList.cs b/src/MineCase.Mod/common/eventhandler/ListenerList.cs new file mode 100644 index 00000000..448aa55a --- /dev/null +++ b/src/MineCase.Mod/common/eventhandler/ListenerList.cs @@ -0,0 +1,245 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod.common.eventhandler +{ + public class ListenerList + { + private static List allLists = new List(); + private static int maxSize = 0; + + private ListenerList _parent; + private ListenerListInst[] _lists; + + public ListenerList() + { + _lists = new ListenerListInst[0]; + } + + public ListenerList(ListenerList parent):this() + { + _parent = parent; + ResizeLists(maxSize); + } + + public static void Resize(int max) + { + if (max <= maxSize) + { + return; + } + foreach (ListenerList list in allLists) + { + list.ResizeLists(max); + } + maxSize = max; + } + + public void ResizeLists(int max) + { + if (_parent != null) + { + _parent.ResizeLists(max); + } + + if (_lists.Length >= max) + { + return; + } + + ListenerListInst[] newList = new ListenerListInst[max]; + int x = 0; + for (; x < _lists.Length; x++) + { + newList[x] = _lists[x]; + } + for (; x < max; x++) + { + if (_parent != null) + { + newList[x] = new ListenerListInst(_parent.GetInstance(x)); + } + else + { + newList[x] = new ListenerListInst(); + } + } + _lists = newList; + } + + public static void ClearBusID(int id) + { + foreach (ListenerList list in allLists) + { + list._lists[id].Dispose(); + } + } + + protected ListenerListInst GetInstance(int id) + { + return _lists[id]; + } + + public IEventListener[] GetListeners(int id) + { + return _lists[id].GetListeners(); + } + + public void Register(int id, EventPriority priority, IEventListener listener) + { + _lists[id].Register(priority, listener); + } + + public void Unregister(int id, IEventListener listener) + { + _lists[id].Unregister(listener); + } + + public static void UnregisterAll(int id, IEventListener listener) + { + foreach (ListenerList list in allLists) + { + list.Unregister(id, listener); + } + } + + public class ListenerListInst + { + private bool _rebuild = true; + private IEventListener[] _listeners; + private List> _priorities; + private ListenerListInst _parent; + private List _children; + + + public ListenerListInst() + { + int count = System.Enum.GetValues(typeof(EventPriority.Values)).Length; + _priorities = new List>(count); + + for (int x = 0; x < count; x++) + { + _priorities.Add(new List()); + } + } + + public void Dispose() + { + foreach (List listeners in _priorities) + { + listeners.Clear(); + } + _priorities.Clear(); + _parent = null; + _listeners = null; + if (_children != null) + _children.Clear(); + } + + public ListenerListInst(ListenerListInst parent) : this() + { + _parent = parent; + _parent.AddChild(this); + } + + /** + * Returns a ArrayList containing all listeners for this event, + * and all parent events for the specified priority. + * + * The list is returned with the listeners for the children events first. + * + * @param priority The Priority to get + * @return ArrayList containing listeners + */ + public List GetListeners(EventPriority priority) + { + List ret = new List(_priorities.Get(priority.ordinal())); + if (_parent != null) + { + ret.AddAll(_parent.GetListeners(priority)); + } + return ret; + } + + /** + * Returns a full list of all listeners for all priority levels. + * Including all parent listeners. + * + * List is returned in proper priority order. + * + * Automatically rebuilds the internal Array cache if its information is out of date. + * + * @return Array containing listeners + */ + public IEventListener[] GetListeners() + { + if (ShouldRebuild()) BuildCache(); + return _listeners; + } + + protected bool ShouldRebuild() + { + return _rebuild;// || (parent != null && parent.shouldRebuild()); + } + + protected void ForceRebuild() + { + _rebuild = true; + if (_children != null) + { + foreach (ListenerListInst child in _children) + child.ForceRebuild(); + } + } + + private void AddChild(ListenerListInst child) + { + if (_children == null) + _children = new List(); + _children.Add(child); + } + + /** + * Rebuild the local Array of listeners, returns early if there is no work to do. + */ + private void BuildCache() + { + if (_parent != null && _parent.ShouldRebuild()) + { + _parent.BuildCache(); + } + + List ret = new List(); + foreach (EventPriority value in System.Enum.GetValues(typeof(EventPriority.Values))) + { + List listeners = GetListeners(value); + if (listeners.Count > 0) + { + ret.Add(value); //Add the priority to notify the event of it's current phase. + ret.AddAll(listeners); + } + } + _listeners = ret.toArray(new IEventListener[ret.size()]); + _rebuild = false; + } + + public void Register(EventPriority priority, IEventListener listener) + { + _priorities.Get(priority.ordinal()).add(listener); + ForceRebuild(); + } + + public void Unregister(IEventListener listener) + { + foreach (List list in _priorities) + { + if (list.Remove(listener)) + { + this.ForceRebuild(); + } + } + } + } + } +} diff --git a/src/MineCase.Mod/common/versioning/ArtifactVersion.cs b/src/MineCase.Mod/common/versioning/ArtifactVersion.cs new file mode 100644 index 00000000..34b4db85 --- /dev/null +++ b/src/MineCase.Mod/common/versioning/ArtifactVersion.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MineCase.Mod.common.versioning +{ + public interface ArtifactVersion : IComparable + { + string GetLabel(); + + string GetVersionString(); + + bool ContainsVersion(ArtifactVersion source); + + string GetRangeString(); + } +} diff --git a/src/MineCase.sln b/src/MineCase.sln index 6c06ed07..35c9f4e2 100644 --- a/src/MineCase.sln +++ b/src/MineCase.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27130.2003 +VisualStudioVersion = 15.0.27004.2009 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MineCase.Server", "MineCase.Server\MineCase.Server.csproj", "{8E71CBEC-5804-4125-B651-C78426E57C8C}" EndProject @@ -56,123 +56,381 @@ Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker\do EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MineCase.Serialization", "MineCase.Serialization\MineCase.Serialization.csproj", "{AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MineCase.Mod", "MineCase.Mod\MineCase.Mod.csproj", "{181C5467-07E9-4F08-B4F4-AB8C090E29FA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Appveyor|Any CPU = Appveyor|Any CPU + Appveyor|x64 = Appveyor|x64 + Appveyor|x86 = Appveyor|x86 Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 TravisCI|Any CPU = TravisCI|Any CPU + TravisCI|x64 = TravisCI|x64 + TravisCI|x86 = TravisCI|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {8E71CBEC-5804-4125-B651-C78426E57C8C}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {8E71CBEC-5804-4125-B651-C78426E57C8C}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Appveyor|x86.Build.0 = Appveyor|Any CPU {8E71CBEC-5804-4125-B651-C78426E57C8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8E71CBEC-5804-4125-B651-C78426E57C8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Debug|x64.ActiveCfg = Debug|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Debug|x64.Build.0 = Debug|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Debug|x86.ActiveCfg = Debug|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Debug|x86.Build.0 = Debug|Any CPU {8E71CBEC-5804-4125-B651-C78426E57C8C}.Release|Any CPU.ActiveCfg = Release|Any CPU {8E71CBEC-5804-4125-B651-C78426E57C8C}.Release|Any CPU.Build.0 = Release|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Release|x64.ActiveCfg = Release|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Release|x64.Build.0 = Release|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Release|x86.ActiveCfg = Release|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.Release|x86.Build.0 = Release|Any CPU {8E71CBEC-5804-4125-B651-C78426E57C8C}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {8E71CBEC-5804-4125-B651-C78426E57C8C}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {8E71CBEC-5804-4125-B651-C78426E57C8C}.TravisCI|x86.Build.0 = TravisCI|Any CPU {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Appveyor|x86.Build.0 = Appveyor|Any CPU {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Debug|x64.ActiveCfg = Debug|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Debug|x64.Build.0 = Debug|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Debug|x86.ActiveCfg = Debug|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Debug|x86.Build.0 = Debug|Any CPU {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Release|Any CPU.ActiveCfg = Release|Any CPU {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Release|Any CPU.Build.0 = Release|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Release|x64.ActiveCfg = Release|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Release|x64.Build.0 = Release|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Release|x86.ActiveCfg = Release|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.Release|x86.Build.0 = Release|Any CPU {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {08B3641D-29F1-4E2B-BA88-84B2FFB436FF}.TravisCI|x86.Build.0 = TravisCI|Any CPU {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Appveyor|x86.Build.0 = Appveyor|Any CPU {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Debug|x64.ActiveCfg = Debug|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Debug|x64.Build.0 = Debug|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Debug|x86.ActiveCfg = Debug|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Debug|x86.Build.0 = Debug|Any CPU {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Release|Any CPU.ActiveCfg = Release|Any CPU {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Release|Any CPU.Build.0 = Release|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Release|x64.ActiveCfg = Release|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Release|x64.Build.0 = Release|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Release|x86.ActiveCfg = Release|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.Release|x86.Build.0 = Release|Any CPU {0842DE6C-4270-440E-9666-255A0B2EC1D9}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {0842DE6C-4270-440E-9666-255A0B2EC1D9}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {0842DE6C-4270-440E-9666-255A0B2EC1D9}.TravisCI|x86.Build.0 = TravisCI|Any CPU {98454B69-800A-4DEB-8D13-1E244BF15507}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {98454B69-800A-4DEB-8D13-1E244BF15507}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Appveyor|x86.Build.0 = Appveyor|Any CPU {98454B69-800A-4DEB-8D13-1E244BF15507}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {98454B69-800A-4DEB-8D13-1E244BF15507}.Debug|Any CPU.Build.0 = Debug|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Debug|x64.ActiveCfg = Debug|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Debug|x64.Build.0 = Debug|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Debug|x86.ActiveCfg = Debug|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Debug|x86.Build.0 = Debug|Any CPU {98454B69-800A-4DEB-8D13-1E244BF15507}.Release|Any CPU.ActiveCfg = Release|Any CPU {98454B69-800A-4DEB-8D13-1E244BF15507}.Release|Any CPU.Build.0 = Release|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Release|x64.ActiveCfg = Release|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Release|x64.Build.0 = Release|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Release|x86.ActiveCfg = Release|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.Release|x86.Build.0 = Release|Any CPU {98454B69-800A-4DEB-8D13-1E244BF15507}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {98454B69-800A-4DEB-8D13-1E244BF15507}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {98454B69-800A-4DEB-8D13-1E244BF15507}.TravisCI|x86.Build.0 = TravisCI|Any CPU {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Appveyor|x86.Build.0 = Appveyor|Any CPU {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Debug|x64.ActiveCfg = Debug|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Debug|x64.Build.0 = Debug|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Debug|x86.ActiveCfg = Debug|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Debug|x86.Build.0 = Debug|Any CPU {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Release|Any CPU.ActiveCfg = Release|Any CPU {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Release|Any CPU.Build.0 = Release|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Release|x64.ActiveCfg = Release|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Release|x64.Build.0 = Release|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Release|x86.ActiveCfg = Release|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.Release|x86.Build.0 = Release|Any CPU {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {3F83DE42-121D-4E7A-AB27-825AD8179D3C}.TravisCI|x86.Build.0 = TravisCI|Any CPU {35618D69-85F0-4C38-8224-04A2D75825B6}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {35618D69-85F0-4C38-8224-04A2D75825B6}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Appveyor|x86.Build.0 = Appveyor|Any CPU {35618D69-85F0-4C38-8224-04A2D75825B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {35618D69-85F0-4C38-8224-04A2D75825B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Debug|x64.ActiveCfg = Debug|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Debug|x64.Build.0 = Debug|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Debug|x86.ActiveCfg = Debug|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Debug|x86.Build.0 = Debug|Any CPU {35618D69-85F0-4C38-8224-04A2D75825B6}.Release|Any CPU.ActiveCfg = Release|Any CPU {35618D69-85F0-4C38-8224-04A2D75825B6}.Release|Any CPU.Build.0 = Release|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Release|x64.ActiveCfg = Release|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Release|x64.Build.0 = Release|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Release|x86.ActiveCfg = Release|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.Release|x86.Build.0 = Release|Any CPU {35618D69-85F0-4C38-8224-04A2D75825B6}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {35618D69-85F0-4C38-8224-04A2D75825B6}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {35618D69-85F0-4C38-8224-04A2D75825B6}.TravisCI|x86.Build.0 = TravisCI|Any CPU {199335D6-9726-42E1-94F2-7D95932D4DDC}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {199335D6-9726-42E1-94F2-7D95932D4DDC}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Appveyor|x86.Build.0 = Appveyor|Any CPU {199335D6-9726-42E1-94F2-7D95932D4DDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {199335D6-9726-42E1-94F2-7D95932D4DDC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Debug|x64.ActiveCfg = Debug|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Debug|x64.Build.0 = Debug|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Debug|x86.ActiveCfg = Debug|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Debug|x86.Build.0 = Debug|Any CPU {199335D6-9726-42E1-94F2-7D95932D4DDC}.Release|Any CPU.ActiveCfg = Release|Any CPU {199335D6-9726-42E1-94F2-7D95932D4DDC}.Release|Any CPU.Build.0 = Release|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Release|x64.ActiveCfg = Release|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Release|x64.Build.0 = Release|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Release|x86.ActiveCfg = Release|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.Release|x86.Build.0 = Release|Any CPU {199335D6-9726-42E1-94F2-7D95932D4DDC}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {199335D6-9726-42E1-94F2-7D95932D4DDC}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {199335D6-9726-42E1-94F2-7D95932D4DDC}.TravisCI|x86.Build.0 = TravisCI|Any CPU {47C1F452-E59C-42E3-8799-BF09444D8384}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {47C1F452-E59C-42E3-8799-BF09444D8384}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Appveyor|x86.Build.0 = Appveyor|Any CPU {47C1F452-E59C-42E3-8799-BF09444D8384}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {47C1F452-E59C-42E3-8799-BF09444D8384}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Debug|x64.ActiveCfg = Debug|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Debug|x64.Build.0 = Debug|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Debug|x86.ActiveCfg = Debug|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Debug|x86.Build.0 = Debug|Any CPU {47C1F452-E59C-42E3-8799-BF09444D8384}.Release|Any CPU.ActiveCfg = Release|Any CPU {47C1F452-E59C-42E3-8799-BF09444D8384}.Release|Any CPU.Build.0 = Release|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Release|x64.ActiveCfg = Release|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Release|x64.Build.0 = Release|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Release|x86.ActiveCfg = Release|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.Release|x86.Build.0 = Release|Any CPU {47C1F452-E59C-42E3-8799-BF09444D8384}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {47C1F452-E59C-42E3-8799-BF09444D8384}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {47C1F452-E59C-42E3-8799-BF09444D8384}.TravisCI|x86.Build.0 = TravisCI|Any CPU {B7B1A959-72F3-42C6-B138-93C8D654F139}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {B7B1A959-72F3-42C6-B138-93C8D654F139}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Appveyor|x86.Build.0 = Appveyor|Any CPU {B7B1A959-72F3-42C6-B138-93C8D654F139}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B7B1A959-72F3-42C6-B138-93C8D654F139}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Debug|x64.ActiveCfg = Debug|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Debug|x64.Build.0 = Debug|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Debug|x86.ActiveCfg = Debug|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Debug|x86.Build.0 = Debug|Any CPU {B7B1A959-72F3-42C6-B138-93C8D654F139}.Release|Any CPU.ActiveCfg = Release|Any CPU {B7B1A959-72F3-42C6-B138-93C8D654F139}.Release|Any CPU.Build.0 = Release|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Release|x64.ActiveCfg = Release|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Release|x64.Build.0 = Release|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Release|x86.ActiveCfg = Release|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.Release|x86.Build.0 = Release|Any CPU {B7B1A959-72F3-42C6-B138-93C8D654F139}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {B7B1A959-72F3-42C6-B138-93C8D654F139}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {B7B1A959-72F3-42C6-B138-93C8D654F139}.TravisCI|x86.Build.0 = TravisCI|Any CPU {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Appveyor|x86.Build.0 = Appveyor|Any CPU {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Debug|x64.ActiveCfg = Debug|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Debug|x64.Build.0 = Debug|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Debug|x86.ActiveCfg = Debug|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Debug|x86.Build.0 = Debug|Any CPU {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Release|Any CPU.ActiveCfg = Release|Any CPU {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Release|Any CPU.Build.0 = Release|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Release|x64.ActiveCfg = Release|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Release|x64.Build.0 = Release|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Release|x86.ActiveCfg = Release|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.Release|x86.Build.0 = Release|Any CPU {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {76AFDAE6-75F7-4E68-86CD-DE19CA47246B}.TravisCI|x86.Build.0 = TravisCI|Any CPU {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Appveyor|x86.Build.0 = Appveyor|Any CPU {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Debug|x64.ActiveCfg = Debug|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Debug|x64.Build.0 = Debug|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Debug|x86.ActiveCfg = Debug|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Debug|x86.Build.0 = Debug|Any CPU {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Release|Any CPU.ActiveCfg = Release|Any CPU {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Release|Any CPU.Build.0 = Release|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Release|x64.ActiveCfg = Release|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Release|x64.Build.0 = Release|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Release|x86.ActiveCfg = Release|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.Release|x86.Build.0 = Release|Any CPU {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {D586FFBB-7265-47CF-AD80-77AC7ACB0FF1}.TravisCI|x86.Build.0 = TravisCI|Any CPU {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Appveyor|x86.Build.0 = Appveyor|Any CPU {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Debug|x64.ActiveCfg = Debug|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Debug|x64.Build.0 = Debug|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Debug|x86.ActiveCfg = Debug|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Debug|x86.Build.0 = Debug|Any CPU {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Release|Any CPU.Build.0 = Release|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Release|x64.ActiveCfg = Release|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Release|x64.Build.0 = Release|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Release|x86.ActiveCfg = Release|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.Release|x86.Build.0 = Release|Any CPU {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {D2E3FF57-9287-4584-B8A1-57E19D44E0AF}.TravisCI|x86.Build.0 = TravisCI|Any CPU {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Appveyor|x86.Build.0 = Appveyor|Any CPU {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Debug|x64.ActiveCfg = Debug|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Debug|x64.Build.0 = Debug|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Debug|x86.ActiveCfg = Debug|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Debug|x86.Build.0 = Debug|Any CPU {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Release|x64.ActiveCfg = Release|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Release|x64.Build.0 = Release|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Release|x86.ActiveCfg = Release|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.Release|x86.Build.0 = Release|Any CPU {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {2974A4BE-85D2-454D-ACDE-B4BE63993B95}.TravisCI|x86.Build.0 = TravisCI|Any CPU {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Appveyor|Any CPU.ActiveCfg = Appveyor|Any CPU {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Appveyor|Any CPU.Build.0 = Appveyor|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Appveyor|x64.ActiveCfg = Appveyor|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Appveyor|x64.Build.0 = Appveyor|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Appveyor|x86.ActiveCfg = Appveyor|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Appveyor|x86.Build.0 = Appveyor|Any CPU {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Debug|x64.ActiveCfg = Debug|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Debug|x64.Build.0 = Debug|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Debug|x86.ActiveCfg = Debug|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Debug|x86.Build.0 = Debug|Any CPU {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Release|Any CPU.Build.0 = Release|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Release|x64.ActiveCfg = Release|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Release|x64.Build.0 = Release|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Release|x86.ActiveCfg = Release|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.Release|x86.Build.0 = Release|Any CPU {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.TravisCI|Any CPU.ActiveCfg = TravisCI|Any CPU {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.TravisCI|Any CPU.Build.0 = TravisCI|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.TravisCI|x64.ActiveCfg = TravisCI|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.TravisCI|x64.Build.0 = TravisCI|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.TravisCI|x86.ActiveCfg = TravisCI|Any CPU + {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669}.TravisCI|x86.Build.0 = TravisCI|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Appveyor|Any CPU.ActiveCfg = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Appveyor|Any CPU.Build.0 = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Appveyor|x64.ActiveCfg = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Appveyor|x64.Build.0 = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Appveyor|x86.ActiveCfg = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Appveyor|x86.Build.0 = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Debug|x64.Build.0 = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Debug|x86.Build.0 = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Release|Any CPU.Build.0 = Release|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Release|x64.ActiveCfg = Release|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Release|x64.Build.0 = Release|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Release|x86.ActiveCfg = Release|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.Release|x86.Build.0 = Release|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.TravisCI|Any CPU.ActiveCfg = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.TravisCI|Any CPU.Build.0 = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.TravisCI|x64.ActiveCfg = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.TravisCI|x64.Build.0 = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.TravisCI|x86.ActiveCfg = Debug|Any CPU + {181C5467-07E9-4F08-B4F4-AB8C090E29FA}.TravisCI|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -192,6 +450,7 @@ Global {D2E3FF57-9287-4584-B8A1-57E19D44E0AF} = {5FE43A62-34E9-44CC-B5FF-D66EC916CFA1} {2974A4BE-85D2-454D-ACDE-B4BE63993B95} = {C32ACBC4-BA67-488B-96CD-ED6CF3255767} {AA85C7DA-31CB-499B-A74F-CF4FDC8EF669} = {CB620063-55E2-4694-B1E0-E99BB032BF03} + {181C5467-07E9-4F08-B4F4-AB8C090E29FA} = {CB620063-55E2-4694-B1E0-E99BB032BF03} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7AB995C3-E961-463C-8A55-3149C51761B5}