From 1b621baf5f231499a697103fc870fa6e846da421 Mon Sep 17 00:00:00 2001 From: Simon Schmid Date: Tue, 2 Jun 2015 10:22:48 +0200 Subject: [PATCH] CodeGenerator takes arrays of IComponentCodeGenerator and IPoolCodeGenerator to generate --- .../Entitas.CodeGenerator/CodeGenerator.cs | 34 +++++++-------- Entitas.CodeGenerator/Program.cs | 13 +++++- .../Editor/CodeGeneratorEditor.cs | 15 ++++++- .../CodeGenFile.cs.meta} | 6 ++- .../Entitas.CodeGenerator/CodeGenerator.cs | 34 +++++++-------- .../IComponentCodeGenerator.cs.meta | 12 ++++++ .../IPoolCodeGenerator.cs.meta | 12 ++++++ .../Assets/Tests/Generated/TestAttribute.cs | 7 ---- .../TestComponentGeneratedExtension.cs | 5 +++ .../TestComponentGeneratedExtension.cs.meta | 4 ++ .../Tests/Generated/TestComponentIds.cs.meta | 4 ++ .../Entitas.properties | 2 +- .../Entitas.CodeGenerator/CodeGenFile.cs.meta | 12 ++++++ .../Entitas.CodeGenerator/CodeGenerator.cs | 34 +++++++-------- .../IComponentCodeGenerator.cs.meta | 12 ++++++ .../IPoolCodeGenerator.cs.meta | 12 ++++++ .../Editor/CodeGeneratorEditor.cs | 15 ++++++- ...imationCurveComponentGeneratedExtension.cs | 16 +++---- .../Array2DComponentGeneratedExtension.cs | 16 +++---- .../Array3DComponentGeneratedExtension.cs | 16 +++---- .../ArrayComponentGeneratedExtension.cs | 16 +++---- .../BoundsComponentGeneratedExtension.cs | 16 +++---- .../ColorComponentGeneratedExtension.cs | 16 +++---- ...CustomObjectComponentGeneratedExtension.cs | 16 +++---- .../DateTimeComponentGeneratedExtension.cs | 16 +++---- .../DictArrayComponentGeneratedExtension.cs | 16 +++---- .../DictionaryComponentGeneratedExtension.cs | 16 +++---- .../GameObjectComponentGeneratedExtension.cs | 16 +++---- .../HashSetComponentGeneratedExtension.cs | 16 +++---- .../JaggedArrayComponentGeneratedExtension.cs | 16 +++---- .../ListArrayComponentGeneratedExtension.cs | 16 +++---- .../ListComponentGeneratedExtension.cs | 16 +++---- .../MyBoolComponentGeneratedExtension.cs | 16 +++---- .../MyEnumComponentGeneratedExtension.cs | 16 +++---- .../MyFloatComponentGeneratedExtension.cs | 16 +++---- .../MyIntComponentGeneratedExtension.cs | 16 +++---- .../MyStringComponentGeneratedExtension.cs | 16 +++---- .../RectComponentGeneratedExtension.cs | 16 +++---- ...SystemObjectComponentGeneratedExtension.cs | 16 +++---- .../UnityObjectComponentGeneratedExtension.cs | 16 +++---- ...portedObjectComponentGeneratedExtension.cs | 16 +++---- .../Vector2ComponentGeneratedExtension.cs | 16 +++---- .../Vector3ComponentGeneratedExtension.cs | 16 +++---- .../Vector4ComponentGeneratedExtension.cs | 16 +++---- README.md | 4 +- RELEASE_NOTES.md | 39 ++++++++++++++++-- Readme/Program.cs | 13 +++++- Readme/VisualDebug-Systems.png | Bin 0 -> 54846 bytes .../Editor/CodeGeneratorEditor.cs | 15 ++++++- bin/Entitas.zip | Bin 54932 -> 59592 bytes 50 files changed, 441 insertions(+), 295 deletions(-) rename Entitas.Unity.CodeGenerator/Assets/{Tests/Generated/TestAttribute.cs.meta => Libraries/Entitas.CodeGenerator/CodeGenFile.cs.meta} (53%) create mode 100644 Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/IComponentCodeGenerator.cs.meta create mode 100644 Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/IPoolCodeGenerator.cs.meta delete mode 100644 Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestAttribute.cs create mode 100644 Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/CodeGenFile.cs.meta create mode 100644 Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/IComponentCodeGenerator.cs.meta create mode 100644 Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/IPoolCodeGenerator.cs.meta create mode 100644 Readme/VisualDebug-Systems.png diff --git a/Entitas.CodeGenerator/Entitas.CodeGenerator/CodeGenerator.cs b/Entitas.CodeGenerator/Entitas.CodeGenerator/CodeGenerator.cs index dfe65079a..b1c42ffb1 100644 --- a/Entitas.CodeGenerator/Entitas.CodeGenerator/CodeGenerator.cs +++ b/Entitas.CodeGenerator/Entitas.CodeGenerator/CodeGenerator.cs @@ -6,16 +6,25 @@ namespace Entitas.CodeGenerator { public static class CodeGenerator { public const string componentSuffix = "Component"; - public static void Generate(Type[] types, string[] poolNames, string dir) { + public static void Generate(Type[] types, string[] poolNames, string dir, + IComponentCodeGenerator[] componentCodeGenerators, IPoolCodeGenerator[] poolCodeGenerators) { + if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } CleanDir(dir); var components = GetComponents(types); - generateIndicesLookup(dir, components); - generateComponentExtensions(dir, components); - generatePoolAttributes(dir, poolNames); + + foreach (var generator in componentCodeGenerators) { + var files = generator.Generate(components); + writeFiles(dir, files); + } + + foreach (var generator in poolCodeGenerators) { + var files = generator.Generate(poolNames); + writeFiles(dir, files); + } } public static void CleanDir(string dir) { @@ -37,24 +46,9 @@ public static Type[]GetComponents(Type[] types) { .ToArray(); } - static void generateIndicesLookup(string dir, Type[] components) { - var files = new IndicesLookupGenerator().Generate(components); - writeFiles(dir, files); - } - - static void generateComponentExtensions(string dir, Type[] components) { - var files = new ComponentExtensionsGenerator().Generate(components); - writeFiles(dir, files); - } - - static void generatePoolAttributes(string dir, string[] poolNames) { - var files = new PoolAttributeGenerator().Generate(poolNames); - writeFiles(dir, files); - } - static void writeFiles(string dir, CodeGenFile[] files) { foreach (var file in files) { - File.WriteAllText(file.fileName + ".cs", file.fileContent); + File.WriteAllText(dir + file.fileName + ".cs", file.fileContent); } } } diff --git a/Entitas.CodeGenerator/Program.cs b/Entitas.CodeGenerator/Program.cs index a8e49122b..56e2f0f96 100644 --- a/Entitas.CodeGenerator/Program.cs +++ b/Entitas.CodeGenerator/Program.cs @@ -4,6 +4,17 @@ public class Program { public static void Main(string[] args) { var assembly = Assembly.GetAssembly(typeof(CodeGenerator)); - CodeGenerator.Generate(assembly.GetTypes(), new string[0], "Generated/"); + + var componentCodeGenerators = new IComponentCodeGenerator[] { + new IndicesLookupGenerator(), + new ComponentExtensionsGenerator() + }; + + var poolCodeGenerators = new IPoolCodeGenerator[] { + new PoolAttributeGenerator() + }; + + CodeGenerator.Generate(assembly.GetTypes(), new string[0], "Generated/", + componentCodeGenerators, poolCodeGenerators); } } diff --git a/Entitas.Unity.CodeGenerator/Assets/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs b/Entitas.Unity.CodeGenerator/Assets/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs index 02dfa3071..daa510f9e 100644 --- a/Entitas.Unity.CodeGenerator/Assets/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs +++ b/Entitas.Unity.CodeGenerator/Assets/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs @@ -1,6 +1,7 @@ using System; using System.Reflection; using Entitas; +using Entitas.CodeGenerator; using UnityEditor; namespace Entitas.Unity.CodeGenerator { @@ -10,7 +11,19 @@ public static class CodeGeneratorEditor { public static void Generate() { var types = Assembly.GetAssembly(typeof(Entity)).GetTypes(); var config = new CodeGeneratorConfig(EntitasPreferencesEditor.LoadConfig()); - Entitas.CodeGenerator.CodeGenerator.Generate(types, config.pools, config.generatedFolderPath); + + var componentCodeGenerators = new IComponentCodeGenerator [] { + new IndicesLookupGenerator(), + new ComponentExtensionsGenerator() + }; + + var poolCodeGenerators = new IPoolCodeGenerator [] { + new PoolAttributeGenerator() + }; + + Entitas.CodeGenerator.CodeGenerator.Generate(types, config.pools, config.generatedFolderPath, + componentCodeGenerators, poolCodeGenerators); + AssetDatabase.Refresh(); } } diff --git a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestAttribute.cs.meta b/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/CodeGenFile.cs.meta similarity index 53% rename from Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestAttribute.cs.meta rename to Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/CodeGenFile.cs.meta index f94625375..02ad53313 100644 --- a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestAttribute.cs.meta +++ b/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/CodeGenFile.cs.meta @@ -1,8 +1,12 @@ fileFormatVersion: 2 -guid: f87c3c461090d4a59b125f1649ca4304 +guid: 894dad5ea0d55428d8e8bc1f3a9558ac +timeCreated: 1433175660 +licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: + assetBundleName: + assetBundleVariant: diff --git a/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/CodeGenerator.cs b/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/CodeGenerator.cs index dfe65079a..b1c42ffb1 100644 --- a/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/CodeGenerator.cs +++ b/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/CodeGenerator.cs @@ -6,16 +6,25 @@ namespace Entitas.CodeGenerator { public static class CodeGenerator { public const string componentSuffix = "Component"; - public static void Generate(Type[] types, string[] poolNames, string dir) { + public static void Generate(Type[] types, string[] poolNames, string dir, + IComponentCodeGenerator[] componentCodeGenerators, IPoolCodeGenerator[] poolCodeGenerators) { + if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } CleanDir(dir); var components = GetComponents(types); - generateIndicesLookup(dir, components); - generateComponentExtensions(dir, components); - generatePoolAttributes(dir, poolNames); + + foreach (var generator in componentCodeGenerators) { + var files = generator.Generate(components); + writeFiles(dir, files); + } + + foreach (var generator in poolCodeGenerators) { + var files = generator.Generate(poolNames); + writeFiles(dir, files); + } } public static void CleanDir(string dir) { @@ -37,24 +46,9 @@ public static Type[]GetComponents(Type[] types) { .ToArray(); } - static void generateIndicesLookup(string dir, Type[] components) { - var files = new IndicesLookupGenerator().Generate(components); - writeFiles(dir, files); - } - - static void generateComponentExtensions(string dir, Type[] components) { - var files = new ComponentExtensionsGenerator().Generate(components); - writeFiles(dir, files); - } - - static void generatePoolAttributes(string dir, string[] poolNames) { - var files = new PoolAttributeGenerator().Generate(poolNames); - writeFiles(dir, files); - } - static void writeFiles(string dir, CodeGenFile[] files) { foreach (var file in files) { - File.WriteAllText(file.fileName + ".cs", file.fileContent); + File.WriteAllText(dir + file.fileName + ".cs", file.fileContent); } } } diff --git a/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/IComponentCodeGenerator.cs.meta b/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/IComponentCodeGenerator.cs.meta new file mode 100644 index 000000000..119e17a8a --- /dev/null +++ b/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/IComponentCodeGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a30c33c44858a4ae6949707224ccb630 +timeCreated: 1433175660 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/IPoolCodeGenerator.cs.meta b/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/IPoolCodeGenerator.cs.meta new file mode 100644 index 000000000..afaf2172d --- /dev/null +++ b/Entitas.Unity.CodeGenerator/Assets/Libraries/Entitas.CodeGenerator/IPoolCodeGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5539c98fde8ca43be872aaa34359effa +timeCreated: 1433175660 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestAttribute.cs b/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestAttribute.cs deleted file mode 100644 index 483b92ac6..000000000 --- a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestAttribute.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Entitas.CodeGenerator; - -public class TestAttribute : PoolAttribute { - public TestAttribute() : base("Test") { - } -} - diff --git a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentGeneratedExtension.cs b/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentGeneratedExtension.cs index 841ff8ea9..912648582 100644 --- a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentGeneratedExtension.cs +++ b/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentGeneratedExtension.cs @@ -16,6 +16,11 @@ public bool isTest { } } } + + public Entity IsTest(bool value) { + isTest = value; + return this; + } } } diff --git a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentGeneratedExtension.cs.meta b/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentGeneratedExtension.cs.meta index 6a1569aea..40524d7c3 100644 --- a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentGeneratedExtension.cs.meta +++ b/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentGeneratedExtension.cs.meta @@ -1,8 +1,12 @@ fileFormatVersion: 2 guid: 6c8844792621f4c13b11af97571c9566 +timeCreated: 1433176446 +licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: + assetBundleName: + assetBundleVariant: diff --git a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentIds.cs.meta b/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentIds.cs.meta index d79e0bb6f..b28a47855 100644 --- a/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentIds.cs.meta +++ b/Entitas.Unity.CodeGenerator/Assets/Tests/Generated/TestComponentIds.cs.meta @@ -1,8 +1,12 @@ fileFormatVersion: 2 guid: 711127ccf6413422789e1db8f8fa6491 +timeCreated: 1433176446 +licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: + assetBundleName: + assetBundleVariant: diff --git a/Entitas.Unity.CodeGenerator/Entitas.properties b/Entitas.Unity.CodeGenerator/Entitas.properties index 0199847ca..e0f2a3cc5 100644 --- a/Entitas.Unity.CodeGenerator/Entitas.properties +++ b/Entitas.Unity.CodeGenerator/Entitas.properties @@ -1,4 +1,4 @@ Entitas.CodeGenerator.GeneratedFolderPath = Assets/Tests/Generated/ Entitas.CodeGenerator.Pools = Test -Entitas.Unity.CodeGenerator.GeneratedFolderPath = Assets/Generated/ +Entitas.Unity.CodeGenerator.GeneratedFolderPath = Assets/Tests/Generated/ Entitas.Unity.CodeGenerator.Pools = diff --git a/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/CodeGenFile.cs.meta b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/CodeGenFile.cs.meta new file mode 100644 index 000000000..ae233521c --- /dev/null +++ b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/CodeGenFile.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a2698b7bbf5684c189763e5c5395f11d +timeCreated: 1433175681 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/CodeGenerator.cs b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/CodeGenerator.cs index dfe65079a..b1c42ffb1 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/CodeGenerator.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/CodeGenerator.cs @@ -6,16 +6,25 @@ namespace Entitas.CodeGenerator { public static class CodeGenerator { public const string componentSuffix = "Component"; - public static void Generate(Type[] types, string[] poolNames, string dir) { + public static void Generate(Type[] types, string[] poolNames, string dir, + IComponentCodeGenerator[] componentCodeGenerators, IPoolCodeGenerator[] poolCodeGenerators) { + if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } CleanDir(dir); var components = GetComponents(types); - generateIndicesLookup(dir, components); - generateComponentExtensions(dir, components); - generatePoolAttributes(dir, poolNames); + + foreach (var generator in componentCodeGenerators) { + var files = generator.Generate(components); + writeFiles(dir, files); + } + + foreach (var generator in poolCodeGenerators) { + var files = generator.Generate(poolNames); + writeFiles(dir, files); + } } public static void CleanDir(string dir) { @@ -37,24 +46,9 @@ public static Type[]GetComponents(Type[] types) { .ToArray(); } - static void generateIndicesLookup(string dir, Type[] components) { - var files = new IndicesLookupGenerator().Generate(components); - writeFiles(dir, files); - } - - static void generateComponentExtensions(string dir, Type[] components) { - var files = new ComponentExtensionsGenerator().Generate(components); - writeFiles(dir, files); - } - - static void generatePoolAttributes(string dir, string[] poolNames) { - var files = new PoolAttributeGenerator().Generate(poolNames); - writeFiles(dir, files); - } - static void writeFiles(string dir, CodeGenFile[] files) { foreach (var file in files) { - File.WriteAllText(file.fileName + ".cs", file.fileContent); + File.WriteAllText(dir + file.fileName + ".cs", file.fileContent); } } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/IComponentCodeGenerator.cs.meta b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/IComponentCodeGenerator.cs.meta new file mode 100644 index 000000000..f23171bbe --- /dev/null +++ b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/IComponentCodeGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0f6c32482436c4c96bd0e53b4cd2e369 +timeCreated: 1433175681 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/IPoolCodeGenerator.cs.meta b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/IPoolCodeGenerator.cs.meta new file mode 100644 index 000000000..515e71c00 --- /dev/null +++ b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.CodeGenerator/IPoolCodeGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: abe4ca127456a42bdaa51e3948cdfaa3 +timeCreated: 1433175681 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs index 02dfa3071..daa510f9e 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Libraries/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs @@ -1,6 +1,7 @@ using System; using System.Reflection; using Entitas; +using Entitas.CodeGenerator; using UnityEditor; namespace Entitas.Unity.CodeGenerator { @@ -10,7 +11,19 @@ public static class CodeGeneratorEditor { public static void Generate() { var types = Assembly.GetAssembly(typeof(Entity)).GetTypes(); var config = new CodeGeneratorConfig(EntitasPreferencesEditor.LoadConfig()); - Entitas.CodeGenerator.CodeGenerator.Generate(types, config.pools, config.generatedFolderPath); + + var componentCodeGenerators = new IComponentCodeGenerator [] { + new IndicesLookupGenerator(), + new ComponentExtensionsGenerator() + }; + + var poolCodeGenerators = new IPoolCodeGenerator [] { + new PoolAttributeGenerator() + }; + + Entitas.CodeGenerator.CodeGenerator.Generate(types, config.pools, config.generatedFolderPath, + componentCodeGenerators, poolCodeGenerators); + AssetDatabase.Refresh(); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/AnimationCurveComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/AnimationCurveComponentGeneratedExtension.cs index 681120b35..724e908ef 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/AnimationCurveComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/AnimationCurveComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasAnimationCurve { get { return HasComponent(ComponentIds.AnimationCurve); } } - public void AddAnimationCurve(AnimationCurveComponent component) { - AddComponent(ComponentIds.AnimationCurve, component); + public Entity AddAnimationCurve(AnimationCurveComponent component) { + return AddComponent(ComponentIds.AnimationCurve, component); } - public void AddAnimationCurve(UnityEngine.AnimationCurve newAnimationCurve) { + public Entity AddAnimationCurve(UnityEngine.AnimationCurve newAnimationCurve) { var component = new AnimationCurveComponent(); component.animationCurve = newAnimationCurve; - AddAnimationCurve(component); + return AddAnimationCurve(component); } - public void ReplaceAnimationCurve(UnityEngine.AnimationCurve newAnimationCurve) { + public Entity ReplaceAnimationCurve(UnityEngine.AnimationCurve newAnimationCurve) { AnimationCurveComponent component; if (hasAnimationCurve) { WillRemoveComponent(ComponentIds.AnimationCurve); @@ -23,11 +23,11 @@ public void ReplaceAnimationCurve(UnityEngine.AnimationCurve newAnimationCurve) component = new AnimationCurveComponent(); } component.animationCurve = newAnimationCurve; - ReplaceComponent(ComponentIds.AnimationCurve, component); + return ReplaceComponent(ComponentIds.AnimationCurve, component); } - public void RemoveAnimationCurve() { - RemoveComponent(ComponentIds.AnimationCurve); + public Entity RemoveAnimationCurve() { + return RemoveComponent(ComponentIds.AnimationCurve); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Array2DComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Array2DComponentGeneratedExtension.cs index bad56236f..3337b3109 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Array2DComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Array2DComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasArray2D { get { return HasComponent(ComponentIds.Array2D); } } - public void AddArray2D(Array2DComponent component) { - AddComponent(ComponentIds.Array2D, component); + public Entity AddArray2D(Array2DComponent component) { + return AddComponent(ComponentIds.Array2D, component); } - public void AddArray2D(int[,] newArray2d) { + public Entity AddArray2D(int[,] newArray2d) { var component = new Array2DComponent(); component.array2d = newArray2d; - AddArray2D(component); + return AddArray2D(component); } - public void ReplaceArray2D(int[,] newArray2d) { + public Entity ReplaceArray2D(int[,] newArray2d) { Array2DComponent component; if (hasArray2D) { WillRemoveComponent(ComponentIds.Array2D); @@ -23,11 +23,11 @@ public void ReplaceArray2D(int[,] newArray2d) { component = new Array2DComponent(); } component.array2d = newArray2d; - ReplaceComponent(ComponentIds.Array2D, component); + return ReplaceComponent(ComponentIds.Array2D, component); } - public void RemoveArray2D() { - RemoveComponent(ComponentIds.Array2D); + public Entity RemoveArray2D() { + return RemoveComponent(ComponentIds.Array2D); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Array3DComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Array3DComponentGeneratedExtension.cs index fba7223cb..f0c915958 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Array3DComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Array3DComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasArray3D { get { return HasComponent(ComponentIds.Array3D); } } - public void AddArray3D(Array3DComponent component) { - AddComponent(ComponentIds.Array3D, component); + public Entity AddArray3D(Array3DComponent component) { + return AddComponent(ComponentIds.Array3D, component); } - public void AddArray3D(int[,,] newArray3d) { + public Entity AddArray3D(int[,,] newArray3d) { var component = new Array3DComponent(); component.array3d = newArray3d; - AddArray3D(component); + return AddArray3D(component); } - public void ReplaceArray3D(int[,,] newArray3d) { + public Entity ReplaceArray3D(int[,,] newArray3d) { Array3DComponent component; if (hasArray3D) { WillRemoveComponent(ComponentIds.Array3D); @@ -23,11 +23,11 @@ public void ReplaceArray3D(int[,,] newArray3d) { component = new Array3DComponent(); } component.array3d = newArray3d; - ReplaceComponent(ComponentIds.Array3D, component); + return ReplaceComponent(ComponentIds.Array3D, component); } - public void RemoveArray3D() { - RemoveComponent(ComponentIds.Array3D); + public Entity RemoveArray3D() { + return RemoveComponent(ComponentIds.Array3D); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ArrayComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ArrayComponentGeneratedExtension.cs index f1d038bf8..c12f28e25 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ArrayComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ArrayComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasArray { get { return HasComponent(ComponentIds.Array); } } - public void AddArray(ArrayComponent component) { - AddComponent(ComponentIds.Array, component); + public Entity AddArray(ArrayComponent component) { + return AddComponent(ComponentIds.Array, component); } - public void AddArray(string[] newArray) { + public Entity AddArray(string[] newArray) { var component = new ArrayComponent(); component.array = newArray; - AddArray(component); + return AddArray(component); } - public void ReplaceArray(string[] newArray) { + public Entity ReplaceArray(string[] newArray) { ArrayComponent component; if (hasArray) { WillRemoveComponent(ComponentIds.Array); @@ -23,11 +23,11 @@ public void ReplaceArray(string[] newArray) { component = new ArrayComponent(); } component.array = newArray; - ReplaceComponent(ComponentIds.Array, component); + return ReplaceComponent(ComponentIds.Array, component); } - public void RemoveArray() { - RemoveComponent(ComponentIds.Array); + public Entity RemoveArray() { + return RemoveComponent(ComponentIds.Array); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/BoundsComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/BoundsComponentGeneratedExtension.cs index 72ceefa0d..056cc4371 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/BoundsComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/BoundsComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasBounds { get { return HasComponent(ComponentIds.Bounds); } } - public void AddBounds(BoundsComponent component) { - AddComponent(ComponentIds.Bounds, component); + public Entity AddBounds(BoundsComponent component) { + return AddComponent(ComponentIds.Bounds, component); } - public void AddBounds(UnityEngine.Bounds newBounds) { + public Entity AddBounds(UnityEngine.Bounds newBounds) { var component = new BoundsComponent(); component.bounds = newBounds; - AddBounds(component); + return AddBounds(component); } - public void ReplaceBounds(UnityEngine.Bounds newBounds) { + public Entity ReplaceBounds(UnityEngine.Bounds newBounds) { BoundsComponent component; if (hasBounds) { WillRemoveComponent(ComponentIds.Bounds); @@ -23,11 +23,11 @@ public void ReplaceBounds(UnityEngine.Bounds newBounds) { component = new BoundsComponent(); } component.bounds = newBounds; - ReplaceComponent(ComponentIds.Bounds, component); + return ReplaceComponent(ComponentIds.Bounds, component); } - public void RemoveBounds() { - RemoveComponent(ComponentIds.Bounds); + public Entity RemoveBounds() { + return RemoveComponent(ComponentIds.Bounds); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ColorComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ColorComponentGeneratedExtension.cs index f57db2aaa..e69fb8c5e 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ColorComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ColorComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasColor { get { return HasComponent(ComponentIds.Color); } } - public void AddColor(ColorComponent component) { - AddComponent(ComponentIds.Color, component); + public Entity AddColor(ColorComponent component) { + return AddComponent(ComponentIds.Color, component); } - public void AddColor(UnityEngine.Color newColor) { + public Entity AddColor(UnityEngine.Color newColor) { var component = new ColorComponent(); component.color = newColor; - AddColor(component); + return AddColor(component); } - public void ReplaceColor(UnityEngine.Color newColor) { + public Entity ReplaceColor(UnityEngine.Color newColor) { ColorComponent component; if (hasColor) { WillRemoveComponent(ComponentIds.Color); @@ -23,11 +23,11 @@ public void ReplaceColor(UnityEngine.Color newColor) { component = new ColorComponent(); } component.color = newColor; - ReplaceComponent(ComponentIds.Color, component); + return ReplaceComponent(ComponentIds.Color, component); } - public void RemoveColor() { - RemoveComponent(ComponentIds.Color); + public Entity RemoveColor() { + return RemoveComponent(ComponentIds.Color); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/CustomObjectComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/CustomObjectComponentGeneratedExtension.cs index 79ba515dd..375207fb3 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/CustomObjectComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/CustomObjectComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasCustomObject { get { return HasComponent(ComponentIds.CustomObject); } } - public void AddCustomObject(CustomObjectComponent component) { - AddComponent(ComponentIds.CustomObject, component); + public Entity AddCustomObject(CustomObjectComponent component) { + return AddComponent(ComponentIds.CustomObject, component); } - public void AddCustomObject(CustomObject newCustomObject) { + public Entity AddCustomObject(CustomObject newCustomObject) { var component = new CustomObjectComponent(); component.customObject = newCustomObject; - AddCustomObject(component); + return AddCustomObject(component); } - public void ReplaceCustomObject(CustomObject newCustomObject) { + public Entity ReplaceCustomObject(CustomObject newCustomObject) { CustomObjectComponent component; if (hasCustomObject) { WillRemoveComponent(ComponentIds.CustomObject); @@ -23,11 +23,11 @@ public void ReplaceCustomObject(CustomObject newCustomObject) { component = new CustomObjectComponent(); } component.customObject = newCustomObject; - ReplaceComponent(ComponentIds.CustomObject, component); + return ReplaceComponent(ComponentIds.CustomObject, component); } - public void RemoveCustomObject() { - RemoveComponent(ComponentIds.CustomObject); + public Entity RemoveCustomObject() { + return RemoveComponent(ComponentIds.CustomObject); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/DateTimeComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/DateTimeComponentGeneratedExtension.cs index a188f731e..5f4204dc5 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/DateTimeComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/DateTimeComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasDateTime { get { return HasComponent(ComponentIds.DateTime); } } - public void AddDateTime(DateTimeComponent component) { - AddComponent(ComponentIds.DateTime, component); + public Entity AddDateTime(DateTimeComponent component) { + return AddComponent(ComponentIds.DateTime, component); } - public void AddDateTime(System.DateTime newDate) { + public Entity AddDateTime(System.DateTime newDate) { var component = new DateTimeComponent(); component.date = newDate; - AddDateTime(component); + return AddDateTime(component); } - public void ReplaceDateTime(System.DateTime newDate) { + public Entity ReplaceDateTime(System.DateTime newDate) { DateTimeComponent component; if (hasDateTime) { WillRemoveComponent(ComponentIds.DateTime); @@ -23,11 +23,11 @@ public void ReplaceDateTime(System.DateTime newDate) { component = new DateTimeComponent(); } component.date = newDate; - ReplaceComponent(ComponentIds.DateTime, component); + return ReplaceComponent(ComponentIds.DateTime, component); } - public void RemoveDateTime() { - RemoveComponent(ComponentIds.DateTime); + public Entity RemoveDateTime() { + return RemoveComponent(ComponentIds.DateTime); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/DictArrayComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/DictArrayComponentGeneratedExtension.cs index 7b98f4a17..ebea885ba 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/DictArrayComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/DictArrayComponentGeneratedExtension.cs @@ -4,18 +4,18 @@ public partial class Entity { public bool hasDictArray { get { return HasComponent(ComponentIds.DictArray); } } - public void AddDictArray(DictArrayComponent component) { - AddComponent(ComponentIds.DictArray, component); + public Entity AddDictArray(DictArrayComponent component) { + return AddComponent(ComponentIds.DictArray, component); } - public void AddDictArray(System.Collections.Generic.Dictionary newDict, System.Collections.Generic.Dictionary[] newDictArray) { + public Entity AddDictArray(System.Collections.Generic.Dictionary newDict, System.Collections.Generic.Dictionary[] newDictArray) { var component = new DictArrayComponent(); component.dict = newDict; component.dictArray = newDictArray; - AddDictArray(component); + return AddDictArray(component); } - public void ReplaceDictArray(System.Collections.Generic.Dictionary newDict, System.Collections.Generic.Dictionary[] newDictArray) { + public Entity ReplaceDictArray(System.Collections.Generic.Dictionary newDict, System.Collections.Generic.Dictionary[] newDictArray) { DictArrayComponent component; if (hasDictArray) { WillRemoveComponent(ComponentIds.DictArray); @@ -25,11 +25,11 @@ public void ReplaceDictArray(System.Collections.Generic.Dictionary newDict) { + public Entity AddDictionary(System.Collections.Generic.Dictionary newDict) { var component = new DictionaryComponent(); component.dict = newDict; - AddDictionary(component); + return AddDictionary(component); } - public void ReplaceDictionary(System.Collections.Generic.Dictionary newDict) { + public Entity ReplaceDictionary(System.Collections.Generic.Dictionary newDict) { DictionaryComponent component; if (hasDictionary) { WillRemoveComponent(ComponentIds.Dictionary); @@ -23,11 +23,11 @@ public void ReplaceDictionary(System.Collections.Generic.Dictionary newHashset) { + public Entity AddHashSet(System.Collections.Generic.HashSet newHashset) { var component = new HashSetComponent(); component.hashset = newHashset; - AddHashSet(component); + return AddHashSet(component); } - public void ReplaceHashSet(System.Collections.Generic.HashSet newHashset) { + public Entity ReplaceHashSet(System.Collections.Generic.HashSet newHashset) { HashSetComponent component; if (hasHashSet) { WillRemoveComponent(ComponentIds.HashSet); @@ -23,11 +23,11 @@ public void ReplaceHashSet(System.Collections.Generic.HashSet newHashset component = new HashSetComponent(); } component.hashset = newHashset; - ReplaceComponent(ComponentIds.HashSet, component); + return ReplaceComponent(ComponentIds.HashSet, component); } - public void RemoveHashSet() { - RemoveComponent(ComponentIds.HashSet); + public Entity RemoveHashSet() { + return RemoveComponent(ComponentIds.HashSet); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/JaggedArrayComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/JaggedArrayComponentGeneratedExtension.cs index 09358e122..9ffab553f 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/JaggedArrayComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/JaggedArrayComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasJaggedArray { get { return HasComponent(ComponentIds.JaggedArray); } } - public void AddJaggedArray(JaggedArrayComponent component) { - AddComponent(ComponentIds.JaggedArray, component); + public Entity AddJaggedArray(JaggedArrayComponent component) { + return AddComponent(ComponentIds.JaggedArray, component); } - public void AddJaggedArray(string[][] newJaggedArray) { + public Entity AddJaggedArray(string[][] newJaggedArray) { var component = new JaggedArrayComponent(); component.jaggedArray = newJaggedArray; - AddJaggedArray(component); + return AddJaggedArray(component); } - public void ReplaceJaggedArray(string[][] newJaggedArray) { + public Entity ReplaceJaggedArray(string[][] newJaggedArray) { JaggedArrayComponent component; if (hasJaggedArray) { WillRemoveComponent(ComponentIds.JaggedArray); @@ -23,11 +23,11 @@ public void ReplaceJaggedArray(string[][] newJaggedArray) { component = new JaggedArrayComponent(); } component.jaggedArray = newJaggedArray; - ReplaceComponent(ComponentIds.JaggedArray, component); + return ReplaceComponent(ComponentIds.JaggedArray, component); } - public void RemoveJaggedArray() { - RemoveComponent(ComponentIds.JaggedArray); + public Entity RemoveJaggedArray() { + return RemoveComponent(ComponentIds.JaggedArray); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ListArrayComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ListArrayComponentGeneratedExtension.cs index 93ce3d4ee..79ab67851 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ListArrayComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ListArrayComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasListArray { get { return HasComponent(ComponentIds.ListArray); } } - public void AddListArray(ListArrayComponent component) { - AddComponent(ComponentIds.ListArray, component); + public Entity AddListArray(ListArrayComponent component) { + return AddComponent(ComponentIds.ListArray, component); } - public void AddListArray(System.Collections.Generic.List[] newListArray) { + public Entity AddListArray(System.Collections.Generic.List[] newListArray) { var component = new ListArrayComponent(); component.listArray = newListArray; - AddListArray(component); + return AddListArray(component); } - public void ReplaceListArray(System.Collections.Generic.List[] newListArray) { + public Entity ReplaceListArray(System.Collections.Generic.List[] newListArray) { ListArrayComponent component; if (hasListArray) { WillRemoveComponent(ComponentIds.ListArray); @@ -23,11 +23,11 @@ public void ReplaceListArray(System.Collections.Generic.List[] newListAr component = new ListArrayComponent(); } component.listArray = newListArray; - ReplaceComponent(ComponentIds.ListArray, component); + return ReplaceComponent(ComponentIds.ListArray, component); } - public void RemoveListArray() { - RemoveComponent(ComponentIds.ListArray); + public Entity RemoveListArray() { + return RemoveComponent(ComponentIds.ListArray); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ListComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ListComponentGeneratedExtension.cs index a12a0b092..9aae37685 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ListComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/ListComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasList { get { return HasComponent(ComponentIds.List); } } - public void AddList(ListComponent component) { - AddComponent(ComponentIds.List, component); + public Entity AddList(ListComponent component) { + return AddComponent(ComponentIds.List, component); } - public void AddList(System.Collections.Generic.List newList) { + public Entity AddList(System.Collections.Generic.List newList) { var component = new ListComponent(); component.list = newList; - AddList(component); + return AddList(component); } - public void ReplaceList(System.Collections.Generic.List newList) { + public Entity ReplaceList(System.Collections.Generic.List newList) { ListComponent component; if (hasList) { WillRemoveComponent(ComponentIds.List); @@ -23,11 +23,11 @@ public void ReplaceList(System.Collections.Generic.List newList) { component = new ListComponent(); } component.list = newList; - ReplaceComponent(ComponentIds.List, component); + return ReplaceComponent(ComponentIds.List, component); } - public void RemoveList() { - RemoveComponent(ComponentIds.List); + public Entity RemoveList() { + return RemoveComponent(ComponentIds.List); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyBoolComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyBoolComponentGeneratedExtension.cs index 8224fd14e..65bc29e05 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyBoolComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyBoolComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasMyBool { get { return HasComponent(ComponentIds.MyBool); } } - public void AddMyBool(MyBoolComponent component) { - AddComponent(ComponentIds.MyBool, component); + public Entity AddMyBool(MyBoolComponent component) { + return AddComponent(ComponentIds.MyBool, component); } - public void AddMyBool(bool newMyBool) { + public Entity AddMyBool(bool newMyBool) { var component = new MyBoolComponent(); component.myBool = newMyBool; - AddMyBool(component); + return AddMyBool(component); } - public void ReplaceMyBool(bool newMyBool) { + public Entity ReplaceMyBool(bool newMyBool) { MyBoolComponent component; if (hasMyBool) { WillRemoveComponent(ComponentIds.MyBool); @@ -23,11 +23,11 @@ public void ReplaceMyBool(bool newMyBool) { component = new MyBoolComponent(); } component.myBool = newMyBool; - ReplaceComponent(ComponentIds.MyBool, component); + return ReplaceComponent(ComponentIds.MyBool, component); } - public void RemoveMyBool() { - RemoveComponent(ComponentIds.MyBool); + public Entity RemoveMyBool() { + return RemoveComponent(ComponentIds.MyBool); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyEnumComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyEnumComponentGeneratedExtension.cs index 47b267fec..729beff9c 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyEnumComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyEnumComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasMyEnum { get { return HasComponent(ComponentIds.MyEnum); } } - public void AddMyEnum(MyEnumComponent component) { - AddComponent(ComponentIds.MyEnum, component); + public Entity AddMyEnum(MyEnumComponent component) { + return AddComponent(ComponentIds.MyEnum, component); } - public void AddMyEnum(MyEnumComponent.MyEnum newMyEnum) { + public Entity AddMyEnum(MyEnumComponent.MyEnum newMyEnum) { var component = new MyEnumComponent(); component.myEnum = newMyEnum; - AddMyEnum(component); + return AddMyEnum(component); } - public void ReplaceMyEnum(MyEnumComponent.MyEnum newMyEnum) { + public Entity ReplaceMyEnum(MyEnumComponent.MyEnum newMyEnum) { MyEnumComponent component; if (hasMyEnum) { WillRemoveComponent(ComponentIds.MyEnum); @@ -23,11 +23,11 @@ public void ReplaceMyEnum(MyEnumComponent.MyEnum newMyEnum) { component = new MyEnumComponent(); } component.myEnum = newMyEnum; - ReplaceComponent(ComponentIds.MyEnum, component); + return ReplaceComponent(ComponentIds.MyEnum, component); } - public void RemoveMyEnum() { - RemoveComponent(ComponentIds.MyEnum); + public Entity RemoveMyEnum() { + return RemoveComponent(ComponentIds.MyEnum); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyFloatComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyFloatComponentGeneratedExtension.cs index 32375f0c9..226b3b6b0 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyFloatComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyFloatComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasMyFloat { get { return HasComponent(ComponentIds.MyFloat); } } - public void AddMyFloat(MyFloatComponent component) { - AddComponent(ComponentIds.MyFloat, component); + public Entity AddMyFloat(MyFloatComponent component) { + return AddComponent(ComponentIds.MyFloat, component); } - public void AddMyFloat(float newMyFloat) { + public Entity AddMyFloat(float newMyFloat) { var component = new MyFloatComponent(); component.myFloat = newMyFloat; - AddMyFloat(component); + return AddMyFloat(component); } - public void ReplaceMyFloat(float newMyFloat) { + public Entity ReplaceMyFloat(float newMyFloat) { MyFloatComponent component; if (hasMyFloat) { WillRemoveComponent(ComponentIds.MyFloat); @@ -23,11 +23,11 @@ public void ReplaceMyFloat(float newMyFloat) { component = new MyFloatComponent(); } component.myFloat = newMyFloat; - ReplaceComponent(ComponentIds.MyFloat, component); + return ReplaceComponent(ComponentIds.MyFloat, component); } - public void RemoveMyFloat() { - RemoveComponent(ComponentIds.MyFloat); + public Entity RemoveMyFloat() { + return RemoveComponent(ComponentIds.MyFloat); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyIntComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyIntComponentGeneratedExtension.cs index ac548a5fc..bb0e88492 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyIntComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyIntComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasMyInt { get { return HasComponent(ComponentIds.MyInt); } } - public void AddMyInt(MyIntComponent component) { - AddComponent(ComponentIds.MyInt, component); + public Entity AddMyInt(MyIntComponent component) { + return AddComponent(ComponentIds.MyInt, component); } - public void AddMyInt(int newMyInt) { + public Entity AddMyInt(int newMyInt) { var component = new MyIntComponent(); component.myInt = newMyInt; - AddMyInt(component); + return AddMyInt(component); } - public void ReplaceMyInt(int newMyInt) { + public Entity ReplaceMyInt(int newMyInt) { MyIntComponent component; if (hasMyInt) { WillRemoveComponent(ComponentIds.MyInt); @@ -23,11 +23,11 @@ public void ReplaceMyInt(int newMyInt) { component = new MyIntComponent(); } component.myInt = newMyInt; - ReplaceComponent(ComponentIds.MyInt, component); + return ReplaceComponent(ComponentIds.MyInt, component); } - public void RemoveMyInt() { - RemoveComponent(ComponentIds.MyInt); + public Entity RemoveMyInt() { + return RemoveComponent(ComponentIds.MyInt); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyStringComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyStringComponentGeneratedExtension.cs index a9b37a71c..934fa853a 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyStringComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/MyStringComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasMyString { get { return HasComponent(ComponentIds.MyString); } } - public void AddMyString(MyStringComponent component) { - AddComponent(ComponentIds.MyString, component); + public Entity AddMyString(MyStringComponent component) { + return AddComponent(ComponentIds.MyString, component); } - public void AddMyString(string newMyString) { + public Entity AddMyString(string newMyString) { var component = new MyStringComponent(); component.myString = newMyString; - AddMyString(component); + return AddMyString(component); } - public void ReplaceMyString(string newMyString) { + public Entity ReplaceMyString(string newMyString) { MyStringComponent component; if (hasMyString) { WillRemoveComponent(ComponentIds.MyString); @@ -23,11 +23,11 @@ public void ReplaceMyString(string newMyString) { component = new MyStringComponent(); } component.myString = newMyString; - ReplaceComponent(ComponentIds.MyString, component); + return ReplaceComponent(ComponentIds.MyString, component); } - public void RemoveMyString() { - RemoveComponent(ComponentIds.MyString); + public Entity RemoveMyString() { + return RemoveComponent(ComponentIds.MyString); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/RectComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/RectComponentGeneratedExtension.cs index 107ca219d..8b08e1e4d 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/RectComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/RectComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasRect { get { return HasComponent(ComponentIds.Rect); } } - public void AddRect(RectComponent component) { - AddComponent(ComponentIds.Rect, component); + public Entity AddRect(RectComponent component) { + return AddComponent(ComponentIds.Rect, component); } - public void AddRect(UnityEngine.Rect newRect) { + public Entity AddRect(UnityEngine.Rect newRect) { var component = new RectComponent(); component.rect = newRect; - AddRect(component); + return AddRect(component); } - public void ReplaceRect(UnityEngine.Rect newRect) { + public Entity ReplaceRect(UnityEngine.Rect newRect) { RectComponent component; if (hasRect) { WillRemoveComponent(ComponentIds.Rect); @@ -23,11 +23,11 @@ public void ReplaceRect(UnityEngine.Rect newRect) { component = new RectComponent(); } component.rect = newRect; - ReplaceComponent(ComponentIds.Rect, component); + return ReplaceComponent(ComponentIds.Rect, component); } - public void RemoveRect() { - RemoveComponent(ComponentIds.Rect); + public Entity RemoveRect() { + return RemoveComponent(ComponentIds.Rect); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/SystemObjectComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/SystemObjectComponentGeneratedExtension.cs index f0ba50b26..534064d0a 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/SystemObjectComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/SystemObjectComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasSystemObject { get { return HasComponent(ComponentIds.SystemObject); } } - public void AddSystemObject(SystemObjectComponent component) { - AddComponent(ComponentIds.SystemObject, component); + public Entity AddSystemObject(SystemObjectComponent component) { + return AddComponent(ComponentIds.SystemObject, component); } - public void AddSystemObject(object newSystemObject) { + public Entity AddSystemObject(object newSystemObject) { var component = new SystemObjectComponent(); component.systemObject = newSystemObject; - AddSystemObject(component); + return AddSystemObject(component); } - public void ReplaceSystemObject(object newSystemObject) { + public Entity ReplaceSystemObject(object newSystemObject) { SystemObjectComponent component; if (hasSystemObject) { WillRemoveComponent(ComponentIds.SystemObject); @@ -23,11 +23,11 @@ public void ReplaceSystemObject(object newSystemObject) { component = new SystemObjectComponent(); } component.systemObject = newSystemObject; - ReplaceComponent(ComponentIds.SystemObject, component); + return ReplaceComponent(ComponentIds.SystemObject, component); } - public void RemoveSystemObject() { - RemoveComponent(ComponentIds.SystemObject); + public Entity RemoveSystemObject() { + return RemoveComponent(ComponentIds.SystemObject); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/UnityObjectComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/UnityObjectComponentGeneratedExtension.cs index ec110c5c1..d898492a1 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/UnityObjectComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/UnityObjectComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasUnityObject { get { return HasComponent(ComponentIds.UnityObject); } } - public void AddUnityObject(UnityObjectComponent component) { - AddComponent(ComponentIds.UnityObject, component); + public Entity AddUnityObject(UnityObjectComponent component) { + return AddComponent(ComponentIds.UnityObject, component); } - public void AddUnityObject(UnityEngine.Object newUnityObject) { + public Entity AddUnityObject(UnityEngine.Object newUnityObject) { var component = new UnityObjectComponent(); component.unityObject = newUnityObject; - AddUnityObject(component); + return AddUnityObject(component); } - public void ReplaceUnityObject(UnityEngine.Object newUnityObject) { + public Entity ReplaceUnityObject(UnityEngine.Object newUnityObject) { UnityObjectComponent component; if (hasUnityObject) { WillRemoveComponent(ComponentIds.UnityObject); @@ -23,11 +23,11 @@ public void ReplaceUnityObject(UnityEngine.Object newUnityObject) { component = new UnityObjectComponent(); } component.unityObject = newUnityObject; - ReplaceComponent(ComponentIds.UnityObject, component); + return ReplaceComponent(ComponentIds.UnityObject, component); } - public void RemoveUnityObject() { - RemoveComponent(ComponentIds.UnityObject); + public Entity RemoveUnityObject() { + return RemoveComponent(ComponentIds.UnityObject); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/UnsupportedObjectComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/UnsupportedObjectComponentGeneratedExtension.cs index 50531582a..4c5178fb1 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/UnsupportedObjectComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/UnsupportedObjectComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasUnsupportedObject { get { return HasComponent(ComponentIds.UnsupportedObject); } } - public void AddUnsupportedObject(UnsupportedObjectComponent component) { - AddComponent(ComponentIds.UnsupportedObject, component); + public Entity AddUnsupportedObject(UnsupportedObjectComponent component) { + return AddComponent(ComponentIds.UnsupportedObject, component); } - public void AddUnsupportedObject(UnsupportedObject newUnsupportedObject) { + public Entity AddUnsupportedObject(UnsupportedObject newUnsupportedObject) { var component = new UnsupportedObjectComponent(); component.unsupportedObject = newUnsupportedObject; - AddUnsupportedObject(component); + return AddUnsupportedObject(component); } - public void ReplaceUnsupportedObject(UnsupportedObject newUnsupportedObject) { + public Entity ReplaceUnsupportedObject(UnsupportedObject newUnsupportedObject) { UnsupportedObjectComponent component; if (hasUnsupportedObject) { WillRemoveComponent(ComponentIds.UnsupportedObject); @@ -23,11 +23,11 @@ public void ReplaceUnsupportedObject(UnsupportedObject newUnsupportedObject) { component = new UnsupportedObjectComponent(); } component.unsupportedObject = newUnsupportedObject; - ReplaceComponent(ComponentIds.UnsupportedObject, component); + return ReplaceComponent(ComponentIds.UnsupportedObject, component); } - public void RemoveUnsupportedObject() { - RemoveComponent(ComponentIds.UnsupportedObject); + public Entity RemoveUnsupportedObject() { + return RemoveComponent(ComponentIds.UnsupportedObject); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector2ComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector2ComponentGeneratedExtension.cs index a01134320..a3d524536 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector2ComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector2ComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasVector2 { get { return HasComponent(ComponentIds.Vector2); } } - public void AddVector2(Vector2Component component) { - AddComponent(ComponentIds.Vector2, component); + public Entity AddVector2(Vector2Component component) { + return AddComponent(ComponentIds.Vector2, component); } - public void AddVector2(UnityEngine.Vector2 newVector2) { + public Entity AddVector2(UnityEngine.Vector2 newVector2) { var component = new Vector2Component(); component.vector2 = newVector2; - AddVector2(component); + return AddVector2(component); } - public void ReplaceVector2(UnityEngine.Vector2 newVector2) { + public Entity ReplaceVector2(UnityEngine.Vector2 newVector2) { Vector2Component component; if (hasVector2) { WillRemoveComponent(ComponentIds.Vector2); @@ -23,11 +23,11 @@ public void ReplaceVector2(UnityEngine.Vector2 newVector2) { component = new Vector2Component(); } component.vector2 = newVector2; - ReplaceComponent(ComponentIds.Vector2, component); + return ReplaceComponent(ComponentIds.Vector2, component); } - public void RemoveVector2() { - RemoveComponent(ComponentIds.Vector2); + public Entity RemoveVector2() { + return RemoveComponent(ComponentIds.Vector2); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector3ComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector3ComponentGeneratedExtension.cs index e0b30b2f3..7caf57bad 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector3ComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector3ComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasVector3 { get { return HasComponent(ComponentIds.Vector3); } } - public void AddVector3(Vector3Component component) { - AddComponent(ComponentIds.Vector3, component); + public Entity AddVector3(Vector3Component component) { + return AddComponent(ComponentIds.Vector3, component); } - public void AddVector3(UnityEngine.Vector3 newVector3) { + public Entity AddVector3(UnityEngine.Vector3 newVector3) { var component = new Vector3Component(); component.vector3 = newVector3; - AddVector3(component); + return AddVector3(component); } - public void ReplaceVector3(UnityEngine.Vector3 newVector3) { + public Entity ReplaceVector3(UnityEngine.Vector3 newVector3) { Vector3Component component; if (hasVector3) { WillRemoveComponent(ComponentIds.Vector3); @@ -23,11 +23,11 @@ public void ReplaceVector3(UnityEngine.Vector3 newVector3) { component = new Vector3Component(); } component.vector3 = newVector3; - ReplaceComponent(ComponentIds.Vector3, component); + return ReplaceComponent(ComponentIds.Vector3, component); } - public void RemoveVector3() { - RemoveComponent(ComponentIds.Vector3); + public Entity RemoveVector3() { + return RemoveComponent(ComponentIds.Vector3); } } diff --git a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector4ComponentGeneratedExtension.cs b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector4ComponentGeneratedExtension.cs index b4b6802c7..1c1f47337 100644 --- a/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector4ComponentGeneratedExtension.cs +++ b/Entitas.Unity.VisualDebugging/Assets/Tests/Generated/Vector4ComponentGeneratedExtension.cs @@ -4,17 +4,17 @@ public partial class Entity { public bool hasVector4 { get { return HasComponent(ComponentIds.Vector4); } } - public void AddVector4(Vector4Component component) { - AddComponent(ComponentIds.Vector4, component); + public Entity AddVector4(Vector4Component component) { + return AddComponent(ComponentIds.Vector4, component); } - public void AddVector4(UnityEngine.Vector4 newVector4) { + public Entity AddVector4(UnityEngine.Vector4 newVector4) { var component = new Vector4Component(); component.vector4 = newVector4; - AddVector4(component); + return AddVector4(component); } - public void ReplaceVector4(UnityEngine.Vector4 newVector4) { + public Entity ReplaceVector4(UnityEngine.Vector4 newVector4) { Vector4Component component; if (hasVector4) { WillRemoveComponent(ComponentIds.Vector4); @@ -23,11 +23,11 @@ public void ReplaceVector4(UnityEngine.Vector4 newVector4) { component = new Vector4Component(); } component.vector4 = newVector4; - ReplaceComponent(ComponentIds.Vector4, component); + return ReplaceComponent(ComponentIds.Vector4, component); } - public void RemoveVector4() { - RemoveComponent(ComponentIds.Vector4); + public Entity RemoveVector4() { + return RemoveComponent(ComponentIds.Vector4); } } diff --git a/README.md b/README.md index 52f9f4774..d813336c0 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Entitas consists of the following modules Module | Content :-------|:------- -Entitas | Contains the core classes +Entitas | Contains the complete ECS, basically everything you need to get started Entitas.CodeGenerator | Contains the optional but highly recommended [code generator](#entitascodegenerator) Entitas.Unity | Contains the plugin based Entitas preferences panel for Unity Entitas.Unity.CodeGenerator | Plugs into the Entitas preferences panel and adds convenient menu items @@ -99,7 +99,7 @@ Implement `ISystem` to process your entities. I recommend you create systems for # Entitas.CodeGenerator The Code Generator generates classes and methods for you, so you can focus on getting the job done. It radically reduces the amount of code you have to write and improves readability by a huge magnitude. It makes your code less error-prone while ensuring best performance. I strongly recommend using it! -The generated code can be different based on the content of the component. The Code Generator differentiates between four types: +The Code Generator is smart and produces different output based on the content of the component. The Code Generator differentiates between four types: - standard component with public fields (e.g. PositionComponent) - single standard component that is meant to exist only once in the pool (e.g. UserComponent) - flag component without any fields (e.g. MovableComponent) diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index d826b3159..9416ed427 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,36 @@ +# 0.14.0 + +##### General +- Upgraded all Unity projects to Unity 5 + +##### Entitas +- Added Systems class +- Re-combined pool extensions for creating systems to pool.CreateSystem() and removed pool.CreateStartSystem() and pool.CreateExecuteSystem() +- Fixed: Pool won't destroy entities it doesn't contain + +##### Entitas.Unity +- Properties now support multiline values and placeholder replacement with ${key} + +##### Entitas.Unity.CodeGenerator +- Added fluent api to Entity +```cs +pool.CreateEntity() + .IsGameBoardElement(true) + .IsMovable(true) + .AddPosition(x, y) + .AddResource(Res.Piece0) + .IsInteractive(true); +``` +- CodeGenerator takes arrays of IComponentCodeGenerator and IPoolCodeGenerator to generate files so you can easily provide your own custom code generators +- Added dialog for 'Migrate Matcher' menu item + +##### Entitas.Unity.VisualDebugging +- Added DebugSystems + +![visualdebug-systems](https://cloud.githubusercontent.com/assets/233700/7938066/ebe8b4b6-0943-11e5-9cec-ce694d624aca.png) +- Added HashSetTypeDrawer + + # 0.13.0 ##### Reminder @@ -47,7 +80,7 @@ ##### Important - Entitas 0.12.0 generates prefixed matchers based on the PoolAttribute and introduces some API changes. Please follow the [Entitas upgrade guide](https://github.com/sschmid/Entitas-CSharp/blob/master/EntitasUpgradeGuide.md) -##### General +##### Entitas - Added IStartSystem and pool.CreateStartSystem() extension - Renamed pool.CreateSystem() to pool.CreateExecuteSystem() - Added pool.CreateStartSystem() @@ -83,7 +116,7 @@ ##### Reminder - Entitas 0.10.0 included lots of renaming. Please follow the [Entitas upgrade guide](https://github.com/sschmid/Entitas-CSharp/blob/master/EntitasUpgradeGuide.md) if you are on < v0.10.0 -##### General +##### Entitas - Added AllOfCompoundMatcher - Added AnyOfMatcher - Added AnyOfCompoundMatcher @@ -118,7 +151,7 @@ ##### Important - Entitas 0.10.0 includes lots of renaming. Please follow the [Entitas upgrade guide](https://github.com/sschmid/Entitas-CSharp/blob/master/EntitasUpgradeGuide.md) -##### General +##### Entitas - Added empty ISystem and IExecuteSystem for more flexibility - Added public creationIndex to Entity - Observer is now on group not on pool diff --git a/Readme/Program.cs b/Readme/Program.cs index 2fda5dac0..784a2ee33 100644 --- a/Readme/Program.cs +++ b/Readme/Program.cs @@ -12,7 +12,18 @@ public static void Main(string[] args) { static void generate() { var assembly = Assembly.GetAssembly(typeof(ReadmeSnippets)); var generatedFolder = getEntitasProjectDir() + "/Readme/Components/Generated/"; - CodeGenerator.Generate(assembly.GetTypes(), new string[0], generatedFolder); + + var componentCodeGenerators = new IComponentCodeGenerator[] { + new IndicesLookupGenerator(), + new ComponentExtensionsGenerator() + }; + + var poolCodeGenerators = new IPoolCodeGenerator[] { + new PoolAttributeGenerator() + }; + + CodeGenerator.Generate(assembly.GetTypes(), new string[0], generatedFolder, + componentCodeGenerators, poolCodeGenerators); } static string getEntitasProjectDir() { diff --git a/Readme/VisualDebug-Systems.png b/Readme/VisualDebug-Systems.png new file mode 100644 index 0000000000000000000000000000000000000000..1427bbd8dcdb9016360d04a02fabc49a38844c1c GIT binary patch literal 54846 zcmagF18}6x_XZkn>||rxwr%ci%#AnBB$+rH+qRR9ZQIz`wr$+(r~j|&-l{uQQ}a&y zbf44x^f}KPtfU}`0E+_)0s?{{EhVM`0s?yZ@qL2+^pS#j>(~wg0$XJ+Dyk$cDoUhe zZ)0L^X$%4)6&#-krS#?S^FW8&G%mdZb@u%lm{bL*pA-}>u{W|zm^aaPwa*yp%3sBV zG$!+D8fnDme1dYiNwR)=2!F;f)}dQaa=~==yI*Tf=R6-xdw$&;ZF+w>PkbIrg9CX) zktLD}$On`>>4g!WH1ajBu)2D#Z$eawiVYA&sG!@>9AFEN;asFIE zJQgf#3=YDK60w_C{RLSd(1=%yNDdq%-g~BQt`Nqg3Ee=0_&f6Ebj@h`euPFu`o0^0 zKf8+nS`p+YWsSNB14y2tRC>br9tn?;xZl_#9s!|&o?rSR3>{*33krvVvcPf^=0RyOKyus1Qzyh@N6KpSab#X`?y!|bF`=0EIbcw&e za!LGL5Vg-r+ICqBgB+KG4p-lB&~@GbE2Qv$V7zkKVeUK17=Qsp3SX!6a64*y1HRK3yk06vKu>f+ zm+2=onKzvh*bgDN18}t7bb4Ee@*oRAWIyK!uo6&QvY+TgV%j!f%fcLkkk6gOO7O#- zc1j2e-mF>J+8}D3j+2nCT_DcT0bN+mkQ7}|ObEirh&e)ErC?M79f(K=QFBDcqcG7y zAVrmx;CuZaqM(-`PW|k&!G2-U1pdg<%etP#IG~t;S`C!QvOA!^ft2VnQva;#?`Xi9 zgxJ#cW=quyyVrfZA;$%`28Y>&aUtCZ(+&pg0>5B-fz1#BMTa4eoDxdTI-o-OicEup z5s8{ppJlJ){|ojje=){vaI-ItgnX7jZj~8LN&ts2Z;r=r12Ya+d{;OgB%QEw3C?WZ zN#G>uf%FX!9x~U5xtmKLD@h6-vxXoxoVxexcO2$e8dG%89Qt62}F)1+xGFnnl(uGp{((^Lwah}A!vA^RlV>SnkhVT-bXjo;$mFs>H zeC2SYyoI>Mag_T^TS7S!B_B5y&riNg%1cd2YD$mEkVvdX0#vqECm^q&orqFQm`D^P z6{LC>7yi~IPpn`NDbgm=(Jk3W9#S4+7s4Ha5CR^e7iT7;DqNHK!GYWrqIp8S5Yh zS<|WO1I`oXyR$p3Q^o}^r%FdD0N3_KVs5ZujA7Y!XuhlLc0z_a&r#lCuRRSA$EkpO zfa`sS?<8ll+rG%w<*0af*sjdM-Xb5H>L=963!CnV(^kF;?@x-Au17D;&o!%IX$_wxrM6E zWn8u2E%V2QPvU(`Zd8p+o0~LU9IuW-Ey(68=hDKvdc}HY`rVBot7z1}RD~@}ElAfx zJu^LH48#MXSPAyg)sXM`)~MTw-XQ0L-G1_BY{V!fF?C&UU|g?}Jy9f(d&+YUMFL z3A4qVrRm1JnR`4u)nHFyzl5D31mNCTI%gcFKVD1RNZj?`$>XHf+u$so)Hk`q)sj2O zKC70MX=n}9KU$WoDXe7FzBb_R@xnT_u47l#u*v$;@68G zzV*y@&Em5=v9s6F)IB=drvI{j*%^*)E96tGn@OEXtTWmn)*9z% zzGuI;Tf`x}+>3D*|ND;p6sbZ&w{5wqHFrPdy$*N2twQhA;kebk=dj;D6_ImdJ!k#L zS@r3UqxwVZm$AKueuCwUf@P-$E!R^wt>=V0og?63hyB3y_-#vAiw?LqxQDNS?|pzO zBEtIiikqF_<6A1!AyNUMwVR(y+_n0V-6mQ*B}NDC%NmmnmVCF^F-ZaNeuWgZ|0nqU^Ti{a%ul znw1qSA&Q+7HY>_+dmGeQ3lfAJ7UTybh*$=MgqOqAQx6C-$jV@2Z_3Eb z&CSio#KOqJLjO^M9^hi_VBkz|4Iuryk$>9}GX@yio7*~=+gKC*Y1iPpjiUoU3CW+1 z{`>qrPGe{D|Le&b@Q+v@0y6%|VPs}tV*Ib|kE(osQhAijosBKk#mudYtpOi>2(WQ; z^8Ho*|CRH9J^oKkjsL63&cyM*HUB5)pPGD(e+2j+f&QMYzfwP@O8}OS@xQ4TfW1_9 z>Hq-|0+ALI{^|^R(qve^0X2HV_&F=|=(22Nmr^W`ejv@Q#rCOoir`8qCJ>D3_4%Z#$D}$Ojlj_i;bJ^vODQRQ$Bq zW&5`di@y*}w}Rt)g8hx3W$u=k4rxu}aRYiU!++y=Mfc{ik7y=vr2m|77G?Q$VWVz? z89QLY5YB+}pN`?ZJtKsY(tP*34E>3ZQr3=F3T10IZMy*cbNsutx56k zEQ8kO4ZSY+9Qo_p{+k^_6zG_80x0R`RemS&aG4PyO$IuN4y!vJx2L8TVY-7(Qon+1p;mbrv!r;_O4$wmw&d zFtEw?+7Ft>byT3S=#zl+a2z!yTjeRj-z)Ypb|Q8#$w-2>X@3#iz|!BNzA>MpDb2UK zdVO~A`6R9h(BaJn{+kR26e@c9_?Rmaa~iX_yDe2}OX>s_Q!;BS%h zwR&<=oF82GU1(5|D2pM=x7UlqffQ!{w`S$YzkZcQjg0N*6L}Jme>vGXU zwet|oFQ*!b?P8h#vI(MB_$KZjR?bbk{Ygz~)(=KS_Zxk2B2*8}tOc7A>d#XHVRsS+&()%WHMxpmdWcdT71xum7L|V$apqj*AUoLBKDzt$YL|$$F6u34t8P; zqT0f;G8>Mu+C-C6QzU8?y74JEYKwAzSsj)>G+TmhY*CHm(BP%-YHY(uQM0do{pK&W zI-SJtoD%%@BJpysYg9$t4r8kw@u>wEvm+}llEW+9hWTbnRp@j033ok(d7a_miSV@X zP4^MN->~_Y+HGmUlP-Zx%olwToq@bt<+fzHFTYiz`Q7sJ>J?~op0zj10Uc}pE!q%P zYb4t6SJYyN6GytFelWTf>nyzKgLXL(< zo|scNI@1O#7FoyJvGz+ZCS{WtldEj79s7JQT&_=$b(4)nXJ;R2EZ|7Ce+_eYxSfmM zE^c!ET5<&kQhK}`<;m=E|W-j<+1;K+%Mq~>W% zD7m6@mOs_YKCR!42gS-D0vFgyj262>Jh^seqR<=y_J+x*8~2?i^KTmfhw$DMCr$Iz zq4SmfByDW&kNaF66S4(cWMdUoB0rzk-k03SD`TX-3Ee~@-;iZr+on>$y~Ti|OAcuq z@pFVWZBK`0YKqQZK4KcLLPzimrC$rPcdG@exOFM+61|h^flt>sPNz#e>2Wg;b)$oH z$f_<+xy)Wa=8NSUx^y=5kK)cF?dkVZE@OaJ`E}=FtzM$*jB4k_6G!EFew9W!9DN+mV6^ zt1ZA|^5uIFZwFpweyOFLzbrc{5qc)ABEHye)_&8hEG&s#88i5+KX*~d_uL7LfE6odBP0J^ZI4_?Ypef!d&@Oh%IcA0!uR`U%Zs`QmEj;J&SZ?I+{eRDER77SpTr^^|r5z*71DSVmy^6?fLYY%xbD_ zPq8ZgGm~4p(KZ`x`K-U;;;$3uMjQf5#jsx+c|$xS@@Z}f6sE$ z-)DPgr%=}TtKadlRhj)z^yxzprg8TSvHjEFx5qoF^wdcw_OtuN^bIy%z{6$9?A043 z0*n2+aMSTPEVu1LvAavH?)V&AUYOo_fIla9=#`oRZ6>#6<0uxZDq^}It)5OhooTuT zzrRljUNIle8Zd$NEQ^;+0jCR|Cz5%WA{lVrdaYn1GS6hTnYaor@O)C^NoruC$r~;( zRa%Z#&nB>GlgM|!0;o2hrkJ1Jri6PWe*7uxNo0`E1Oe~u?FZ5^cv;iE`Zny()8TP> zs3F`_ptEDzSY+g*l^=fhvQTAct-A!xZCfoALBO9*qnY@Od<(;I4_LpCbf4bU4T=5O zRW^MFsB=7kyi!{!oj{-so*nGtOVYv5c!8S*aq+uBo5Q>ox)n?H1e9RwB z=bZ<_*W0W!6e_NRxUaRku-I*hy@TC1t{D7K9%P$IRmO=5CX-_c&LkMfo9QB)k(VGNJp0@Z(&v^v7JV3QF5_ z`9QX#b;G}=^8%mNA!48(V<;XypAHMtcQ3JxE);2ASd-$(jsL(bp*13*ibx4PEl&`cXsxf`8MH9LsLhU00)2i6nm zG`1>OyAVe}@WD)61#c!rtF4wfxLvODD9v1*p6^c4`tKSn7q{H3?v6UF~na*=9Le)((xjhAhy+^x8aRcJcP=C`)I)fc*I^D4{h7WjOB&IuL?Hc^iK z=W=12ilW}`?qUSf`1V_pP<$=4RFi!*o=1R?=x?2+RTU{EQajVcCKRIBHYUBj6c<17m^$EvlK{@!iKA+QA6 z?$_LSLq{uVdK#F?R=)~n6z_9CeP z(xwx=TvBn&R->D81#mH3+gC}qi-|4kmsM+AWaHc^F19&1OFZ+E-1GK$q%xyuw7qH(6BD^oC>AbF#LO@%99?0Y5A=6a2 zLP&@Q{G&GB?cqOBo6cNPbj`MO8f#kyA;z{h4duC7JK;Jk17DO2lbr+%`a&>pr-;8} za+LVg!zbs$l$fW&>$zWwKfa!Ooy#AXy>+>15^V_|nJv+z=sN2-v$^zdu+wc$_5;ei zEw~T)CX2GPDgL=-91hl^IdfE7DChVOd0 zUCTe)>+82Jemyf|GeA(rX->gMhEIv?sJ=A?7t6lcJ>P9^e4X|p{})hXf@lsD0tWL? z-+qXZVu`6c8(MV7Pkza8$U=}d9(mLvHoQ56YtydbG~NF*yHsc< z^ReEK`|&?Rc_IRn*z&l@*NFb_7KS_+#N8$+yr}*vcw0D7W%?I1+^8o~@;vowp?^fI zm9v2h4jh|WOv_R6RnztM(u}az^tryM}joFc8 zUw9$xMYf_i;7V)j8l;4kOTv;hiE<0k8~qn}cV3vIYt|cQ7nVZs?Gl_L4fx3&Re$tw z(pii7qMopQZHeE?aNmOISXx?tU0r|7G=c1~*Vg_@MSdFClX$xFAx(8arwa9Hr456{ z#U9gULe62#PM_AYx$2pi*|~YHW5vAfcgLfdA_m#-fJpy3braqnR!C<^Y(qG~qD!av zrz%PdBz?POEGw5sNz#2R&g#)E1x%QO8;>Mk_CjW6xkLo*bbgHU?30D}P5nNDUWME- z&L{oqlPwzfl>aS~d;jd^ghoc!^^n}_@nVxS9fOia+oqywl=isK^!omq4r)ZD+M|l) zI#z7WO7Gc<*W&0}q2^I{y2y>qxs(M^V@&-VqIvOoRLb?3{oz+{ z(p!M!8jmcn{2lF&4%JBzG8_{8cN&$D^dz`xA*DpvtKoX{CS5pCJ>X zboHv+^Ec7lYoTxd(qn_@VCMbAkstEo-dO7E((7h5nZImv;b9mSvxsV$Cix%C&<}%Y zDm>#`(f%Y;Q}YTUM6{q_u`IPbdYd&FaQsBNLOO~MT-i)aP~Ac-m%s8Qd=V0Ox#-cV zz0*&@3+(xAeJ4&%^`MPSZa0{3s8qyv;Y+Qe;VLWxo6cE**r3|vCfFKOUO}xMhC49n zF6`nBUu3WOj0NOq6NhDV9NfEgRMF#N`*5Jk``-|=>AZc_Yh5GcwvVH;BN+IFN7&x6 z_AM$wizXrf;p`Bl{bR>&x1T%^8t3A3xgO)>9pc9lz#KrMRJfraCqL6SKC^x+QL9J@ z$K@<2eOZ;~q~^;DC&fOsRJO4t>wG%rk6z;wZMHjaf41g!f2d?6?R~tNR$S*m9RLul z#oDHaHnfX}et!H!7p9}qnCF%!ny%UGP;~A$_0vSNGX@bXRA+;4&`6&s>(qhgGuM*+ z1T`lN0VE2&b{W?aOcsAv)oc%v;K}jycsg%e%+E!FXxTkKwv2`?Qb4L`0E~aeqTQ}lrYuTI2W_`iZ*WDS{ zM7f(eAT(6I(&hUr06N^|Ln5^?xE-XI6lX%&!ee|;dQj~k95{4uJnlUdO~#sK1zvBy ztY6r_ZU(A7U_O=Ty$+inv+IV+%Q0F;ehtVVx8aBe>PpH>6(-iIvJO{_*2Lxkq>oMx%7M z9fmG%G|CT)5>yugF&$5fcDder9F7bQxz=fMasd`APh9(@N(%8fd}rFu6`y9!U^9== zZg*boQnZhzdveTQGJx4JGj zd3^AlAXG!dLBAkG%& zV5`;z&4Ye!X#A8f_+J?kAntp>OMhzqUlD zR#Yg%>BFbo0i(^m(d$_;_SB3F@zrpc`3}$XQ=ZMLDU2<41IOdp(vsP=pYzn@Mj4~@ ztWMdJS&T!3g1nv^yp9LH5h3E}2L%mB7YF8JgtS>dp%SU}ue)3#Q~JrRP4M5RQ7UVf zl6=jovzT`k*(4W@yAcX5iHFF^j;2JK>KSddUggolHsAPFtND2>^HW;w0sP5w!vq?} z!uI-0dCOT$ET!U8mRaOiOC0A2J-1VKJ?2}NAX(=@NVQVw3DM-kR{ePW)=UCAF{ypO z$dGYpQEcT$v!+GSpGSETnQ$jkfR7VlO)flv;InOr4DSnkUX$1R+c*-|`)yJ?N(Lz5 zWzzN_8fRnI{`{5S^@ggP6^|e-_XymugAG2ZGguOfN4PgKG}npL%&hkVsGawWtAPS5=wC1#&^-^NuGD@*4~yj-hXauVbQSblLFRVl(PpUxNv5KMcH{cb0au-D^6m)gN#9 zvrWQe_z|Xq4Bw8jPC)NKdlO6BSq~9GVKNC%Wq(%yTjKLm+>dy|Aa5%|YlS-U9qJVM z>7===f7bJ)#|LXX>EmqvLa#Vu4dYJ-hW_sxnDBx`#pA%Zi_6z85&F4Xm+tDI2Uc4kkU6=O!4!~(zdp&N+^7@l)C$Wr*-fSI z!xTm<2uP2c9oSBy1V1rNOQ&94fC}Eue5oR|1zsQs5T>&Q5K|E*DLN(K<3v}IZAu14 zDu_F)I;o`DKA9buoi9b_joT8;t;BYduWlzFycj49$RQOmYBx>-wY!a__xTRneh(Il z6Q$SE$-N8xb(c};#uvA$v*0IbOrhf-m}wEt(V=I2OAHI z;JgZ*T6tvb&~l`#v1IPG^I5-C+R?ZK*Wh!%QDbUK+_9ONnFpdBc^oO*(dZDd z?O>-*i_C8)%(uiH&!WZ!oBIS9$@^2oqm6uG;Rh!+G|Vn69CGTTa`3c7T{7}-(i7XH zWG~XglDXcXF1;}LsHa4bJ!JX#?w@#A-8)AGe?~c*S}JqJcrr2UFM;?4C%A2lKSQ{c zS!k9z$ic;GLKF4?J0GrJl1bDnZ zuixMPDvX_oS;IZ&DVi>6Tx$0s&f39yp}0-5VW;}oCWxoF0ecU3pcYs%Lrs8vciR9N z^ZTUOUPqo)If1^dzJ|NDa}PzQlZDN|uk3gUDj4k+OCy1Vo(o=y?#J->N5K3|mDBja z#eEqTnJx6@$!Kv4!}NXI!G+6v-~eYP?36Wt?ljKHoYA&}{GQCyu-f++-1!UN5|@@} z3oa%#o!u*_E94OBNis^z^~YV=D^8P>VkmSbBKs)2m#~$(=`~7^{Bwn02%f!_88oiHQ7|s z3gK(Dp~;rBYaFHQV+{<9X2PSEIM`Lf%wH|4N2=m(PxtSd0n*^G&j{gD@btMt z1NdX2*JI+EiSgw%i1(h4`IO2fc(5ife{uR8$rnYRUg>2yEl`8NW%Kaq`TMg(Y}!@U zG$$?JWh`8MUoi(mK5qniRZif6|Mh6fv~=a9yof~!aC@1-U-#s!Yrjq5$~0TGb|3@XjDBRwCcczSibdo|eMaEkuWH+E?S> zLw1|?pC+gQ+8>y|i_O&y?{>|h-_vHg{=oyz+m^S?s^-jBu?HAB)x{s{48dZpKv`1% zNpj12Vjz^o%eVSaVTH(EH^l9OnV6<=5>cnag-*U2*Gv4)V=B{OfNa|WK`ig;!Zz6Y zg6p!5<8519M1Fg=G;-#&+sy9y5^oI|A#XBWxS!Wtydv0BH-X6Qz9JT?(vVMW%78i2 zkeL>JH>E{cVO-#6{+Ud?lIJOTFuVwqGva#V+_NE~1ARRnirh~17axsm0cexbz6$)z zv6t%@0#IybQEorg=I|E5^+p9Fj>mM|*@I3*6Y)K3 zpRY~9rV}+;aMBmC(^h=;h-sH;#D5$tuKq$4ONY7`S()PFT*0CXl~$} z$9@5*E8y z0k;_Ig6)NdL~}9vw&h?UhW3`yXs%AkU_24ix|(XlePhdgoTj^74wn+g#+d{)8D;b2 zxTZe6sYhy!dOc_aym3)=cfZ*QmDhf*<=v_q1aCPaq5ULrJ#~C!5+tn&mS{oy%T?p_UT+N;ZQ}jyBYD#9=4~!?VuXa^ znfO6<$Rl4Qfk{i(+WE+g*-{@7Pd29J6ikb#8cTAE>V04RJJaxskAM^#VThq|V>q;u zS}q=^S>e}XXKfU(r|Hb$r8)~6jaxJ9&;BR4ElRPIM%;0tFOose^e3&!8WD z3D=d%JJ!$Qrn~nD!IB@&T%W#r#PojQr}K=m14t?20RhejB1D^R=WX*|dCs{cax;Mn zfkbivY1h%mj{Fozc=5=A!M1D}jX`-?dp>@X(;44iy4mS)a zXC3>GG&DKVKF!z437|Z)5}_n<+2!0@_V> z?-IrL8w7gqb3z~i8b|w<@hlElB`Q$wPwjNdbj{`?`R|h6%d5C9@F6?k+WC1_cjUPn z319A@LnA@Y42Dv99E;yGZkA05Upy~KCmM{uL-!I#jh!P!UtBAKoTZw(^~ z*1z;3Cc1DjbwN_c;-)p=tb;ngTn>2nf^Ld#EH~KPp9xnkr6VJt@sV+4 z<$mTV>*$=0y=n>!8?#g*XRS>p5uGF_Vc&%+tRi|b+EMv;g#S7Z;UkjP?j%X7;hi z4rcI|)CxF!H3gfjm4e`iphx!~{tnd4)aKPM!B6D}jZ>ic#D=8syBp8BYZDp#%ccX& zx0tAs0`D(?_w>iu&dgsnkx$_V8HRLfqyE`7sBa8xc+Vec=VBf4`U{Q6JEngv+Udul z>9wt$OW}RNUgF#~HiMywq9ruv>9%=}t7YfIK`=jdtOcp{7?)1;xJc>`;%f>Bj_!v; zBcYJMLEOr51Y}A`O$W6oh-b$lr#XmX*UBX!p-i!2CqXkU+HZFIrz0uqWD7uw>+F20 z$Oquv>qHZXMM$S0QkeiCu8e{t_oFJ2np4A{Kj*f$Z2-lW+&SI#@+2ksUv!W^1wY>f z$v!qBnLM3BUc-2HaH`aF1PHN#Exw%P08U)%)}y($*W6bmBk(R$XvBu0;IbKYnrApc z*cbr&pDl7Hj#yjLNx$D> z$t-mch+_*S>b;KgK9kOQy+y}^)OH`j2GNIfQ{Ht%$W-p5+_)u`l|_bf zcMHE3^($c_esMHb*bBrx$R$iih!Dqku7JGK7wvtTau(%R$y~5K@QZ zZEuZQBEg138y;>}i6Qv9WXKEJw-MA8b`jI{jy2*xk`!kfqVD6wT24-4_lRzl10o%w z^bJSrHky$1y*`nF&EWI=3e&UjfCKX$N`?8Z8R>I>^N^pYd$m)NCjo^uqPhYUZ=Ees zdseWXR1s_IXZeW{d=7%f6T6`6ya_2tK=2lz;^C&*{;N$uaR%7Q-zU<+-!9J|ArooQ zb@MPY=-iUy-V2SK+9Y$VdATjqRx>T^sWOpo2e$h%{M{ntj zlw}!3Nl2shupQ7zJU*7n2@F=?ay{f(ZW$Sa&zP*t5}sCyp+sB9!i{Xn=qjZz@{9oK zp)>0=@Qyop`2J003NBEZC-S*m>i&8Cz5P8O$`AkZa8JW8F`V{_{idfoHo;|Fuw=0; z%5@zIsn+%6X%}j?&rAA3F~!PEstVwridX@7vD)fpQDz|KJ7!;*>WoFrW^z2&J_Gr2 zjVsxnDZyqgE0rpU4URYl_@f)oVZ&4Ta-q}Qb9m5|ANP-zLx-0?BCl=YL|W@Q#rC(d zsF7}FwbuP}M2`JUaR~a?8o+bK?5PWeW}S zS`hS}?SD2}g-l1GXs(^Kn`suIY+_+JO3QlrqbF2L8)ze3&?EK~E{Kf72 zWTD?vgOm`}kE@3OL@LzzK!qi6o;{~pTUX^pmO{$-t}|?~WQm`y_$w^wo)l9xHjHRg znmCVsLKmsqT(~hPsDU?s6TSY5oe?!a8~ODnU;YrwSjIGM`YTkb4}GHp;n3}9lSxEM zHoiq;;&gUeQu*)?SOSOimP?)=LljW@5yoHmHzz}=LzIX##kpQd`BdNwe}ZNF^weLl zv=e#I3nGH>UA2Htofvamw{^3!_?LPJY-ryr5KWLbZ!{efvxdq%5S??rIi7c7=T&r< zKA2VaVoERU0_5#TP^X&tzO_O|Rp@UjET%VHqL$I{3x@sqi_2Bb`$OYbwK$5;ck8du z9VpVmTU1F$oIm?|zFx}7arJOsC-j1DzudmQ*)1;*Um;+?B7n z;p11h8xVY}+SsI)xfu1sEVLZ?AP%&dvbQEzErk8Uv=lNyrlO*;vv|?#*n}TJn2*3^ z7fTo?I7eG=KF`xGZ8}@=cO1O5L8MISBQ{Ss4d{(7(`tBntu`Kc$#C;KoKE3V^ikz@ zI8agyqjO9-7Zm+KKKHFd8S5>g2aPn}=ChnJ;bbXvRk*^L4f~y0N4>$Jx)<~LkP72j zd?5c)K79~krGo_gcGdYE59k?oj-f3LL*v(o+z3l?Rr(A%8|xPtSnX#$6_um1LC6(o zm{U5#4Veu>kDKUwb44a8+=)2B=fw$#%v-bVCZelSv#qZEfKg&fXnZtYzoa6=H#r=uQa}R-BE8hXyiq@?Gl}>14hQpupAEA`KM~nMIC5e|DLVnj;R_#hY zn~vA|NVkUz1MH84f!B{BB87iWAl;V2@8<5AL9c%^6G4bN>27#95!aT$q8o;J2?_6T zuG0;R^Q(&Fd9-oYetR>lZI%t9evmA9CklKDW$`)o)Wv(mxfiFHl9x==d+V}Fj{<`6 zfmVfz+u-~f2N3LY39`~7j)%4dk?zO=FbCeJt1a_rbZvCCj)R}4-1m}A`3ywY{EWMM z?oO9qW&6Fj4SxLi!ADKV=d6?j&1^J?{B9O??FWO#S5%?bu{Pj6qgJj>9d-2)xF?oP zWVqc|XJ^oBKe>iZ2=uEB`-l+%&^U37{zM!uAz3L2Js%8g$~jRd0+)=8{}7zCNt8H# zO-0uMEO*fh=k7SDsc7Pa$^GruN2~0&PQIC2SY6Ag8VFa-%+2x8MC#kA=`YQFaPLOo z7+W`%zoHBH-C;bA*?4Z(d3eS63UZU$xzZK~Q}Sc>s`J?AtTbIw+PB_i@jaHj)4@d& zCa#C$)2=r&Ta02id?A{d5O^-Ff#$C%ayO-GRtSDfDyRFXS`R>u# z*=K99O6AwPF%Q3=_r>9FgPd%`&R$_DJeb5l3q7ybx{io%ps4RVv5GIYpAsPHNdLB3 zcs2;w6`M|6oYegMCh3%v<-A$*ZT8!;tH*iMoomr`SA-Snt*I5~*Uz-2-^HKha3e(W zuNDj=53|?Tf$JXat9os&j{A;rOcb=HqU|+sMx>636chm;xaQFgoUMoJOEV!aRY_Dd ztzJ})>04Q=Tf102J{B1}C6sJF>98O`?9I>=hhQhdV}UN7^INs>_236nVkc1WB^!7y z1w~HRRp}bJ@AVO?HU7YkEap>WgoFtEGPON96D13Wj$2~8DD9sGB8Nx*CJRkwqEOkB zd7hnM7Y6gjIL(b(u&d>@)d`;^^T_aMrtTcY)2gg1QI=Va=^h4mi(t^B)5O)z>$;V( zVhw1E28#@dbcrnJ*_oTlRu?1)uZ3+Eu=2L8CezF8mqx|7Wk$&tTIAclgJRn`hr)N< z)U~qPrMd5dxJ)KzoASupXRrcV1>GCnPl778_Z}SUJEh~#9xk`rjDIrkZf+hu@_?F-uc*_TeX#5aB-vd3s(}B}NN!N{yO&(%3phC0hZk#1^T*7$ zN=NVRE41TE=8rV0#~Sv_=5g_XeOm6s_O(BPaAb?#(6LJBSZ9^%p?%{WpKcC4D?-$t z^5q4MRHg93aaE>3-}AOEZ1?-e6J&HK}PNdwUNjrEF4+u=ZBmKyiel*%%vopotxc3PQXF?q38qN_9-I>f5ty+vvOmsU< zRX{XCRJI_8mdpY7qfQI9N?K=*WF3WuSMa$71MLY!Ks=eHExIY@IsWqBUvJOldAb|0A_oC@E4$g`7AFgiC&Uk;V z)vB{dJ#2$~5~s~tz}gKP4lnHPXfHX-%QC;pqRR0Qjof%167o0e?<-*Q;7>Ej)yw$A zYu4WCzuONhFGL*sT~wN!>xF$kJ?={v=H_l<)1D)YOB+|a{dIocn0^?8Gf-A5x;8E% z#)R`hM_c`DPLVM_XNzTkyHADZS9e*qE}a@f^X+V40}q00!psrv_%xh%)+0=91J8KE~l5Vw)|4#_wL6yv(-Y6~nt!J_{@D>MokarnEf!JmN z)Ky1Y_RkwT|2WL-!-XW+E|qg7^3&qekD+Q_{z-@Tb{GFSWS1Nj7R5Dv3NYXp>;>1t z`PUQGc`ETUds8kbd79NbC*R<2twJ;b{y0klHaaVya(e`Oo+seLMX} z=vj>4V4Hw%e2?%Kt)GH7u3=Wnm;L3u=WaWdMmBwWeO_&vie!doDdTYQ7HO_{aN znNh+!5fj`DKn2m1RT-{Gfj2+BT=$-5i&q)bm!P%(m|Rj&-f--gyMix^9nqX?uR?Ff z74t21JmoEY+W%kJOmDWdh~IS-M;GTKGP~k&zv@}Xk)}dix^mYEj^w;gSz4d`0nTty zZ3aB#c-u8sN!YB-(?t_;^Rx5iCAgI+Rn?yAeh_Fr2DRwX5w_mf1Dle^LyxVo<~ZiR z&F82t9$LG4P`~&}7Am9iC0hACl?29Yj7y1P>Z zqyz*}S_B5^?k3zr zH##fq?4Ai=effv)8eW(4hiY1q@D0CM@^`yjkMpo@JO}+ym-N8JX=oI`CFh|j869^j zT?$`WNkx^=5vzHeA&=rwlb5YzxQ^+GgfV(?OBt^dnH1$gyREB+>Su}*Tricm`(X!xi08&& zC>~~odvt)&dmD18RJkwPwjx03E2{i6XXwXoiPg1@lkKsEC>7crO{czM2b=bfIA!M3 zoIrQ0xW*Yd-PtcltW*M2Itpm<~{=0!-H}o zR`a5z80+_3%s6Fby{Jn=l)lWvs@&P9QRJyxghIK!SuzohS5Y}mJO-^uE%`#aA1K>Q zQeB=exbCtXyfNROt4Y~7f354%!58V@^7DId*VpcW%JBN+ z1Z%Q6#r-0Fb%$`d1>H917$Ulad8gvy-&bsKvEh3Vc7{s<{P zKzFmVMN5nFNW*1wwXG4O#!jK~`29~>vVFHbYvHxW@(mp0k2z=t`37<&XLFKs_Xy9q zwOIq-H!+39G9tPmpZZ}v`;u%YqBJvK@WYDrXJ7Zx6C%Fqe$%G0U&t}&Cva?u@;19m)q!vgIkX%+dDWgkiwAC0*;Ec zYet){y{_`Sj>zB#4-ZpM<`OXvu-vISO7t5$PnpRWXo|vB0%a&X#^bP9k_O=nCm}`{ zn>fr(fh|@x7YzZsPYf8)4g!_3f~nXevFS-(ZFkp7Cu(aA&n(bBkPhJdS|GchB%m>< zQxwI^S5rGN(8kD2e`c8@baRkxDGhNN22Bu<3Nlxin3Dp9r9u%66AdPOhUtTV<7{12 z)u#%gEpChALpa<=pS=t3c%@k8AGYW{TNGG=a4zF{vij?_aa8#F5t z&L0jQ_#nWv0fTXHVWfA&k?O4iJ)?Gzwrm84-p2==;%&azHQ~kuzNSQ6bZ==|`B})| zMm3&<_Q{XQR!*i;ugj{FfAr>LfJf>hj=_4ST#JH5eiA>7^WrIV3H|$Ue)C+KWzFyt zB1ZA8m&2bk2|{Beg@m<(UQwAZ;J4PTCS)QBHwPUZTW-BnAs6kn_jf|^8Eb){y$^vZ zixh>M5;Z3aw$+&we~AtX40g3zu9elCXsk3RUOWpF_mW9Z?{;Z1H;;|opf&yA=)YHS zn8<_y>tWs>7qtP%zgg%v5XRToLN5%pyC~WR(xk!Jeis9^W%9jSHqS$}%P6r+yr!HF zGCY>bXK$!%9{SQ|gb}z+Ft0qEUT$V^6#LP%-^n=KTFh6~-Q?ksmt5@Onm!8VX$~)a!uP;ZR zULazm-fX`T1~!+4HN_g!DYY0BQo=fEyr+7dMh?(tUHc>M>f^8aFTRJH+JQV2JlQb! ziZMjT{9gQ+*thWUGB5S?4*b5JO7d8BdPUUOm@UXfr&m%7YWoV1w{U(rnG=2aNz7iO zJ5C7+_jOkVx<2G=35VwH(X@RonWxnpmnvL4nK#Ocx=~4rSqL0W??o+FH6pLp0^d)KYBG|&l_ITDbh;+x^qzbpWcD4o?de;;RC*%x9HA_|G}vCM~T2uG4;6GZjUMIIg=QB;L_h+zuU zhx;T_0E2@KS7OW<{d!aEzJ{XM2zeFIXtxE@`%%bv<)bm#^_ipksstoqJh^WaPQKla zNhvU5#q8yY-R4t-1ZW0#aUGdQazFFe2&sXzxQFxjE-KoFxdCx?@d5j@m@u>WnrZgE zQTeA9y@{`izE-doMjgO-kmDS?3h2m_;(%iu$#(1pT-R5`^;*A|Jq*4CL5PM_2SoR4 zvPK{3A@aHY%9fX52PJf}0=?f{I({lw3T4?oYcSvMYQfpkV-c+WH_o(s>CbbFCV`zl zSX?4NyXohWY`yxYFy2}_Em-(a-j8|R zkuWgQN1I_TE$$1@cFjNY%ZmG8G#B~sQcTZz*k|3-ymO=VriaaQpAPCEl=TQFUS#lj z#0wsw%yj(Qi!QOVTjOxqGZU=(m`O0 zHo0ECiJ6Dvpmcem!?${g?W#>i&1yu+wj-0gPRWSXxj<9TZq$>o4udkwqemB;=)vBTanru0xJ2(iLT=r5wSurFVq z^Rt@2y7^t1UEgXjCKADf6~m#hlubl%*F%?f@)Obv$vDC*OvQCp6;&C+zY(W*Qidek zNBs_S+y8pxU#uc(oK&tr4c2e943Vp!)|}f|Erhq}{`MfO8GiPCGu7}ieRg$;;wPcO zURjx`QI!KvG+p{hl26%hUgVtF)>Ys~%jyi6<_mdDXlbeWwDXZj54WqS(kbvhE$}eY z{T5IjBr^R9%_L1lF*)$NP$GO{X}Dfp*?S#Az2|=W3=;1fysHEdT{EGp*!;O!Uoo34 zSl=}bre2|{knG=H@yxcJf-gUY7L#i8OLUzU!53Nqd%nUu!c_9SL87gQp}2#g_orNo zi;*!y*xlp^d=}%=ea))8|7*h0eST5u)1;DVv#9^G4(&qbegs?Gyz2SabQ01--W!g@ z%|2hLulSmIX*>2z;G^)oxoy=fmFmXwdfG^Z)k-+ z#Gb&Xp2ntP4k*fdVQAbijEKwFnIH<7=pbwU8*%Hyk3{z=P78;F^jp@#cNeQ=z_^(p>QQ^{ zR%rRe>w0$asthmCot_}IXeAZ3Ow9G<>$yLV>j|`Fi0>ydGeUMS+lNyT5#Wu`Iy!n# zA@-NCxW)7l<)Xz*kW5!sS8x4b)fdZh?0<8$TkK|=#ABwh+2=z@)zIK}{!ldfpk^~w zNpApK7?*Uc6Omy5IY&#=VJArn4Jpq;*qO(2>w^RVyWDd;MHzU|?u0HWK2#*j5VjZH z5@yycX^#2@W&}?_lYM-Cez16OOf_`6J4q*s_dbFL0p*xZDfxH%5SPS4{7Rl;(#9Aw z6H`ck-{SvsnNlm?;0Y)gL8gd0o~ zqrmUiqh|X^ST4HusWSpO%rTUyJ6|pD3KL=GoIuZgIhfcC;aT1Lo-c#;6J1<1p&?_h zhMrA3vkIbhgJ#G*4^iIRkyn*l!GzGJ@#Gvg)gxlmaD|IKq-Tx85LoaY9EJ^+>>k|p2 zBgc0nZ<$DDjC6ET_$as%(DL*1KU>WH=xGf=GXh-m9kF5G%{ZFRlGkrP3JBVup{Fq? ziGN5gx*S*TAO}|;PG>bo!=l5a&K>bNaD7e6-G~kkh$-k&>(P#kj5Onxm`$>J5$tI- zjBhE=5$1Vor`-M6* zBlg zyK0k%ogqSCUu6vkL;U{=S~n{~#qPJY&v+J<*Oe15oSbJYuoe3T3J3Na3`t`!eE-|C zvXiP3t7ADQM2o1grQ@^l3GP6u!eNtK9+z+60KZ#gy5Blw*jM{;^dY2*^ho1Z&aGQW zRr(jzB`xeWU2-lR9YAgKCl$#9&qq{wCBgT0fN$|+bw4zRtC4&>bZo$n!_Bjc{O8eF znAP&XLc0$NttTD}_f&d*mJsEKsjDkjk&1u0KamdLhjn!QnKsAykBPnFhj~M99=tvL z>kUO_1qTq%=Vzn-cRSc1g|=T`pjE8=J%Fwa4xsGURnh(ZMz&TVYb?R#wM1g!LosWD zP1+)H>xO@8q!&(iU0QtU=nT-uZB0HhdCKcqRT%!f?2yHd*yc(a{X|Xb(`|7N+~M<)Z4ZRRtNd$zmd6Xa5B| z!C@-CS|LsMC(B?DC%5-k6*2CQPcwV6y>A2YH7PAAS!382wUI>loS*cv-pim7*c-8g z8oWzeiD?zI!z62W?vC9SuTzytijDbsf|B?*1S+YG`D9#}W@jOV-YAp0g|iT9 zQ2RoQAFBYhpsUgI)|J9?y3EM-XiaXBA;Uep90V^Y|8|!48+QWEfrdn#TKk@$kY1TS zi|g4CI96MmFI*iiBU#iRO+^08kyfyqzs*feO}UVu(1-Kgjp#H-@D3_xCa3tPq}q2* z`qd{*A=fM$+aGTX_@32)ZSKHN3ypMcm40nd=-}5033+`N@rFu@zdm93>QS4r00z%v zcy_v~P%SCCWzIDQ=o zJ7vDKL8Lv(JjhaQY&fatN@@HO@8o|N#YdYu(ut-BZYd(k#zs4KrA>%ACMMU+ zsb=8U)ol07*4fJ0Ah^b@)w!PwjjC@3VJE`I?yd{A07&JG7TOuWVPt3=h>ZhDDmCrQ z9I;MNI2%_}b~!K%jo|uG55}b3=Z{1CX!v8YZ@LM>l2I+Oxm8tEmKC?5`rHelhTr{< zFTluFux<3RxqXPH+Mb3X&3;8I{?`-l1LvO{=~;mj{sI_(M!9RmJ|v6>VcKn7$>kY^ z<=gLh&u;cZ3R^AkNE0m6sdmHlX=UWYaE;BS-a+{cnidrJ{WPi6J*5Vp6LP=)k!|x^ ze@?&A<}zd23ubYN+NQL?FBszzh(D`tu3I@fr4xu4Hx($>|?>I!dfq|hpjKnbTa zX`o*MAH@(-jj?A0uA;0WA9SpDy?<()hJu>xY_GWjbp0+T6`z%R=`=ls21O9;9}^97 z{IR(^K8cK@@f3nb-S7Z7%ivEg(tmk!IPlbm{#Cdp7_uMVRsE}~$yAX}|uq=PRtTjXDVX>$pYyO;KMYIxW2u!#`6$j&AbPkXTHUbIFe0bJ)A9)gS9 z3bW}Y$cdRRQ+-?Ht<~UKX+BrYv3COy7d^kK%F2G2@z42syMW;JF?=7uXw5n?zv-gb zMI%2AZLfRx-UN0T9!N)D+Ox>(zI}V~KcDN&&_^8VdXiz7=4I*Prn8uf46eelK9uU> zwDZjavx2PYF#&Nc&$DS0Be25m2-%E)i}$=S!{(c$E|$niq?1M&000Nd!i*MaKG$uw z#r$Rl-@ku9HmkEcfZ2Kn)s&L?m;F|7!fcnA{Z1&odj0vhNwe(f4(L*yTl2V__O)9= zu`rqOgupbv#{IJFz(3OQm1raTS>9_%Nj>WUma@}Da8=B$>w`RL(C_$=KLLPB)MSv< zN;Sxus%B>9tq(efmKTt=l-X~qD%T40y=C`DWmqL$2Qc?ocktsiD8JX%&QfaUsqHQB zXlTRK&_QfI-@MYg{aSfmtA$@Yht(Bt)N~%OnOsok8J1WriniQf`K*W~S46juEDZmq z(h1k|I8|SSAGWopv+5NCSnW-nW8wK#peaGIseZs%ESP>?cARA$jo8jMZbE*CZ*!|m zYLcW0n*P_Zh!^2>&jwpm!v_%h6$zR0o3c~&8Fq!sDJq6_p;?eTNfvSY0YlalS!5Xo zSsW5evWzGUqA$0UwP#xNvCn>3%nBc7Srosm>~$gpsVl6YMx77~#v=5FbKwgT^A9<% zeU_=u@xD;`!gwI!cII4cku4YGvzfi>YxkHL7ZgCy*~>roK3C}aqJ;ODaBk^OGZtxv zbfke7)ZVtx_K1{wGo2RQhmVKHWiN^Sf;fnVs)gToyh3$vbu|2wOrD>O4fpclYS*=` z_!b1bmPj5)5=F_c}>GC>q$j~Et$V?crLqcAxd_R8FsX+B%4P^hEx$*3dZQ-Tbn0NMk z-rv}x?f~9DI@(V<`^X6OPNyzIZias<17#cx-WYz+IOdBAj4$Y1@C?5M3ob zG8T^Kj}%1ezu?SuF2chcqsvxAfy2B0Of9npqZr}_TyRGP6zN4Cn1E%uqCKl$ykDHSLBPXt{Ib??E=Ux$tb zP1t(re|%uMkobCBlp*cwZ$}mnq1zmxQ~6U{;Or3K`kuv@OBv z^-o*7w(LBuIw4~}eFwWBSjjG=Ez0?|FZ#_8&PJ-pAo$^T1Ioz~nt(iX0;CFLY)*`p0*$Be@1PTTmY^y}C}tpMUpP^ht<-NCMB5hxO~+O8IZa9}a?T0c~tUpZ;D6 zdkJg{m^xTY{p-C+$D+2L?QDPJIPve@|6@~Fr!1&#bl;A0<|3}={9{v2ypYOH&6v6J z&hKjtm7#y}voh=?d2Bz)`~Ge#_poi{ez8;}<8MPGCfzJspVp}9#{B1#``kqU{w49i z87MM2oqsQJOPw=os;kFm9gwVuaQpb+nV`x68V!h)_~RTt>gjJeaa#pIu(Sq1<7qMpI_ zR$XmvW?&MD2I94ANhf>zXOBgb2)qE5(i4D2@E))XqDhl_UOI2Jw8|5VBF0!jOe0O` z)oA$%AyUYHAG{gv86}%s@;RJAVC4uXls%w(pkH)94*NA<_j;p0ff~%McWGt-+0zFS zl$h4n*KNT(@DeyLvTJJI(1P6!?J;vCl~katnp%|kLj9YIk=ybiQ6?}?ie_uPkle3c z#e4(22j(*sa{EBinE&i>>yl9Fvw!* zv+_J9(aQxD=Nj{Y532m-V6wn!u-9C*P3F)NUfpF->A_R^*o%v%>-htBqEpd!(ta*Y z(N^mSOt_R7m<|xL)g;YhqYp77fzYr0V_(rwtWl8DBpKym}Y50KR@Y=QTI#t#!pB}r#Q4x^9|WC*b$9?B=K zIRGVS8kXB2okIL@!mm=puC?9brdY5=T$(+7`ZVSIM7+;^YnaN41M*>onAX(mWJ@Ij zPs+rn%omR=*>o)T5^DbvT$S8<#UITTA;Po-rPaVTv`>Ks4GruG+z2*-4>F4YqSyfU zxvH{E=IE!8JOc;Pw{%TF@n=fJqwwl2bn;_o#KWvfUyw^O;CBpkxZU5>zt=xS2DjArf`3 zZVG>l)&sN?SBG1$wxE#2j>{Hg_PD7DycKv`iaQ1aPWdDly!6nLZ2YH*w5uzS)dg86 z9#b83igJF#YfbD|sxiuK+n&FsN*mSu95OR9TJ$vf!K!_W`G5Zi6YUAm&RiG`$iT#O zjMod(E)+L_SiHCUP4}KaaS{g1@ZB&N(4(Bd*&$=7;0D&ror!^hv)gh2!Ht7)G8Y4S z)cJcpqVPle@XO%1hZ=CSMGYsT@<%)0i+7BgOx_WR@lY!&Oxp9aA7{Zk$=eGCEEQ^nU-FE4{1mA{0&rqC%UB-51vt?Wg9@yvPqoQ~{zsLFB1pK||D|eP8O#$d z8GW~&^#}1R7F$L6_$&Rf1YGqU={=lWIuDN7Cu<(xXtN337q~I}ZFQ!<0ghwY_*}NAgM4zhZuN zq$@1IoZN2e%tZa=t5Hd`#jCbRQZ2V%Ao7OrO;=aBcJ?Vc?S&6 zg4aTh$X_9PGn^D`%WAN8)Baz1_iOg1v5Dmivy~n7()}(X$BM0Aid^4Qs{ADzn5(~x z{#_N`;tMQiM;EIR*XqO2In6=^0%(f~A1f~x)y0&t+}JC$^!HELh_r$RIW4$!37w7X{`l|LghM(CZ=WpG+FV4J{|ua0$46iU?)Zk5 zXS=dcx8W@>Fqx5M(*%^e1&UkYXx2NIE;ZePBIzk|58{k^Kr(@|d>QP`KV$#Q1l96t z(3sKUJ~njE7i?qb5ZIfmWrX`-lSY+1=a>Itx!9;PJUV~1r>d_06xK4F7dL>G0mj?Z zGpYW>?y4iWYfwb@S$N`&N`^s%!V3{yjbqW;AUi>dt5tj`bE_EB`Q@qnS_oTXB*>;Z z`_cUv)`nd%Ab5OGAT^vl3IRY6r}4km)ZFTtpZ*h-jQuQK zx$aSVt(2ND$qKdCJNluu(jLs#e=zc_aUbS`Z;g=%lss<~rpftnBH1P8+uLQu{;QJcEhOn9`FaXIEQH$4PA2 zFgUW-B^e?DYFNHo^~tZ=|B%@y@ibz*Ny*uNMr?K@%lIA)l>gz=X6!9LNIdNVie4iA z^q{6iof^9lbwSPy9<_PmchM#Da`oGXCuU&d-ipCHOCr|3n4G{BDJS*vCJ+ zKOurgZ(4N&E6lLveccRp?p|;c8h=?_jrO*N@ z<~$%*9bie2HF}-_tp|V%@7+}4T__xlsQZO=js5l)9A_`jk=w25nc3NO;GyOOgAmyG z$zLv6FwDsG_fm_lp_Q50E}pV-o%X9&G>VFfjrAa=dB;4@Y7_A#ZAo@HMSv4;Z)_aR z-Ocfkyq#USmz;xx!_jtLS}$14<%c()O=IKY`oR6q29R%R1=Ru5>mrbCxw+oQ))X3Q z2p)Qa@FCpX!eZ~JBqt{a*bA};&Enb2K70@y;_?tj4v^hC@C3BT)Uk9`V9c0a0oZD_&25zR67W6Ts%Dc#r)(zMqdB&~a@5-y zM#6P<0|M#JOc9(l$(@(r^9u`OFi3bWv|v4X5t*PpJ?Z!$3N`|_Gn8?LekV&!Z`%bn z+tTxW)@HzMPJ4z%z#8p`f^`+n(ypir)r7_Uff=SkAV?c8Hy(f?QKuf($@O1fYEs_g z!*e$a9n_Cisi@3wPp-%&*W&HRcjCvoi{4!rDlbKD>p0Cnt#jP_gtm~i3#;qOT)jI2 zfX`Vpg*CWBu{7o zG!m0Slo`-0F-={Sph{hRdLb3afY|ct5$2G5@wacdjA+ZgG1zttt1?M^R%eH%G_YJ~ z5M&z#3=wDzOi?}|aA7*}=>nUAKZ)^o2sKD5V5|%(F%t1H2*Pf73_p_9kuLYL2`U?m z1wZ!YS)aiX>1hP=i-2p*d`KT(ddkbz(Zgp<27c{h3?}?uwBjm5L@zRNFk*3@P~I0e z-OYGKX@097;v@ECC3b5RN<~Ba30js@9P_jXNYHC%zSYjKT~$5q@BCkK!@|Ce5wm?z zCfz}Bh^Q?*4HbmsgZS`8P$`c`@<}T4+p~^?a~=ji9I6sek+CsckQ+Xd^C00hkGCrB ziK=z$B6GSpcz`wz%L=M(5u?}B%#n?=igZlA`pDicK3&52TV!;5y)G+Cfo#()(=HtM z9MBUN{Qh*FjPfM$NA)$40N3k2#`o`p0v{83NLd-D)rKyBkyfN>ZuBmB(an**5*R23AqUu$ z00iJ-4FZ<;gQJm80WH4J9u}*V_26)SsByLi9LCDNT*zYEp8Ap?sS7&)gsDq-k@Dd3CIYn9!e7z z2HmBW`$GF>{PW0a?wRGy6_T|?UQbc#>nMDruWph2t>i~p)C7-qERtWou2^UfK-JB| zl=wQXyu)KdB`a7oZa4@$UfcNO;Z&M4<~xs05o|-yuzI+-JNR%tk&o7i9THt%c)FeM zpPJ&(?GQBw9-!{RlLdpt?bZ=?b5M66I$i7V{XXzx@o6o9?siyYMk#FKUB2~~nDo>` zUug6bnR>KvH#^2;hs86 z1|A9AFK7Y%KrB^A@d;@&k^v*&;i?__1B053k<7sio|k%5ZXYAU+{SfQsN1zl-vvy* z`)akUM2mrMkiR*8pO@{VNNgBt=)QqPY{CqU^Sg_XXQnLN&YJKZ9{ywCRi@zohY6-RSuKO)c-iv87Q zq{j zz^7H41SF`7INZ%fl9juW3t&NSHIZoXi3N!<@m-bckzAGFLQRoyWk^0gR2J5yry+an z`qmuAge>0Qo!{|p$XDQ{R6hzg+(bly--+Wzz8W7F>Hc)c=kF?ioAo)vrsKWLs<;(} z9VxLOMjr>Cv8>K>UsK8SY-wi;ZFkD^AXlu<-+3b*D`^ue96c4=5k8jmHN{P=t> zHDumJ%wHN&Mk?SJh;x-%{Hc0Qd15`Qa8)tzt8@@LONvkaN>-0&gYt!@-PbgQuWq1` z_TVRb+scW5jy|roZ|bogZx!GgUKygq;y=Lm4CS$p5c}j9&Qs<^W->^0U$wih(fS*^ zr!I;s-f%Xe$NgM)9fz5OhHd6b(mwt~i^%Q`&kY~`hG4vZAW7JK%+E4iC{3WSEfgkO7xFvAE$ZG1YOOitk6d_?94Z7RK(?>8_tdyU?eGTvvQgCy71w=`AyBB+}SI=FNmJ4mO$0T9{0d5UBg7tdT^!L`TJ1)O3d zk(A}V!SdI{_`0*k1$+vuXjKFDl)!Lxr1uf~Kd~#%(rT=ogtweW(=+#$ctY3tf ztK^amoeIh>-BICOgt^}hHovr^xq~Ru|FX%hcFaqXEWehR<69;zxiXVD5ATD^nvkr; zQ*IkYM11)mrPJ5!#*zISZctkkCT)iGgIvRA8eYbS=hOU3SC9&Y9|wz&mnaug+ci#A zjZP>;og2_l(+ePNwZ};h3;CdCN@6-T%vp(;Z~7r6{K}&yu+-xm$D6O!`PkD}19u@r zP4ac^_?xYa7K^V3<|j1vZG%I|Ejz&N<~%y!rl>7XvJk|?6vmjF%#RvGr~RrUV7!u` zGg=yz~QTdf=xHceK`+~icmF*XlgJS1cBs!YSIV~bZi3%^6_@Oj35%E#M*j$xh ziofxWTmEmQ6v=Zb!eA!~t`H7!oOGY8IE>FGv)Q8JR6n`~*%8Lya3Avf{t!%g)2z0f zGCgORZTz3;ZNM`aj)ESqVYqeM#-uNKfvu%HsFnrt(!@`z8e1c;?c)hRIXqo8*wlyG z>ECr7jfwG{16E3^g~h$R88mn*N+e`V_`6Co?2mR-xk)tbc_aqwY)Jmz z*w_dbRLu`h%eb6XiktP@0=2>{ckq^k8c3RTn>R<67KFP5$s~Eft9OxOmQZ@6 zbc&@`31mPjmI*{Jx$BEX=8TE2mSig38EtRbC)W**cxT?pG?TIG@B8r&U@033>J;A3 zYUmAXBk}j88J2xU>3$G?HxW-_RosbcBQ~30h~Tt8XNoev+dZ~{S!D2yNVmZ{+Iz{7 zAhck1nFc8cb)VBIo_(b1p^qh{cNYE))H?SP5lc9-5STRTvmCO1<;IQhQ|Ufn$IR`D z!XOq3+N#4tCXKbm7JbWcFue>}U1$D)x!o-EC|rSZVVNNA{&YRQ&zkT3o4X6TuDS#Y zL+6$DVANthgNEtPAK7eq`Ia1H#_u8eDj946gAx~vKO6W*zpy7WR{v6(=0Kh*e9SGL!FZq=aVc?p-~c+veKndRUx?vs{Jcv6QzA4( zcy7JMbe!ZHz1KOPydb11`yyT%8blV%`R4oKDRKNYP>_q5&0k}~Gc#)HLETbAAQ;Jw z4-8ip-))&ap<*w9P(rnE3{lAk*IvJ(@M(OsVifv_uyqiTT6&7Qf{I|FT_Wpwk|%fq zK{@DBlCoSwqVE}c)9PE#b(LLh*#thEZl%POx&OV%Pv$qp_L+FYE}9fU z9773Qo4i!}hppFu;)*W>#Oph%|*v0%IDDL z?1G|J^ltR}#LJg%sIj<1N}qrvaCpYNQ{ zK8jcL!5J`TkCVzx;X!2HE9cbjfoK0$(^-jGkyVo;MsASv6kf zuIrr)sI_>3IovehdG_3L*AZPK85Gu=?sl8Xz(nr7*JYnxLB!o*gjc^O5HpzoDmD34 z7MQIiO-Cte!UXHW(?DYmw^_LQA$nJ>+Z&$!0gfq@xI8toBQ!mJDzepc3{3Z5byOl zI{^`4t15WhT?%;S5ibb|Ngs?XG9(2f)8t2d_-y#k#bA#DnlMn!mAXNI$K>66`EZjx z?N$A&_!-7$9JlU(mI*$SDs=;%*21)|d{yUS&C(}^s=HCUFIVsG&YRN6_^q2ej{uXF z_IXI2t>KZ$;?`mq-U<}A{~O%T09r`q9{=so{f+V&NToA^Izzt#{z~@@I9eyUar_s- zv-`?G=E@s;LZ(ZPbtb*i=g(%{K~>^3*15l3ytgn_P7~FMZ!BPiswqid;yowxy4}^& zB4fA)PmLlfCzh%H+V8Mx3PHzw-j`YeFD5RvaEiUpNADv@1>V(%c-{gP zD^Wzfdh12hv52RS*jopMd|s(*<5Bb>3Et)i?V`wVCrcbd?NPlg5`!8W7scy&eyY1d zD~~>LY3CRm8|;U5P6vZ`mqT8}T9b-Rp*!^kL&p6Tvz6;CKdoXr?*yrFAtlx|vA?(kd z5~9?p@YxB#jP9RBI%ch3IMp0b58tUu2y%Or7{F1DXVfk#%nvW=xvb+SotCXN!`UVZ zITb1PHzOH@W3#o*H!Y6w?(GwfoL?wi4FWlW@uFHq)e_0#MPLG4iiot^**SNc5U-p1kbP{aSLTyXtV3?nw)srZWuj# zv6razod)tQp57lBasiS5Xj1W%7`d}cA+)lu48zuFJ7h-^%=?G zm$n7?tubp_r6sz0^X$->k=k)-LV;MByfGFa( zc|m!!59w5yQ3!*}Z^78~m;0XQb&GFYI~`v5Ff(U&v5|DyU^~ZaX|u;HuM(p!LoASx zX8794BxF{{#0#EMf9?IsEONS(iRavwDN+P*vcL1h%`D60YL*-&bX!w57Y%EL9~nwq zxU*s-*L5C^x~p*!7lRmRKopIqs%hn=7g!g>cN*RtNW@-)(6@NA!Ka~ad?}suE` z=(R+l`h@R^sD5p+_g}@U*ks@@fIuSJeuFZI%aPw_Np2c42%~(&k_o3b9LDau;3Kj8 z8xf@)T@B0Rz)BK`d9x2DO2#GCnwH0RY0Nusw%CVAsQx*v`S^E6i~UtEmAP%{x@Nq( z&c7{EE+G0k0NX0SkD35!^+V~ohU+~ zwT6~@*N@QGk%;onkO4rllXw}aYCkJT$&w~O{Viw#A0hd5Y*0y)V>xR)xa_UsiLj2^ z{<2tf;5|*3ojcX<+b3iMs@BgfAK$8YT7?WV&XJPS!E|#L4RKxx8Pxi;o0!emX5Y+T z+U>==#~X|+wHxZ-M)8EkDl!8}F;5tAhNOwXDvoa?h9$&=w-Z0dB)8MwyVB&S<)%-N zryZH7m#t5%fO_{3viQA5j`WGxk&&aO2J2-RPWXK(GL!!UU+*4>S&2K{Vh1tz;@e8r z=%M#Pa#(dD99dCpN%!tt`Va5RY&BQkQI>q}*d3_Fv%q^NQBx2y=4rHtyst=WeBM7r zbaTQJkGj{vXM>MpF)%|BMLPP9*q&-IkZA^6&45vtF;oQOS6q5=>Alb0@@?T)(c3%L zUus6HA$NqGXlZSpgodA6-&pX3YkV{!x-+_o^Te_;@ksI<;(v!C(5pc&zU=nvah_Nk z%4b9cM-Mggi67ogEnKiiPT-CIRs|WZP4CJ%+{xgFo-dbRuIkMuG|`8NZuH=|MEChn zY(~5aRMatp7^L|!c!0fD@oUz&9%)`G@Ii1{r_RuDs`CLbjsX109uFS%&@!{I>_5@~b^se3!1T>8_;=v{%U1xp0@HK(UMz(l zwIGy#&POeyI*%TPS5p1$yaS*gAQi3CcFG;!Nj6+|MZ?7(c423IJ8b3l`#r~xLhoH` zx2Ys#5cYg|tr*P1D)$<4Ny3hs?ys9R?xM5Qq}u}E@+xeisk<(0NAX&d#^U+0QmI`G zS2Sno(%eVG6P|6YB2PwmqOZb$9skvrEM|esFVs5oN!sz}?4k!?zR?MF?tRBZs>&Z^ zs&=>&7;w2OP`;X;Cum7XK+3j9C%YoC2TWDSR*VIDzp?UuWw{b`?9` z{Id6+ud+(J?AmbF7$okRRTzVy5GKdyoXSo)?lytvGYU<5)E-$?iGK1zgCAtr{5kFtnqx|9wxP$FoRh+B_rpkkFy8=uVU^tt${sK5wQ_nfufv(`E5d^pcHw(|gcv-iI5>%QXtE_o+- zV(vLMz6=|=yxUT5^nOiurxDq5c_ggrzU+}JPok%2UxoAOQLndETZeZ$K8CFB-6HMh zb8UbFZ5cyX91Eip>nB~SFYucml(;5e>dE-ZWr4^u1yZ$&TZ3ww>Z!~J^rtKZgykh> zXr(xD;xd>M`9~wkfRN`fzH){Y*uQy(v_lBW|7XPEkamW8un0U+Yg zmQ?{vj?WYyQL6SgOdyUl3y9VO?v!OR>5l0FsIbg=p)u@gfn!7lF+ z>@4BO!zv?9Nkhd?byA6eQ7X(ck(!)T16*ZqwxfEOzsy!)&un56f1XJK$v(eK;7N^E zQ#I(_{6mXL7KYTI1J>X=+=A9mvS48;Vrkq^x{tXgkMB&r<2loGq~qn=2TIA$2+8Ix z->A%!#SAm?jlgUCLLPt?Q1_axc0H?v}o`M_>(IF&jE_sEW`uDKlV)Q%@Wnpsc%tP~Ce5Xup zl}7SUZ13f46BqP40n@&G%pvhqD%WGvKvI zQ}-mBm|DH=YAbg!;hCl>3qUa6WGJ?8j1}MgRB@v)2Yu#Iw*vMu)6pCoAaAyeG?qVa zD|scK)9>XUGx@_hSRdbNJ5z2_W99LnL)2$z4>W+R zFi3c4*E)}9>*dnlZsrx-0P|w5v*;9CpRIP>n*yzv){8cemCaaMg*m+&+>Gr9dT61E z_Ln`<-kN0AVjw1XQulg@BSP79Ss^Ja_ZB0 zW>>DYNjqr@(!G}2)rktA5fnShIY+r80aUNl+%4q*Z_><<&u%^Z(A~_zGL)n_SFr2H zS$j?Ut?^wsZzlS!v(w{B0MjO)OTP8wef_dZHJdBNg-=X1m5?`PHq|S@>9{C)AY00c zK_5Cp%s zx}@U12>{%)GNztjmxUd{u>&Cqs?%>zt@9O3)Pp?{hT;}sWC1aYbrd? z^#Dwh6t*rhAZta<^ZGuo{%gV9uCuFqA{C6GM$GcRn%l{4Tj+hbZn$mvG=4jxQ!LxA zw5`oo^w4LjNy4=KAamB(Zq@kA#rmw=n(wI4G~v5UnR=||xQ`)sfl~X4w36LdJM`NL zgb#(NAzv@#4fj#@hsa&ej|4PwowzDAc;3ibf)QQWAUxb>nAY5n~B0`_kLm zUmoHj4~Ax;3sqz^15E}+uRRSPBJG4NG(XsaX6W^6<3<;jke8CB3!@|s%^&-;S`isU z^0A!#qmQ#Y%u?Ef;vP~b?n7LELVL3B8zQ~9a_4vEpD;YRYQQS--6wI8W(iwVh9CE- zS>E!1@j2n!lc6XtBQu8u^sG>mw&|4?0(IAnOq~V1>#+~_W_rqfOJP)ZjS~g6C%nSp zyHh5($osWd!}rQ2)db63p&6snpa|=y=gm|nD(YopYTpO5Z%ZZS?|;JdQ&ZVhi}il# zN=DfCENn4X29g)I#Vkl{nV6MFOOOv1N&`fHI{Tc?93UFl#e9qu=Tbp*^-gPJRL^AN z&A(GLgkmXq66cKljkLVK%?BiepAC>1SM&AaE)HmOfCK;UKGAE=-qI?-xG>jIKw;f6 zPnwPONlq10LbtC>>7?FHE2t0!o%-IFGH;J|S(oW9@|*LtmZ{)A;~;B0_LvggHtY2S z#6#&S7C+a?oNl%ich8wco;N$&pcbxVal93a)KY2?+YN8GBqG}#8m8n}9c#u_*G;H0 z3r%JA6tym<#Vs=4@=LV6=08!NQ6hP6aolLtMe2r~Eq#X@btT-5R)VVB*$~;BE3%{d z7M`+BfR0p5>>?Pwl#3>MGcBMHnpR|B`+Yg!{91Fhs-Ti~4>voKJhxqPgi*kTai|U? zgt=+_EIp?z=Jl%v-Gtlm=b;kt>k;5eu4WeLZ++}K+|QniAoJN++emthrVB?xxsSxQ_S*({t7m0rT zrn`D~Ka=aJ$*GDa2 zD!Ziw37VNdBaMXK34B{G#Z-_i< zW>B)4`}2xe=R4kA?cbOX(b<6^NuCP7*(ea;1tbCnGIfof>JsY#1AiK~n~5b-nvsM; z`pdnUR%b7UKGHRNxBCK_wBtz|D;ug2tx1m(mJRjh;NYO9}dH;E-fnx6}$dz4L?~yQCjHm8VPEfTblQYZ{n`b zw@3D^lB~1*Aok`)`+$yTB3I5&SawD6?V)*-Y`{@fqe`W^RVz2aB#}Ngo{Y`SVau2f zKUzf3%?91xg$5JrskB=Ft>og2i`$Eew(B3JUx2(EUs? z5$D_?@6F|2ku35h&9PpIC4RMNG;!r?ICR~)U;R~~)nS&*`V|Xc^LAwq0(?G0dnXQ- zNP5|O;?a4ZjRZzl>zhFqa@kE$23PKSL0go&Xl-PLCv3Lk7fD~47|94G+e(EMLvf>C z$m8g3Mw(fknzvCc#1C>h0)@!O?;)|Kcja)8BG9ZiGvV#m=n%*&Z0is+g!t+T^78}) zes*&B?F5C|L@4LV=5WIX+L5i55h1L35-zz$IEFkHwlvX839rp;&0uQ?Np7~fp3q;2z^Z3-A$5j_E# z;XcO%I+FP~d&Yv>^fNo79dt+UQpf-5Dz*$Wlk``}ly!NFitm^@z0<1GB?StfXU zT5)id1RR}NCCb@Qmw~{DXyM&EOd*v0Id-q^pN%?9oFLb3TQX(GI~l&H`D#q8fU@ik z#7kEZ?5X7X929Am-u4paBm_a*_&*R$cmPm2f0YOSdA0C5A18b|*^I+SCBBY8`rIUX z(BC3Zm#vCL9CFy4Bh-UtqStm5Z>NlA-K$Yue9G)JC3YpT-Otltd*j9fGOzm)`~4ls zfuYb+Gx*k;A76Kpg>pA;aL} z;2>{Slodx=wi;7L?y7EK%pD>gw}NR3#Qisr#7~rVGYaK(5rnMcCw5S0 zIn87E|DSw5WRMaNSv9MwJkfXr_w1m0Eajvh6D*DP^|={5=x@ zSxxq#7SNaIXacrE#BfX69#fUv015`(Ny)urD{ZNdH1mB*{ES0>U~z!P;=CG7mn@?i zu1KpG2Um3`rpBYMjRPs}vwb<^pFiWy;g441iYfao{E9*MMYJ>SW@8l&Z)X!?M0K*= zj>|!=90O@|uB&NyMimg$8j7MG8Zno-!|Ak6r*E?Lllx>B#bR}h^Vur1NV~sSrj7W$ zKs<+OrZd+)cp|X&Q7$V)fR5yv8|u=Lwyc}RtU1KEvKLt6TGZV*Y(Ryof3Q` zgILDnUg^JiZ{?59!rYcCx3fjGm~K=bZ9@hNv9NOgieIz5FstvOi7a zYiz2Bw+H5zQe70?GT{iXxzyQ96iHs7E-b4gWUP%flSNo2H(u+O@;fArruo2#?d5s#~atLMLNNxmC7? zf)zjGZ9UZOmn70d`fn!RnN7X~ke25i2IAWy_)Zee5@D>b4R;+Hvck1XTSAI?I2$(2 z4&=J3hf99l;o7zA%c?ak9!fb>&-f$&k~&8NU8W_?#Y5S1y|a&5&9ggd>XV_8&6)sn5k zZfh%g_&Ka$vjxvhk(ITDjqLW~udSG-3E`nUdzIk5R?2>#-YT|$r&n1fGb)f^U2l>H zUdN-Sx>!Ce_x?P`R))E)K93%CphQ!C0a_-rx*aUN&diWR@qf4aocAz3<1ZelB;5a; z_wqpGUHEzH?4}*w-*V3BjNlv7U*4Ku4&w-AxXmX^#dTkEI0hmj)8GkEJ*R}M_AA-$ zVV|SG8VP-vZH17E)!tGY*&9l?ZXoO+d6+vCgX~j+DB-f(cuV8opqGv>S6Il-{Qv`} z5g8nQH?j(N6MI-Hxzn+1&cFY1*sCdguFKx?gSDYcl_!TTcX&=bWvO|H`IrXOXjmmMlyB{?r)u5&JBF0a>{Dt=uaub zR(=*eHumPBmQ2?IJBP6wW%Ra0!J3MJnkY>03A%ANQr{=Fc*p;E ze#S5%EXYN42(YkUUy~@sx2S^6PEaqJ+!Ie!cO@)`)!CKIAuZ2An>kNr{bqo2i_12o z=eMYxooq93$Suia#8bJ`Y6k0Zr&TYLr~le;&ojk^eibC*%-R(=;ZU*TQZ?;fso%Ap zOp#ZbHGjICqEqg~!))`F$H&{Wj)r6Kal`XT)?Ohhfl+n*Evx4~iyj)oVGX>Uj&6D}b zrqX5YuID0MsogROuV$xJf&-|G*TT$2=y0uCvkgQw!Zd^?p1UZnCFi^N%`QsVG-JqK z>z4{lO8Hd%x=tX6*y}q7{ZoRIgusC-G>b%m5SBqip5wzoctZ_>X}C6{uyig4k*dV93kZ@_RE9hZW)qyG-) zDcGjYEV7!ok-h)Ky*xsZa9O)bkLUcc*jl0?U)X!nGq86W8BQ1;le4f{f0>B-YapJt zuxxIC>Y7nZhCpjfAN-oAV^Ww|{Ra_8qVx~Qn?>KrnYBxFeVz~h#_z5blYC+KuLY6J zFnbYi?Dc*8=FFWUQpdA;3JYJv;pkQRIFET@U7u`$EXm56niOyF?CrP*+D1f+uTSb7 zXl`)7m5F;D7 zz3&UT-zkMbhK=+RB2+L_es8cS$>0^7B8cF}#8581gn2wxX*PT9y>#_g?r@WmZ3ZbQ ze|77)+f{d!+-1W+3+aP@f*a+qSf|6l#YDA}bu%{kGm<0Ti}HR5(aeCl>}GlIJW~~; z#QCRUk-@#v;TPF>i~8RI!K>gvDQ+IcA8jFMCRUh$&ZV*4^y$n1K_Kjs z0={6zqWtN_0ZjsMfV;J{myE334DtYA^%1V*!PT`=M#;NsjO#7jfm6Dv z7yzS}+s4U}1g6?Kn6JQ8`_O`us!NOaHErpuGz7K_ZhOtgiDn-ijpn6RF%6*f{^)52 z?1V#}uy)koxhv^N$whl&`_h0;!aQ7$xOv-dJx;@GJkG(cAFcpjK*US=XGY#n=Z_nS zw(TZ3X8+xr<9#YQ@N7a>{Vg@qJ9?H6(q%l5MK$uutNj^Eq2>wN2Y6jSWJvFB^2Vl< zZZWGlmZE z0gW573|EWEO=g4cMS0WF%gpI5wpevRF2*-={((S+x%4XzJDzSAL|B#lLdy@!q?8Vs zK%PVMbqbuUG%ODz&vqvr$|oH2Dv-z|%YKig)*DpUTe)5`D}cKRxh!Yr<*Ej$?<6H5 z9`67qDPaM4oKKW@RkDHt&=O35KEn|wV)04|xXq^i-ey`sZ(|f5?1C<%&p%#WBzVIFgv>*O73^|{Uf)p8XTohb zZ)IF@dmTBFu^Dp(Xb@^D9vP#5(wwht;?as{85+rC%Lh#QKdht-#UdY7&&Q18hY*>r z;oclo1S&>WpD)ogdPE0sZ@N*+R(XBDygE1a13%Sou{&)IM09;T>3q(>>&#;^UAN0_ zVkJddqAp$~aqp)Br?g^z@)#2=};gyg@#l< zl@61ao4tU8F3}mu)WOHlA|&^IHN%KHs~XIwsCBFk>S$J{?Uv^8a1sY{{8x-crI#e$ zzOS*6mLtMepZkmEvjLi)bU@BtrmK5Vm zhhk49zS!00*Kl*_C`3aCdy&Yyhs^}uS8Sfx$qDvXXwDSH*L$M3biKCOf~o?Np)X>v zU(I{3Fi^ z;N?mGk>_~W|HyL|1Zr5~0(`IFfnqqVXk>kH0EvgGpV;@Uxi9K20|4G$m#ov+{v9x< zhbBSu@b07)UrfB6SpgC!N!5$EIAE`+sO(R#sF!|GK5G;y|SNNu6#rre})^}boL>|k) z-$R>X;C@H#EN6qpoACG9cAL<-RPltl@4dDOXR6+A^e}Z?vj%VYFuvOq$6FeyaA-kd zhP-y-|5R1fxa3>GZ*-B|*(z)Q@T$*L=4bZ=h6F{xEY|uob@-L|eO}{Q`%^vPFPIPP zo#vU|OqXvSjMCNm4X}JT9ujPQkKV`f00S(~5-Cz0S7}!g8Ppz z50Srckx_3E|MBg9#u&tPOeCcS!=D=s0s*OgM9||Sm1I{=`KC0fQWje%uom*l+R9-n z|7tni6s-r!f^ZpH_Fu)<{QU!Lb)GxuYY7mueWg>nFZ|lGKr?@B3VS?p$J0i90RBo< z{q>WomrUhZvqWV>OYZ$@T^6{@zoh302uoph4PZjBH@-(|yKzuzy%#^b3Gly-K*Of; zM_`jDfN^eUG+Xyj`)w@gRPnTBZ@v#}_kQt0lXSn7yiF7W_qzR=l~nFkrw3>D4w{XV z8?2kIlH0-GFm&g+D?;9KE}PN=5*8m^7D^T{t{Fs#2F6>lVmF=Vv%@Y8LEa~r zQ_0=WpQh8%L-|RPYJ|Bsc;owHvy6j5HYpgDVMLbcW zCeWQNPVv#51%hP|{M8LmoUOB(*RM%y(;{e$-8u2&Ud{s^bt_X4oVFN0E=v0j2E(gc0XO_tCD6kB7dcWJ1@@YvYk~PbOTa9|_?Lc-`tCvxPa6ATj?sX=h zVVopVCUuGw1n4;1)gIrf^U8KBJ_|Al^^g)L<@e(%F6pH5^5)aMZzWp`VkDIenjy=; zH(ut-0}&gJMU=C=kNN-1&4u7$LWdNDf2wYCaMNwG z5`n?x6&FovD-ly3=4Y}!m=eI`&Z5rBcn(r=Ct2fw4E(>sdv&_XKE>%wwd@}THYK!5 zY?q^Qq1^=IXl?Z1rd|E(j20|%Pj_M)SLB=8ws@T98szl+anvvgM1`8jzU(z35orfe z`MY*{oc4mSf-M@M&G)+#wEcR@S9yV`qc}_`_szsy9->N%?nV~;W{R;2j)~*5j zU?3?L?=^zLkTpXyGaCo-69SmVY+PyoF{bL`f6x_K~OSI;jO6 z<>knDr)!eN7(%Nnw0F=lu_) zy4)$kC0R|6!Jp2T+1Vo{B*# zZ70X4nFInf4fI;suSO-Ko2A070J|wbMZF}HGq8C+_#l?CJ8h7}C)4Wiw?^QWi;b}z zJn-+x{L#5DHIXx!JNAqr+d9>#$ptw)LXPBTn^_UtDv^l!$#qdcGe7~|rwB;9eo;UP z!2um?*{f7I|3K_*42X?x>i!SJUd9w*tlX!B*ng+pD_1cf_J*1De;^hI17fjsG%hgf zE=7nM5&TRk&q`m)xM=*#^E!8WqO+i(XamTx&Ma&!^l z1Ani>?5x8k;_PnOus* zM}lhFr-wguf+l~RSrJRWB`PJIUvQVU2Szc^kAl|lC7E?yso!?ekcigWS;k}Tml0UR zxg3&GZ$Z9X;X7T<-+}SX*Gfu<4pN{>b%0;M#ab=3qRykd?f%N5(8G$^95Z zyl8|I4-xqrRr@svH&Muvz`ReyT_Yq?ABREpIcKv8OhtvX7Y82Elf^u@dS4Bugay=hD0B3RHO6pnL{6vfpWT)~0L$~OC03_LBCIs3Nm4ZbGA*k*+ zlJUe|J32f_cmLPp$~NqC0Z$_=;1`8C%O4TF7s{*wZ|h<{$>bcf}x2kxeLB$~d;K1yR6 zXaoC{$ePxz1l$p5x`A0V8yOduosYNIlUtodjhGi|_@SRvm}|Lolk00Z2v%cIcpic; z$ocNM`LyLds+2^rnXo*8jOUZ3OxZo#rLt|CsVMK_y!ji?qwiClv*+S&6rZDUAx+xN zs8>cSaox?e#JnHEIYigLejh8xlbxr%EW*+DDlRH4cp8K)_y~s4Sx!ExC~Opd=F!JA zVB3qbsDZdZ25gC?XV_YLh7HPq(=b(OGC7(271<>U7#)aNTG_HxJ?-hfDu*y{!Htzs z*bd%mNi~-TV{jpw5|CEHl$d?41%&po8kc|2-k9rr8va5WXGXyFdoW6M*6-Jc@wj;k zYM8bT(zRAEIvR#i|NmFM4d~4L1-9%sf>8Lfgl&NP)N212{8Rzr!pHYkt8|jJALr~c z%VdL3l#YozVmBWlCciE^Z@#RXQ0=T4av218~5>qTJrl{RSz~Yn|STA6QR<( z>WC|6MS#OK*)a|0Ozg~mZ9Kp*AHRC*WV>#!3kd!Z-)X@0rNxYqj=WMJ5jzQ}4GmukvL zTiyD4MHT-BQK{xa{U&RIRdC7BOMd1IcYmEB+;G9W4ghgG+Nr#{^hd>?4*7+sKnl`X zsurBGPR5=w@sn@KgDOgU7~{+aO~`xb;u561`mi~$@w(n21w`ncldB(Tbztkj3@~0i zi#q=H{)9lC02AU<+&U=^&|@X1_hevQ^@4^!5eAIUOQeJMNlo}YG(uA5odv@21TI25 z8m^R1-j+bx-bc#^V4=9kc)2)y-S|<=M3~YoPyL7nLosn4Je#95V+G`v9TX>iG|Gf@q^SJiL4*= z^KpkrEwhcu%i zfd=|6-QnU+laEsHIay!F55Y5wE6Z@_NznU!tiQfo#zqhzU2qIUFN62Y*PD12Pm8bH zsqaZuWKtN%LM+HsEPW6)YwE6+TBl${Fh+wZ)Bv_ut6{|wq+I8$ZHkQ8YQ?(;N|S}m z`(B*cP&4z(JD*Knoy=>kvt*D2M-r2 znZA01N&$ufJ;mka?bs26nmgp`+x_zNSq?j1*9qb&mNMA!uq*E^uzdn*d4Igy{bvlzqB#`X+u96_E>wzyp-#bIoMZ4;5{Ov_#W zadURy3%}0e{fEb8*XOo?I?i9#KwRScY;W_;O#z*?rKKajny>!tzsu*kS>nBI|Np0o z4{4%W0GTYAlHy|io|`8vxC#$OXUW=f&Lxb&;w)DGTeCrzPGk367lIRo7hLfZ27ea? zt#;gAOeW;zy}c0&1Ps=gI=Vnlvhj^FL5L?#bpa4W?PQKIBfC8tYRvV26!T@DbVAzE zB(`)IiThN{lc(hJA>~UmE|T!;{w3t&uZ^tKsTcgQO1in7YOr#&3;Vx>zn65Q+fX0z zn4|~|cB`9KU2qS~*ydLY4jB-7mVMX@uh|s=!}c1@gspgjyuBLJ@5D|=*PLBr6Gk-u zjJ~XqfswLBKfOv_Nq27k!Di*le7EOm7uVO@TwxF-Rn;9@k)XtSVMLE*H$6mre0ZK(f+|KyJYa1^$kgqXx8f- zwAU-$Xe<1<+4=3&LB_!|wcrH}NJfd>t~bmw6l zp-gk?1H3?>Cliq^l`8(J>;p9U;@JJqL*3ndyR9=7zsTS=Z8=f~R2S4wP;fY6mlO z4z+qz+DpIALgW9;gGNEVVZr;ijkSm0 z_RhT<9@M!pt&~6Nef?!82&n2i3K_5UKB4IxuYZF3a?T8ehE87N0nLJ#!!>^2RSJKW z>gP4iYFnYSdDqr2F#xVyFqGYmF-7*Z@Gi?_+MX@@a*D!v=zUqy`1i8Fz*N1Ch9J=IASvKh z+X9NyU&(|-J1mH0ec1$;M<*TVmS#CHoZpg3*Gc6+kZZ_$r{OzU?>Lo|?uz20S#nP; z3WO~zezaFFO8|HMgCxqi@s#_<`%?WnzQn@jlXfz9@A3m1JVwD z4_X-}B4u5bPbnoib%U*g2NoyLblkfeP;(s|8b78%ELK{q9$w&8H0RvCJ;{;!OQzo<|9HH=AraUIDDjt0^FJz_+sr;cJG}*2 z(f9FwuzoFAp0j;lD+r7^OlfMsa^lH|cVHDWLyM1-<*b-^39UQBjGY$-p3R+TLWc+*?ZD)7ZH~Zm==zZj@J2^=xU3jLRAt^C3)`%g# zpUNwn$Adj+`-SC_+PBh_j>-nl)lkm<&ZvwJi^w-LZzi5+pG=J_Pbu8;x{$dw zs+rdz4iw)+@7E>YZ@QSUJ7dIeT2*@K7Y9f&2b2WU(k>4CfAfjKedX-)Mk2YK@VVl) zHg8{Q9FISmxl9-rZaR6SjO!JbS4DxCrY&t$1C;Zd^Nb}I)e?@|@-)oI@|Fc7>J7bs z=7_*RyqsrR$`_z4OE>9j41x2R(X~=aRZgCUMsBqUHblZ-Qupg*OLi^;m4;YG9wv66 zPu1SL?pfD}38Vw!dW%8b^~sV5mmFJzRDAT#?=2%HnEV=CH&$I1A>XC^~or@;IyLHFdL`K3UFE`zq6+xEz0o6LiHv-z!8B2Nr56}Az28-lH0gwnv~@*q?= zI+49(Ws&s-9MV=hDim&!+FARfAdFCUTG5@DlW6PR3wYqsbzDa5eqWn=pNx94FUO1E zpXiP>#~?(uw%+s_9cRC3zRp8%e*BEL(kDYSlG;d)g8kh!Jdm(_~`7SkE;|u;ldFvJvnxOLr*RE!xPfOY}{(InV`B;u|W*^M~Hg7R>#t z-1om}NiH|4d|3v`U>|MI=K5l^Iq6Apk%l0du5kh&;9p^xe8Xns!|M+6H$peT%fJT2 zr&f>GR1~xL2JHY1DzGYSDAkL|Ux?jXVH@EWEJO6wSXbke2m%Fk7Dnx!Vy-dIsHXit zlW;T=H&R#9W!qY(A-uId;79bk5Vw5xHsJ^E)V_ph!90w!a()M7bZFLCDLL?n-HUQd zlH*JQDBt=Zx)U7_(^kY}0*G)m%pgQ6@6-Mu{|bEb)vxW0rBh^*)fMY$7<->%$boWc z;{_hE_Rq23@0V6FxGS+IpvH1~fVia(lx zfeufg#sBD!xJqfc*7D8BR9VKl40gSS2|P7RBRtI1qTaG8F(AP_TtiELj<&d0WZo&+ z@1O|umj&_lTH?a4UEf0n!;$b2f~iMzSqk?oo?BOlz-+H)x5kxS=iF8lEV^4@u@ko> zCN6ICdrkrthnejM*)3Qtg$Tt);A6XNU{-$PNv+QBk{qSKkbzVfL_|}+d}!fjQv1ZN>jWtk2hK)+jfSPa>Rv-Ty$4-`7uRE%|6-ATYggyPKD870oxVyyl^V zS0SIUX2Jf+lsXT(SNPW2T08;W0?8zQ=Q+peFa{mU&m0{h@1Bw@X~PN*iABXNY0?$w z*y2ZRbCacTb(|I@%D)%WIZ?E_WxGSMDhfcxJCuz+H$5}J|HMx?LwBXjo+`-@n2<=b zBQH%{Ql3?2h$J@`i|Ip@d28DJH~VklGPCynzmo2)fOJoB;v`Lbv-yoyVM`Ly-jl0) z5NZDsWyQWi$dRIi5>6rR{Q-^n7DL7R9;8`M+nkd0{2X;di^36Cg4e-)zaZ`L^9zEG zku%zc7=}PDN)@-sl1@t6Fmd9j64PL7Ef--64Zwv8SmiAe<@S($2R~B3g#Gq0Tiq3Q zXK}=Jo@vO0Ta;lkP6GHU-Fu(Rqcqg9)!J?(HBv(Zvd_@ZjQ=-$z~wXyAJ7@~nHL5E z>>`HdBB@iB=`FwQRCR@LerVV4+d>3hBsL#tXFLze&QSE;#ZvQF8_t`doE8g&pjT|>5ua) zOjZARP^pd^9t{WqO=G)Ch{u8KG2L7qa&aPfrMaEr&Qrtp$}NS8$(a0_+Z3=Yjtyz>0j33h!%+5FdK~?_(r5RFH?Tpz$)o>|E@`<>4uk~%6X&O#ua03#Al_6Lnm_ZG7^Z|u zshH;9j~(Q|FeSJRF&ET{pdN-PiOCH^ogjHIOo{59AOA5W5O9Lb z*yWZN2Q;Zd5*X{HM{ivV*n!U7Yyl6qEzq5~?4_0a7yD4%k4Llwb8IFCop2nVZUp6> z?o~IBz8kwVGp2heOR!azFOhFAh0lVGiM-*h_t~)ld&u%gRx*B8A{5=o4~8?E9$6)A z9e{);n;dC}`dYKsS))pd$_=ECFXiHugxJ<$`W%Wm@coV&me_+cUMZaZ&=IFDH>u}j zo0%&4Y2ODcK*v3?FI6AQUmDtomZbWDg`H$HFxW zSbC8{9LLAA=gtOq#ox5W4zEnRvbPvg5`+kYtJRZ4x4kb&DwOy+XAW#X8)!Q0bFsk? zAB?mOhco+48S(M))<~t;7kZNR>mY;Kaeb^8%4M<0LM+P%iIezWsgw6bV(~T+w5zN+Rr#}sxiiTLu54yf_P@X&vw=j}S2?yRI z8<&PHwLP#u^PBIrl*pjt>L7*{Pam)y%}GFw%8_V}`IEt

$H;hy_G0?SYe$t6zOvzc!l+V#CpE^|PmM zN5PP1=GmtnwB=0mPQOegz&?-OVL9pbGkHx}c+A(gSNRJZKIM9LC8wcRlIffzWHDsl z_{1UY+A})?3pU&saH|U_t8P?rnhxTFV5^Wduub{1{ORt<8VI%%N~v=>Q*luH%H~bY zZ)}H?%x65}OvOwcDX5ZEdZs|@Cae7Ps5e_`gb%m*pi{t6gdG;FBY)U|RKPg{f7PbN z--`l46ET?*E~b0Kw*`!*qmHYaPy3ppkHK1mWDsRNjH{6RFs;2KG~Pgy;+idZt8zm8 z1z=gTr|Vu5psqe1!#!K3E9@=SemXz|YgW2(e2s+x$b{aR1Uru339Y1To5nIzgdYX+5tI@luDAq@mi&4aAK+IAO)Tfccwxc zQ8+sm7J(lo3m~Y;eowF4;;HLWFWv2)=Bt+5Tx6m@!PYoheF$5i)pb{%TV2nsflY?a z;q1h$%8n8HDD);I75H#XBYKmXBgt=Hsu?91Y$K0@Jb}3V1~#$x)w6-$s+_Cbs?4|~ ziru<2a|riE1G)GouRCn25@(-C_VJ3ATfIfOgM{XCB}l30;dp$#VQl zn}A_DHYsMreOvmwK_gPF5eWQ`uQY`dM0XXf0bOm4f(&Q7zn8;+pjEz$fI4`*8J`u9 zhD66CCwO5axN#Viq6iq2g9}ZL`r!*5-r=FbRPv_XZY-h&-IpH@|BO3@|<#_674XZ)U#eDhlMdxbe~ zlG1|MaQ&-GLNjZ2C6Ho}LHGM(U@$70^&H&XP7Yro-kK=n#88Y0D_g1&nxClo`p5}> zmeA67FwXlX@<5>@OX%?EZjB?!j!H_B^_kpe!<;d=G)z z_D%UnhF~d+)Dy%)T-&zKd~<8+h7EfMr&O|M=_|75UCl&+}~QTKW2cRSH82 zw0G|d6G>gv&-C_=u)4Ixhxe&xd$(0&>|?g+QoX7asA-N8?OdVxiRV8JnkSQjhCuI7 zurwmT?xL=nfI?9kKo{ z)7#Vbs-ZL|vj(1aclt@U=huw1c0YoRZ$r^s&ef4W$18yITz*Y1|NF7UiY4>aIpRTw z-aX{m=vbfAmoML6)_&0MtHYS>s*~0$pIqrUe%<<5zuIo!ukUrLV-`l#$7zm#<>6SJ zsktv!APiTO+7HKXmXb%S!6oZuJ=NkI#aS@{Ug3wWb<6T$1Qw)XE4t5d zo=sU<4S@8UQC(3h)k0*mTfOU+XI%!MTT%2PH_yXCC&dSzEC=6&P_pIc-bHjLHM@~u z;kCVeWWS&?!?t@UrxXnTgiDXzUy1n$xTpVoWU2Lh^;R&MkL}>{J|#A)&`j=46rl?r zjz@Tnwx_*gif4(XC1XzO-P%9;MN3>mc8fCM!Us=2z+!Vg5GL@H=UwzGc+A+ik~28X z`P@ANWe_-F-jmBGx7{xq3&Bs28mum#yNbF`i*?Btl$ds}{nuutvOx(qwb#WSt4HbB zf4sA2;rp+(QZ`Q_kGd?`4EvJ)+DSbsBaJ)7mrnTNUsd82ld(2_XVnZ)oXCG6d7gOj zv+f`iGqD7WVC7eJRkRv3i?pq?33-n=|4SYa+=M*G^{(K|eOmCQjkx^|$lyrRED&@H zl3*@uzBru-+7Nx5>`j4Bi?&XglL=5Vq9XsmptH_Sm*k5HP=Q*03>Mi~he-tW=kZ&T zC5ReZdYg{=gCoAUeA|m&tvyOn51aXQG>3v!<^xVYA~q+FHJ(iPb`y;<=UHzK;YoZ3 z;|TXf+Xo_XT~l8Y**&uSxlcpOreLL{oz!C#v}Aho-FK3poi!SIKX0~^=2SDY{&Jw) zQ40(J&ftc9UQM*mVr#m9*EK%3llZfX)@+3g7h0ozwx;~GZ*huzEHEHT;rwc|d_P9g zI*T|JX>Jph^)t=&I_sW+4?M76pyob@*|dq!arkq8v84#=&oimvXdwU2-(eDbEJr5% z6wB+%zdvY5peieMMM1B7L0rT4iEy#dZ{gKl1S8=-=?fG@aEdg7F-f;TUAl$iN+RcG z8iFlZUwb-4^dIXfxWKy{IG>cSrDpKwgKx}q_``s9Ht%{-sDf$4LgRr?A|-b|p((>T8cbaMWSbu@ur{8L{U;}CW}SOKu)5l8qW?tQ^r-Qs zx1To>wS(?IR_38txIuc^35nb{jUs{z?|DtBkYpchsrr{zFb0*@U)%wK%9vk4CN+9q z#nSYbNbpGN&nJ?KK#omy)*Rz|?6Ykv+|l&!7_wCouNn(h<|+@Qc(&4t!D% zGT2+2&*hJfCz>q0X@OLzS9IQAKlGD7d-&fK3X4#@7OYY*)h~kVIMi$_OS?nTewtZt z_Go2bYr4HnW&jFTy|~};2tw|xY@3|PH0&^%F^|t4yR0XbvYb<$ym_p>uL*6k&fJ>0 zEVX5F=QzhpTXjQL^S_^R8l{-*zw0&M*zH!lQO>T3mOQKfInBGUbz1#D;%F*tnlEPo z;2-3)mz!Pc4X9qj8#b#Ij&pF@mJ4UA^^_I%@% z7Y-qF%tFLQo9)xCW}^3BcrP9>l@P^Sid`01_ja8r?s(uj-OVcWqSW6Dyr;UWd;x@l z+3#>B#m>+)@`e|`O>#O{LIex?-`+e9e S#T+c~pN6XTjkn6?q5lUTC<+Gv literal 0 HcmV?d00001 diff --git a/Tests/Libraries/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs b/Tests/Libraries/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs index 02dfa3071..daa510f9e 100644 --- a/Tests/Libraries/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs +++ b/Tests/Libraries/Entitas.Unity.CodeGenerator/Editor/CodeGeneratorEditor.cs @@ -1,6 +1,7 @@ using System; using System.Reflection; using Entitas; +using Entitas.CodeGenerator; using UnityEditor; namespace Entitas.Unity.CodeGenerator { @@ -10,7 +11,19 @@ public static class CodeGeneratorEditor { public static void Generate() { var types = Assembly.GetAssembly(typeof(Entity)).GetTypes(); var config = new CodeGeneratorConfig(EntitasPreferencesEditor.LoadConfig()); - Entitas.CodeGenerator.CodeGenerator.Generate(types, config.pools, config.generatedFolderPath); + + var componentCodeGenerators = new IComponentCodeGenerator [] { + new IndicesLookupGenerator(), + new ComponentExtensionsGenerator() + }; + + var poolCodeGenerators = new IPoolCodeGenerator [] { + new PoolAttributeGenerator() + }; + + Entitas.CodeGenerator.CodeGenerator.Generate(types, config.pools, config.generatedFolderPath, + componentCodeGenerators, poolCodeGenerators); + AssetDatabase.Refresh(); } } diff --git a/bin/Entitas.zip b/bin/Entitas.zip index 266a0ec3cd9f49a4b0106b97bf70d522d5df7d92..b32727d7338ee226f215f214d0b478c0e0e7dc9f 100644 GIT binary patch delta 21468 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 delta 17647 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 L@Q$_m=70YO>=gX~