[
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: teodorvecerdi\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\notechie: # Replace with a single Otechie username\ncustom: ['https://teodorvecerdi.itch.io/dialogue-graph']\n"
  },
  {
    "path": ".gitignore",
    "content": "\n# Created by https://www.toptal.com/developers/gitignore/api/rider,unity\n# Edit at https://www.toptal.com/developers/gitignore?templates=rider,unity\n\n### Rider ###\n# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider\n# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839\n\n# User-specific stuff\n.idea/**/workspace.xml\n.idea/**/tasks.xml\n.idea/**/usage.statistics.xml\n.idea/**/dictionaries\n.idea/**/shelf\n\n# Generated files\n.idea/**/contentModel.xml\n\n# Sensitive or high-churn files\n.idea/**/dataSources/\n.idea/**/dataSources.ids\n.idea/**/dataSources.local.xml\n.idea/**/sqlDataSources.xml\n.idea/**/dynamic.xml\n.idea/**/uiDesigner.xml\n.idea/**/dbnavigator.xml\n\n# Gradle\n.idea/**/gradle.xml\n.idea/**/libraries\n\n# Gradle and Maven with auto-import\n# When using Gradle or Maven with auto-import, you should exclude module files,\n# since they will be recreated, and may cause churn.  Uncomment if using\n# auto-import.\n# .idea/artifacts\n# .idea/compiler.xml\n# .idea/jarRepositories.xml\n# .idea/modules.xml\n# .idea/*.iml\n# .idea/modules\n# *.iml\n# *.ipr\n\n# CMake\ncmake-build-*/\n\n# Mongo Explorer plugin\n.idea/**/mongoSettings.xml\n\n# File-based project format\n*.iws\n\n# IntelliJ\nout/\n\n# mpeltonen/sbt-idea plugin\n.idea_modules/\n\n# JIRA plugin\natlassian-ide-plugin.xml\n\n# Cursive Clojure plugin\n.idea/replstate.xml\n\n# Crashlytics plugin (for Android Studio and IntelliJ)\ncom_crashlytics_export_strings.xml\ncrashlytics.properties\ncrashlytics-build.properties\nfabric.properties\n\n# Editor-based Rest Client\n.idea/httpRequests\n\n# Android studio 3.1+ serialized cache file\n.idea/caches/build_file_checksums.ser\n\n### Unity ###\n# This .gitignore file should be placed at the root of your Unity project directory\n#\n# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore\n/[Ll]ibrary/\n/[Tt]emp/\n/[Oo]bj/\n/[Bb]uild/\n/[Bb]uilds/\n/[Ll]ogs/\n/[Uu]ser[Ss]ettings/\n\n# MemoryCaptures can get excessive in size.\n# They also could contain extremely sensitive data\n/[Mm]emoryCaptures/\n\n# Asset meta data should only be ignored when the corresponding asset is also ignored\n!/[Aa]ssets/**/*.meta\n\n# Uncomment this line if you wish to ignore the asset store tools plugin\n# /[Aa]ssets/AssetStoreTools*\n\n# Autogenerated Jetbrains Rider plugin\n/[Aa]ssets/Plugins/Editor/JetBrains*\n\n# Visual Studio cache directory\n.vs/\n\n# Gradle cache directory\n.gradle/\n\n# Autogenerated VS/MD/Consulo solution and project files\nExportedObj/\n.consulo/\n*.csproj\n*.unityproj\n*.sln\n*.suo\n*.tmp\n*.user\n*.userprefs\n*.pidb\n*.booproj\n*.svd\n*.pdb\n*.mdb\n*.opendb\n*.VC.db\n\n# Unity3D generated meta files\n*.pidb.meta\n*.pdb.meta\n*.mdb.meta\n\n# Unity3D generated file on crash reports\nsysinfo.txt\n\n# Builds\n*.apk\n*.unitypackage\n\n# Crashlytics generated file\n\n# Autogenerated files\nInitTestScene*.unity.meta\nInitTestScene*.unity\n\n\n# End of https://www.toptal.com/developers/gitignore/api/rider,unity\n\n# Symlink to force 'Samples~' to show up in unity\nSamples/\nSamples.meta\nSamples\n"
  },
  {
    "path": "Dependencies/SerializableCallback/.gitignore",
    "content": ""
  },
  {
    "path": "Dependencies/SerializableCallback/Editor/SerializableCallbackDrawer.cs",
    "content": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing UnityEditor;\nusing UnityEngine;\nusing Object = UnityEngine.Object;\n\n[CustomPropertyDrawer(typeof(TargetConstraintAttribute))]\n[CustomPropertyDrawer(typeof(SerializableCallbackBase), true)]\npublic class SerializableCallbackDrawer : PropertyDrawer {\n\n\tpublic override void OnGUI(Rect position, SerializedProperty property, GUIContent label) {\n\t\t// Indent label\n\t\tlabel.text = \" \" + label.text;\n\n#if UNITY_2019_1_OR_NEWER\n\t\tGUI.Box(position, \"\");\n#else\n\t\tGUI.Box(position, \"\", (GUIStyle)\n\t\t\t\"flow overlay box\");\n#endif\n\t\tposition.y += 4;\n\t\t// Using BeginProperty / EndProperty on the parent property means that\n\t\t// prefab override logic works on the entire property.\n\t\tproperty.serializedObject.Update();\n\t\tEditorGUI.BeginProperty(position, label, property);\n\t\t// Draw label\n\t\tRect pos = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);\n\n\t\tRect targetRect = new Rect(pos.x, pos.y, pos.width, EditorGUIUtility.singleLineHeight);\n\n\t\t// Get target\n\t\tSerializedProperty targetProp = property.FindPropertyRelative(\"_target\");\n\t\tobject target = targetProp.objectReferenceValue;\n\t\tif (attribute != null && attribute is TargetConstraintAttribute) {\n\t\t\tType targetType = (attribute as TargetConstraintAttribute).targetType;\n\t\t\tEditorGUI.ObjectField(targetRect, targetProp, targetType, GUIContent.none);\n\t\t} else EditorGUI.PropertyField(targetRect, targetProp, GUIContent.none);\n\n\t\tif (target == null) {\n\t\t\tRect helpBoxRect = new Rect(position.x + 8, targetRect.max.y + EditorGUIUtility.standardVerticalSpacing, position.width - 16, EditorGUIUtility.singleLineHeight);\n\t\t\tstring msg = \"Call not set. Execution will be slower.\";\n\t\t\tEditorGUI.HelpBox(helpBoxRect, msg, MessageType.Warning);\n\t\t} else if (target is MonoScript) {\n\t\t\tRect helpBoxRect = new Rect(position.x + 8, targetRect.max.y + EditorGUIUtility.standardVerticalSpacing, position.width - 16, EditorGUIUtility.singleLineHeight + EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing);\n\t\t\tstring msg = \"Assign a GameObject, Component or a ScriptableObject, not a script.\";\n\t\t\tEditorGUI.HelpBox(helpBoxRect, msg, MessageType.Warning);\n\t\t} else {\n\t\t\tint indent = EditorGUI.indentLevel;\n\t\t\tEditorGUI.indentLevel++;\n\n\t\t\t// Get method name\n\t\t\tSerializedProperty methodProp = property.FindPropertyRelative(\"_methodName\");\n\t\t\tstring methodName = methodProp.stringValue;\n\n\t\t\t// Get args\n\t\t\tSerializedProperty argProps = property.FindPropertyRelative(\"_args\");\n\t\t\tType[] argTypes = GetArgTypes(argProps);\n\n\t\t\t// Get dynamic\n\t\t\tSerializedProperty dynamicProp = property.FindPropertyRelative(\"_dynamic\");\n\t\t\tbool dynamic = dynamicProp.boolValue;\n\n\t\t\t// Get active method\n\t\t\tMethodInfo activeMethod = GetMethod(target, methodName, argTypes);\n\n\t\t\tGUIContent methodlabel = new GUIContent(\"n/a\");\n\t\t\tif (activeMethod != null) methodlabel = new GUIContent(PrettifyMethod(activeMethod));\n\t\t\telse if (!string.IsNullOrEmpty(methodName)) methodlabel = new GUIContent(\"Missing (\" + PrettifyMethod(methodName, argTypes) + \")\");\n\n\t\t\tRect methodRect = new Rect(position.x, targetRect.max.y + EditorGUIUtility.standardVerticalSpacing, position.width, EditorGUIUtility.singleLineHeight);\n\n\t\t\t// Method select button\n\t\t\tpos = EditorGUI.PrefixLabel(methodRect, GUIUtility.GetControlID(FocusType.Passive), new GUIContent(dynamic ? \"Method (dynamic)\" : \"Method\"));\n\t\t\tif (EditorGUI.DropdownButton(pos, methodlabel, FocusType.Keyboard)) {\n\t\t\t\tMethodSelector(property);\n\t\t\t}\n\n\t\t\tif (activeMethod != null && !dynamic) {\n\t\t\t\t// Args\n\t\t\t\tParameterInfo[] activeParameters = activeMethod.GetParameters();\n\t\t\t\tRect argRect = new Rect(position.x, methodRect.max.y + EditorGUIUtility.standardVerticalSpacing, position.width, EditorGUIUtility.singleLineHeight);\n\t\t\t\tstring[] types = new string[argProps.arraySize];\n\t\t\t\tfor (int i = 0; i < types.Length; i++) {\n\t\t\t\t\tSerializedProperty argProp = argProps.FindPropertyRelative(\"Array.data[\" + i + \"]\");\n\t\t\t\t\tGUIContent argLabel = new GUIContent(ObjectNames.NicifyVariableName(activeParameters[i].Name));\n\n\t\t\t\t\tEditorGUI.BeginChangeCheck();\n\t\t\t\t\tswitch ((Arg.ArgType) argProp.FindPropertyRelative(\"argType\").enumValueIndex) {\n\t\t\t\t\t\tcase Arg.ArgType.Bool:\n\t\t\t\t\t\t\tEditorGUI.PropertyField(argRect, argProp.FindPropertyRelative(\"boolValue\"), argLabel);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase Arg.ArgType.Int:\n\t\t\t\t\t\t\tEditorGUI.PropertyField(argRect, argProp.FindPropertyRelative(\"intValue\"), argLabel);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase Arg.ArgType.Float:\n\t\t\t\t\t\t\tEditorGUI.PropertyField(argRect, argProp.FindPropertyRelative(\"floatValue\"), argLabel);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase Arg.ArgType.String:\n\t\t\t\t\t\t\tEditorGUI.PropertyField(argRect, argProp.FindPropertyRelative(\"stringValue\"), argLabel);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase Arg.ArgType.Object:\n\t\t\t\t\t\t\tSerializedProperty typeProp = argProp.FindPropertyRelative(\"_typeName\");\n\t\t\t\t\t\t\tSerializedProperty objProp = argProp.FindPropertyRelative(\"objectValue\");\n\n\t\t\t\t\t\t\tif (typeProp != null) {\n\t\t\t\t\t\t\t\tType objType = Type.GetType(typeProp.stringValue, false);\n\t\t\t\t\t\t\t\tEditorGUI.BeginChangeCheck();\n\t\t\t\t\t\t\t\tObject obj = objProp.objectReferenceValue;\n\t\t\t\t\t\t\t\tobj = EditorGUI.ObjectField(argRect, argLabel, obj, objType, true);\n\t\t\t\t\t\t\t\tif (EditorGUI.EndChangeCheck()) {\n\t\t\t\t\t\t\t\t\tobjProp.objectReferenceValue = obj;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tEditorGUI.PropertyField(argRect, objProp, argLabel);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (EditorGUI.EndChangeCheck()) {\n\t\t\t\t\t\tproperty.FindPropertyRelative(\"dirty\").boolValue = true;\n\t\t\t\t\t}\n\t\t\t\t\targRect.y += EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;\n\t\t\t\t}\n\t\t\t}\n\t\t\tEditorGUI.indentLevel = indent;\n\t\t}\n\n\t\t// Set indent back to what it was\n\t\tEditorGUI.EndProperty();\n\t\tproperty.serializedObject.ApplyModifiedProperties();\n\t}\n\n\tprivate class MenuItem {\n\t\tpublic GenericMenu.MenuFunction action;\n\t\tpublic string path;\n\t\tpublic GUIContent label;\n\n\t\tpublic MenuItem(string path, string name, GenericMenu.MenuFunction action) {\n\t\t\tthis.action = action;\n\t\t\tthis.label = new GUIContent(path + '/' + name);\n\t\t\tthis.path = path;\n\t\t}\n\t}\n\tvoid MethodSelector(SerializedProperty property) {\n\t\t// Return type constraint\n\t\tType returnType = null;\n\t\t// Arg type constraint\n\t\tType[] argTypes = new Type[0];\n\n\t\t// Get return type and argument constraints\n\t\tSerializableCallbackBase dummy = GetDummyFunction(property);\n\t\tType[] genericTypes = dummy.GetType().BaseType.GetGenericArguments();\n\t\t// SerializableEventBase is always void return type\n\t\tif (dummy is SerializableEventBase) {\n\t\t\treturnType = typeof(void);\n\t\t\tif (genericTypes.Length > 0) {\n\t\t\t\targTypes = new Type[genericTypes.Length];\n\t\t\t\tArray.Copy(genericTypes, argTypes, genericTypes.Length);\n\t\t\t}\n\t\t} else {\n\t\t\tif (genericTypes != null && genericTypes.Length > 0) {\n\t\t\t\t// The last generic argument is the return type\n\t\t\t\treturnType = genericTypes[genericTypes.Length - 1];\n\t\t\t\tif (genericTypes.Length > 1) {\n\t\t\t\t\targTypes = new Type[genericTypes.Length - 1];\n\t\t\t\t\tArray.Copy(genericTypes, argTypes, genericTypes.Length - 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tSerializedProperty targetProp = property.FindPropertyRelative(\"_target\");\n\n\t\tList<MenuItem> dynamicItems = new List<MenuItem>();\n\t\tList<MenuItem> staticItems = new List<MenuItem>();\n\n\t\tList<Object> targets = new List<Object>() { targetProp.objectReferenceValue };\n\n\t\tif (targets[0] is Component) {\n\t\t\ttargets = (targets[0] as Component).gameObject.GetComponents<Component>().ToList<Object>();\n\t\t\ttargets.Add((targetProp.objectReferenceValue as Component).gameObject);\n\t\t} else if (targets[0] is GameObject) {\n\t\t\ttargets = (targets[0] as GameObject).GetComponents<Component>().ToList<Object>();\n\t\t\ttargets.Add(targetProp.objectReferenceValue as GameObject);\n\t\t}\n\t\tfor (int c = 0; c < targets.Count; c++) {\n\t\t\tObject t = targets[c];\n\t\t\tMethodInfo[] methods = targets[c].GetType().GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static);\n\n\t\t\tfor (int i = 0; i < methods.Length; i++) {\n\t\t\t\tMethodInfo method = methods[i];\n\n\t\t\t\t// Skip methods with wrong return type\n\t\t\t\tif (returnType != null && method.ReturnType != returnType) continue;\n\t\t\t\t// Skip methods with null return type\n\t\t\t\t// if (method.ReturnType == typeof(void)) continue;\n\t\t\t\t// Skip generic methods\n\t\t\t\tif (method.IsGenericMethod) continue;\n\n\t\t\t\tType[] parms = method.GetParameters().Select(x => x.ParameterType).ToArray();\n\n\t\t\t\t// Skip methods with more than 4 args\n\t\t\t\tif (parms.Length > 4) continue;\n\t\t\t\t// Skip methods with unsupported args\n\t\t\t\tif (parms.Any(x => !Arg.IsSupported(x))) continue;\n\n\t\t\t\tstring methodPrettyName = PrettifyMethod(methods[i]);\n\t\t\t\tstaticItems.Add(new MenuItem(targets[c].GetType().Name + \"/\" + methods[i].DeclaringType.Name, methodPrettyName, () => SetMethod(property, t, method, false)));\n\n\t\t\t\t// Skip methods with wrong constrained args\n\t\t\t\tif (argTypes.Length == 0 || !Enumerable.SequenceEqual(argTypes, parms)) continue;\n\n\t\t\t\tdynamicItems.Add(new MenuItem(targets[c].GetType().Name + \"/\" + methods[i].DeclaringType.Name, methods[i].Name, () => SetMethod(property, t, method, true)));\n\t\t\t}\n\t\t}\n\n\t\t// Construct and display context menu\n\t\tGenericMenu menu = new GenericMenu();\n\t\tif (dynamicItems.Count > 0) {\n\t\t\tstring[] paths = dynamicItems.GroupBy(x => x.path).Select(x => x.First().path).ToArray();\n\t\t\tforeach (string path in paths) {\n\t\t\t\tmenu.AddItem(new GUIContent(path + \"/Dynamic \" + PrettifyTypes(argTypes)), false, null);\n\t\t\t}\n\t\t\tfor (int i = 0; i < dynamicItems.Count; i++) {\n\t\t\t\tmenu.AddItem(dynamicItems[i].label, false, dynamicItems[i].action);\n\t\t\t}\n\t\t\tforeach (string path in paths) {\n\t\t\t\tmenu.AddItem(new GUIContent(path + \"/  \"), false, null);\n\t\t\t\tmenu.AddItem(new GUIContent(path + \"/Static parameters\"), false, null);\n\t\t\t}\n\t\t}\n\t\tfor (int i = 0; i < staticItems.Count; i++) {\n\t\t\tmenu.AddItem(staticItems[i].label, false, staticItems[i].action);\n\t\t}\n\t\tif (menu.GetItemCount() == 0) menu.AddDisabledItem(new GUIContent(\"No methods with return type '\" + GetTypeName(returnType) + \"'\"));\n\t\tmenu.ShowAsContext();\n\t}\n\n\tstring PrettifyMethod(string methodName, Type[] parmTypes) {\n\t\tstring parmnames = PrettifyTypes(parmTypes);\n\t\treturn methodName + \"(\" + parmnames + \")\";\n\t}\n\n\tstring PrettifyMethod(MethodInfo methodInfo) {\n\t\tif (methodInfo == null) throw new ArgumentNullException(\"methodInfo\");\n\t\tParameterInfo[] parms = methodInfo.GetParameters();\n\t\tstring parmnames = PrettifyTypes(parms.Select(x => x.ParameterType).ToArray());\n\t\treturn GetTypeName(methodInfo.ReturnParameter.ParameterType) + \" \" + methodInfo.Name + \"(\" + parmnames + \")\";\n\t}\n\n\tstring PrettifyTypes(Type[] types) {\n\t\tif (types == null) throw new ArgumentNullException(\"types\");\n\t\treturn string.Join(\", \", types.Select(x => GetTypeName(x)).ToArray());\n\t}\n\n\tMethodInfo GetMethod(object target, string methodName, Type[] types) {\n\t\tMethodInfo activeMethod = target.GetType().GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static, null, CallingConventions.Any, types, null);\n\t\treturn activeMethod;\n\t}\n\n\tprivate Type[] GetArgTypes(SerializedProperty argsProp) {\n\t\tType[] types = new Type[argsProp.arraySize];\n\t\tfor (int i = 0; i < argsProp.arraySize; i++) {\n\t\t\tSerializedProperty argProp = argsProp.GetArrayElementAtIndex(i);\n\t\t\tSerializedProperty typeNameProp = argProp.FindPropertyRelative(\"_typeName\");\n\t\t\tif (typeNameProp != null) types[i] = Type.GetType(typeNameProp.stringValue, false);\n\t\t\tif (types[i] == null) types[i] = Arg.RealType((Arg.ArgType) argProp.FindPropertyRelative(\"argType\").enumValueIndex);\n\t\t}\n\t\treturn types;\n\t}\n\n\tprivate void SetMethod(SerializedProperty property, UnityEngine.Object target, MethodInfo methodInfo, bool dynamic) {\n\t\tSerializedProperty targetProp = property.FindPropertyRelative(\"_target\");\n\t\ttargetProp.objectReferenceValue = target;\n\t\tSerializedProperty methodProp = property.FindPropertyRelative(\"_methodName\");\n\t\tmethodProp.stringValue = methodInfo.Name;\n\t\tSerializedProperty dynamicProp = property.FindPropertyRelative(\"_dynamic\");\n\t\tdynamicProp.boolValue = dynamic;\n\t\tSerializedProperty argProp = property.FindPropertyRelative(\"_args\");\n\t\tParameterInfo[] parameters = methodInfo.GetParameters();\n\t\targProp.arraySize = parameters.Length;\n\t\tfor (int i = 0; i < parameters.Length; i++) {\n\t\t\targProp.FindPropertyRelative(\"Array.data[\" + i + \"].argType\").enumValueIndex = (int) Arg.FromRealType(parameters[i].ParameterType);\n\t\t\targProp.FindPropertyRelative(\"Array.data[\" + i + \"]._typeName\").stringValue = parameters[i].ParameterType.AssemblyQualifiedName;\n\t\t}\n\t\tproperty.FindPropertyRelative(\"dirty\").boolValue = true;\n\t\tproperty.serializedObject.ApplyModifiedProperties();\n\t\tproperty.serializedObject.Update();\n\t}\n\n\tprivate static string GetTypeName(Type t) {\n\t\tif (t == typeof(int)) return \"int\";\n\t\telse if (t == typeof(float)) return \"float\";\n\t\telse if (t == typeof(string)) return \"string\";\n\t\telse if (t == typeof(bool)) return \"bool\";\n\t\telse if (t == typeof(void)) return \"void\";\n\t\telse return t.Name;\n\t}\n\n\tpublic override float GetPropertyHeight(SerializedProperty property, GUIContent label) {\n\t\tfloat lineheight = EditorGUIUtility.standardVerticalSpacing + EditorGUIUtility.singleLineHeight;\n\t\tSerializedProperty targetProp = property.FindPropertyRelative(\"_target\");\n\t\tSerializedProperty argProps = property.FindPropertyRelative(\"_args\");\n\t\tSerializedProperty dynamicProp = property.FindPropertyRelative(\"_dynamic\");\n\t\tfloat height = lineheight + lineheight;\n\t\tif (targetProp.objectReferenceValue != null && targetProp.objectReferenceValue is MonoScript) height += lineheight;\n\t\telse if (targetProp.objectReferenceValue != null && !dynamicProp.boolValue) height += argProps.arraySize * lineheight;\n\t\theight += 8;\n\t\treturn height;\n\t}\n\n\tprivate static SerializableCallbackBase GetDummyFunction(SerializedProperty prop) {\n\t\tstring stringValue = prop.FindPropertyRelative(\"_typeName\").stringValue;\n\t\tType type = Type.GetType(stringValue, false);\n\t\tSerializableCallbackBase result;\n\t\tif (type == null) {\n\t\t\treturn null;\n\t\t} else {\n\t\t\tresult = (Activator.CreateInstance(type) as SerializableCallbackBase);\n\t\t}\n\t\treturn result;\n\t}\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Editor/SerializableCallbackDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 65cd8a53f6f9cf04ea4aa8e2743322fd\ntimeCreated: 1513845239\nlicenseType: Pro\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Editor/Siccity.SerializableCallback.Editor.asmdef",
    "content": "{\n    \"name\": \"Siccity.SerializableCallback.Editor\",\n    \"references\": [\n        \"GUID:11a2306c728a4b843a652ec6c2f142bc\"\n    ],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": false,\n    \"precompiledReferences\": [],\n    \"autoReferenced\": true,\n    \"defineConstraints\": [],\n    \"versionDefines\": [],\n    \"noEngineReferences\": false\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Editor/Siccity.SerializableCallback.Editor.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: a49fd1d25e23fd14e85d1cbf342bb06f\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: 39c1d273b3e79e346a281e4a542a63a6\nfolderAsset: yes\ntimeCreated: 1513845239\nlicenseType: Pro\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2017 Thor Brigsted\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Dependencies/SerializableCallback/LICENSE.md.meta",
    "content": "fileFormatVersion: 2\nguid: 664adef14643bfe44a13ce197b3a540c\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/README.md",
    "content": "### SerializableCallback\nLets you drag-and-drop methods with or without return values / parameters in the Unity inspector.\nIt uses expression trees and reflection to cache a delegate on first execution.\n\nUsage is identical to UnityEvent\n\n![unity_inspector](https://user-images.githubusercontent.com/6402525/34294989-46de127e-e70b-11e7-84f0-99bc4525a8f5.png)\n```csharp\npublic class MyClass : MonoBehaviour {\n    //These fields are shown in the inspector\n    public SerializableCallback callback; // supports all non-void return types\n    public Condition condition; // supports bool return types only\n    public GetProduct getProduct; // supports MyProduct return types only\n\n    void Start() {\n        // Callbacks can be invoked with or without parameters, and with different types\n        Debug.Log(callback.Invoke()); // returns object\n        Debug.Log(condition.Invoke()); // returns bool\n        Debug.Log(getProduct.Invoke(2)); // returns MyProduct\n    }\n\n    // As with UnityEvents, custom callbacks must have a non-generic wrapper class marked as [Serializable] in order to be serialized by Unity\n    [Serializable]\n    public class Condition : SerializableCallback<bool> {}\n\n    // Last generic type parameter is the return type, staying consistent with System.Func\n    [Serializable]\n    public class GetProduct : SerializableCallback<int, MyProduct> {}\n}\n```\n\n| Performance (100000 iterations)              | Time      |\n| -------------------------------------------- | --------- |\n| bool Method(float)                           | 00.00304s |\n| SerializedCallback<float, bool> (Persistent) | 00.01026s |\n| SerializedCallback<float, bool> (Dynamic)    | 00.00797s |\n\n\n### Installing with Unity Package Manager\nTo install this project as a dependency using the Unity Package Manager,\nadd the following line to your project's `manifest.json`:\n\n```\n\"com.github.siccity.serializablecallback\": \"git+https://github.com/Siccity/SerializableCallback.git\"\n```\n\nJoin the [Discord](https://discord.gg/qgPrHv4 \"Join Discord server\") server to leave feedback or get support.\n\n\n"
  },
  {
    "path": "Dependencies/SerializableCallback/README.md.meta",
    "content": "fileFormatVersion: 2\nguid: b5a8c7667bbebba4ca6545be57800251\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/Attributes/TargetConstraintAttribute.cs",
    "content": "﻿using UnityEngine;\nusing System;\n\n/// <summary> Add to fields of your class extending SerializableCallbackBase<T,..> to limit which types can be assigned to it. </summary>\npublic class TargetConstraintAttribute : PropertyAttribute {\n\tpublic Type targetType;\n\n\t/// <summary> Add to fields of your class extending SerializableCallbackBase<T,..> to limit which types can be assigned to it. </summary>\n\tpublic TargetConstraintAttribute(Type targetType) {\n\t\tthis.targetType = targetType;\n\t}\n}\n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/Attributes/TargetConstraintAttribute.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 4b9b7d20cf54ac6489b84d21c29a4c69\ntimeCreated: 1536132736\nlicenseType: Pro\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/Attributes.meta",
    "content": "fileFormatVersion: 2\nguid: 4fd350e49301e4445a1cbe580fe9eec7\nfolderAsset: yes\ntimeCreated: 1536132750\nlicenseType: Pro\nDefaultImporter:\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/InvokableCallback.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\npublic class InvokableCallback<TReturn> : InvokableCallbackBase<TReturn> {\n\n\tpublic Func<TReturn> func;\n\n\tpublic TReturn Invoke() {\n\t\treturn func();\n\t}\n\n\tpublic override TReturn Invoke(params object[] args) {\n\t\treturn func();\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableCallback(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\tfunc = () => default(TReturn);\n\t\t} else {\n\t\t\tfunc = (System.Func<TReturn>) System.Delegate.CreateDelegate(typeof(System.Func<TReturn>), target, methodName);\n\t\t}\n\t}\n}\n\npublic class InvokableCallback<T0, TReturn> : InvokableCallbackBase<TReturn> {\n\n\tpublic Func<T0, TReturn> func;\n\n\tpublic TReturn Invoke(T0 arg0) {\n\t\treturn func(arg0);\n\t}\n\n\tpublic override TReturn Invoke(params object[] args) {\n\t\t// Convert from special \"unity-nulls\" to true null\n\t\tif (args[0] is UnityEngine.Object && (UnityEngine.Object) args[0] == null) args[0] = null;\n\t\treturn func((T0) args[0]);\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableCallback(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\tfunc = x => default(TReturn);\n\t\t} else {\n\t\t\tfunc = (System.Func<T0, TReturn>) System.Delegate.CreateDelegate(typeof(System.Func<T0, TReturn>), target, methodName);\n\t\t}\n\t}\n}\n\npublic class InvokableCallback<T0, T1, TReturn> : InvokableCallbackBase<TReturn> {\n\n\tpublic Func<T0, T1, TReturn> func;\n\n\tpublic TReturn Invoke(T0 arg0, T1 arg1) {\n\t\treturn func(arg0, arg1);\n\t}\n\n\tpublic override TReturn Invoke(params object[] args) {\n\t\t// Convert from special \"unity-nulls\" to true null\n\t\tif (args[0] is UnityEngine.Object && (UnityEngine.Object) args[0] == null) args[0] = null;\n\t\tif (args[1] is UnityEngine.Object && (UnityEngine.Object) args[1] == null) args[1] = null;\n\t\treturn func((T0) args[0], (T1) args[1]);\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableCallback(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\tfunc = (x, y) => default(TReturn);\n\t\t} else {\n\t\t\tfunc = (System.Func<T0, T1, TReturn>) System.Delegate.CreateDelegate(typeof(System.Func<T0, T1, TReturn>), target, methodName);\n\t\t}\n\t}\n}\n\npublic class InvokableCallback<T0, T1, T2, TReturn> : InvokableCallbackBase<TReturn> {\n\n\tpublic Func<T0, T1, T2, TReturn> func;\n\n\tpublic TReturn Invoke(T0 arg0, T1 arg1, T2 arg2) {\n\t\treturn func(arg0, arg1, arg2);\n\t}\n\n\tpublic override TReturn Invoke(params object[] args) {\n\t\t// Convert from special \"unity-nulls\" to true null\n\t\tif (args[0] is UnityEngine.Object && (UnityEngine.Object) args[0] == null) args[0] = null;\n\t\tif (args[1] is UnityEngine.Object && (UnityEngine.Object) args[1] == null) args[1] = null;\n\t\tif (args[2] is UnityEngine.Object && (UnityEngine.Object) args[2] == null) args[2] = null;\n\t\treturn func((T0) args[0], (T1) args[1], (T2) args[2]);\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableCallback(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\tfunc = (x, y, z) => default(TReturn);\n\t\t} else {\n\t\t\tfunc = (System.Func<T0, T1, T2, TReturn>) System.Delegate.CreateDelegate(typeof(System.Func<T0, T1, T2, TReturn>), target, methodName);\n\t\t}\n\t}\n}\n\npublic class InvokableCallback<T0, T1, T2, T3, TReturn> : InvokableCallbackBase<TReturn> {\n\n\tpublic Func<T0, T1, T2, T3, TReturn> func;\n\n\tpublic TReturn Invoke(T0 arg0, T1 arg1, T2 arg2, T3 arg3) {\n\t\treturn func(arg0, arg1, arg2, arg3);\n\t}\n\n\tpublic override TReturn Invoke(params object[] args) {\n\t\t// Convert from special \"unity-nulls\" to true null\n\t\tif (args[0] is UnityEngine.Object && (UnityEngine.Object) args[0] == null) args[0] = null;\n\t\tif (args[1] is UnityEngine.Object && (UnityEngine.Object) args[1] == null) args[1] = null;\n\t\tif (args[2] is UnityEngine.Object && (UnityEngine.Object) args[2] == null) args[2] = null;\n\t\tif (args[3] is UnityEngine.Object && (UnityEngine.Object) args[3] == null) args[3] = null;\n\t\treturn func((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3]);\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableCallback(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\tfunc = (x, y, z, w) => default(TReturn);\n\t\t} else {\n\t\t\tfunc = (System.Func<T0, T1, T2, T3, TReturn>) System.Delegate.CreateDelegate(typeof(System.Func<T0, T1, T2, T3, TReturn>), target, methodName);\n\t\t}\n\t}\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/InvokableCallback.cs.meta",
    "content": "fileFormatVersion: 2\nguid: ca67a6ce15814b743b8e123c175ce649\ntimeCreated: 1515587326\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/InvokableCallbackBase.cs",
    "content": "﻿public abstract class InvokableCallbackBase<TReturn> {\n\tpublic abstract TReturn Invoke(params object[] args);\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/InvokableCallbackBase.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 9147523dbcc2f2f46878180063444518\ntimeCreated: 1515583421\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/InvokableEvent.cs",
    "content": "﻿using System;\n\npublic class InvokableEvent : InvokableEventBase {\n\n\tpublic System.Action action;\n\n\tpublic void Invoke() {\n\t\taction();\n\t}\n\n\tpublic override void Invoke(params object[] args) {\n\t\taction();\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableEvent(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\taction = () => { };\n\t\t} else {\n\t\t\taction = (System.Action) System.Delegate.CreateDelegate(typeof(System.Action), target, methodName);\n\t\t}\n\t}\n}\n\npublic class InvokableEvent<T0> : InvokableEventBase {\n\n\tpublic Action<T0> action;\n\n\tpublic void Invoke(T0 arg0) {\n\t\taction(arg0);\n\t}\n\n\tpublic override void Invoke(params object[] args) {\n\t\taction((T0) args[0]);\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableEvent(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\taction = x => { };\n\t\t} else {\n\t\t\taction = (System.Action<T0>) System.Delegate.CreateDelegate(typeof(System.Action<T0>), target, methodName);\n\t\t}\n\t}\n}\n\npublic class InvokableEvent<T0, T1> : InvokableEventBase {\n\n\tpublic Action<T0, T1> action;\n\n\tpublic void Invoke(T0 arg0, T1 arg1) {\n\t\taction(arg0, arg1);\n\t}\n\n\tpublic override void Invoke(params object[] args) {\n\t\taction((T0) args[0], (T1) args[1]);\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableEvent(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\taction = (x, y) => { };\n\t\t} else {\n\t\t\taction = (System.Action<T0, T1>) System.Delegate.CreateDelegate(typeof(System.Action<T0, T1>), target, methodName);\n\t\t}\n\t}\n}\n\npublic class InvokableEvent<T0, T1, T2> : InvokableEventBase {\n\n\tpublic Action<T0, T1, T2> action;\n\n\tpublic void Invoke(T0 arg0, T1 arg1, T2 arg2) {\n\t\taction(arg0, arg1, arg2);\n\t}\n\n\tpublic override void Invoke(params object[] args) {\n\t\taction((T0) args[0], (T1) args[1], (T2) args[2]);\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableEvent(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\taction = (x, y, z) => { };\n\t\t} else {\n\t\t\taction = (System.Action<T0, T1, T2>) System.Delegate.CreateDelegate(typeof(System.Action<T0, T1, T2>), target, methodName);\n\t\t}\n\t}\n}\n\npublic class InvokableEvent<T0, T1, T2, T3> : InvokableEventBase {\n\n\tpublic Action<T0, T1, T2, T3> action;\n\n\tpublic void Invoke(T0 arg0, T1 arg1, T2 arg2, T3 arg3) {\n\t\taction(arg0, arg1, arg2, arg3);\n\t}\n\n\tpublic override void Invoke(params object[] args) {\n\t\taction((T0) args[0], (T1) args[1], (T2) args[2], (T3) args[3]);\n\t}\n\n\t/// <summary> Constructor </summary>\n\tpublic InvokableEvent(object target, string methodName) {\n\t\tif (target == null || string.IsNullOrEmpty(methodName)) {\n\t\t\taction = (x, y, z, w) => { };\n\t\t} else {\n\t\t\taction = (System.Action<T0, T1, T2, T3>) System.Delegate.CreateDelegate(typeof(System.Action<T0, T1, T2, T3>), target, methodName);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/InvokableEvent.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 51f8a42e6f95b694cb28ca372e32aef3\ntimeCreated: 1515748293\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/InvokableEventBase.cs",
    "content": "﻿public abstract class InvokableEventBase {\n\tpublic abstract void Invoke(params object[] args);\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/InvokableEventBase.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e958262ec96656d459752d5df5faa52e\ntimeCreated: 1515748285\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/SerializableCallback.cs",
    "content": "using System;\nusing System.Linq.Expressions;\nusing System.Reflection;\nusing UnityEngine;\n\npublic abstract class SerializableCallback<TReturn> : SerializableCallbackBase<TReturn> {\n\tpublic TReturn Invoke() {\n\t\tif (func == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableCallback<TReturn> call = func as InvokableCallback<TReturn>;\n\t\t\treturn call.Invoke();\n\t\t} else {\n\t\t\treturn func.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tfunc = new InvokableCallback<TReturn>(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tfunc = new InvokableCallback<TReturn>(target, methodName);\n\t\t\t} else {\n\t\t\t\tfunc = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic abstract class SerializableCallback<T0, TReturn> : SerializableCallbackBase<TReturn> {\n\tpublic TReturn Invoke(T0 arg0) {\n\t\tif (func == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableCallback<T0, TReturn> call = func as InvokableCallback<T0, TReturn>;\n\t\t\treturn call.Invoke(arg0);\n\t\t} else {\n\t\t\treturn func.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tfunc = new InvokableCallback<T0, TReturn>(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tfunc = new InvokableCallback<T0, TReturn>(target, methodName);\n\t\t\t} else {\n\t\t\t\tfunc = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic abstract class SerializableCallback<T0, T1, TReturn> : SerializableCallbackBase<TReturn> {\n\tpublic TReturn Invoke(T0 arg0, T1 arg1) {\n\t\tif (func == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableCallback<T0, T1, TReturn> call = func as InvokableCallback<T0, T1, TReturn>;\n\t\t\treturn call.Invoke(arg0, arg1);\n\t\t} else {\n\t\t\treturn func.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tfunc = new InvokableCallback<T0, T1, TReturn>(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tfunc = new InvokableCallback<T0, T1, TReturn>(target, methodName);\n\t\t\t} else {\n\t\t\t\tfunc = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic abstract class SerializableCallback<T0, T1, T2, TReturn> : SerializableCallbackBase<TReturn> {\n\tpublic TReturn Invoke(T0 arg0, T1 arg1, T2 arg2) {\n\t\tif (func == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableCallback<T0, T1, T2, TReturn> call = func as InvokableCallback<T0, T1, T2, TReturn>;\n\t\t\treturn call.Invoke(arg0, arg1, arg2);\n\t\t} else {\n\t\t\treturn func.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tfunc = new InvokableCallback<T0, T1, T2, TReturn>(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tfunc = new InvokableCallback<T0, T1, T2, TReturn>(target, methodName);\n\t\t\t} else {\n\t\t\t\tfunc = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic abstract class SerializableCallback<T0, T1, T2, T3, TReturn> : SerializableCallbackBase<TReturn> {\n\tpublic TReturn Invoke(T0 arg0, T1 arg1, T2 arg2, T3 arg3) {\n\t\tif (func == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableCallback<T0, T1, T2, T3, TReturn> call = func as InvokableCallback<T0, T1, T2, T3, TReturn>;\n\t\t\treturn call.Invoke(arg0, arg1, arg2, arg3);\n\t\t} else {\n\t\t\treturn func.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tfunc = new InvokableCallback<T0, T1, T2, T3, TReturn>(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tfunc = new InvokableCallback<T0, T1, T2, T3, TReturn>(target, methodName);\n\t\t\t} else {\n\t\t\t\tfunc = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/SerializableCallback.cs.meta",
    "content": "fileFormatVersion: 2\nguid: dc926a8278d45964e842b3ee4b9e593b\ntimeCreated: 1513845239\nlicenseType: Pro\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/SerializableCallbackBase.cs",
    "content": "using System;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Reflection;\nusing UnityEngine;\nusing Object = UnityEngine.Object;\n\npublic abstract class SerializableCallbackBase<TReturn> : SerializableCallbackBase {\n\tpublic InvokableCallbackBase<TReturn> func;\n\n\tpublic override void ClearCache() {\n\t\tbase.ClearCache();\n\t\tfunc = null;\n\t}\n\n\tprotected InvokableCallbackBase<TReturn> GetPersistentMethod() {\n\t\tType[] types = new Type[ArgRealTypes.Length + 1];\n\t\tArray.Copy(ArgRealTypes, types, ArgRealTypes.Length);\n\t\ttypes[types.Length - 1] = typeof(TReturn);\n\n\t\tType genericType = null;\n\t\tswitch (types.Length) {\n\t\t\tcase 1:\n\t\t\t\tgenericType = typeof(InvokableCallback<>).MakeGenericType(types);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tgenericType = typeof(InvokableCallback<,>).MakeGenericType(types);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tgenericType = typeof(InvokableCallback<, ,>).MakeGenericType(types);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tgenericType = typeof(InvokableCallback<, , ,>).MakeGenericType(types);\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\tgenericType = typeof(InvokableCallback<, , , ,>).MakeGenericType(types);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new ArgumentException(types.Length + \"args\");\n\t\t}\n\t\treturn Activator.CreateInstance(genericType, new object[] { target, methodName }) as InvokableCallbackBase<TReturn>;\n\t}\n}\n\n/// <summary> An inspector-friendly serializable function </summary>\n[System.Serializable]\npublic abstract class SerializableCallbackBase : ISerializationCallbackReceiver {\n\n\t/// <summary> Target object </summary>\n\tpublic Object target { get { return _target; } set { _target = value; ClearCache(); } }\n\t/// <summary> Target method name </summary>\n\tpublic string methodName { get { return _methodName; } set { _methodName = value; ClearCache(); } }\n\tpublic object[] Args { get { return args != null ? args : args = _args.Select(x => x.GetValue()).ToArray(); } }\n\tpublic object[] args;\n\tpublic Type[] ArgTypes { get { return argTypes != null ? argTypes : argTypes = _args.Select(x => Arg.RealType(x.argType)).ToArray(); } }\n\tpublic Type[] argTypes;\n\tpublic Type[] ArgRealTypes { get { return argRealTypes != null ? argRealTypes : argRealTypes = _args.Select(x => Type.GetType(x._typeName)).ToArray(); } }\n\tpublic Type[] argRealTypes;\n\tpublic bool dynamic { get { return _dynamic; } set { _dynamic = value; ClearCache(); } }\n\n\t[SerializeField] protected Object _target;\n\t[SerializeField] protected string _methodName;\n\t[SerializeField] protected Arg[] _args;\n\t[SerializeField] protected bool _dynamic;\n#pragma warning disable 0414\n\t[SerializeField] private string _typeName;\n#pragma warning restore 0414\n\n\t[SerializeField] private bool dirty;\n\n#if UNITY_EDITOR\n\tprotected SerializableCallbackBase() {\n\t\t_typeName = base.GetType().AssemblyQualifiedName;\n\t}\n#endif\n\n\tpublic virtual void ClearCache() {\n\t\targTypes = null;\n\t\targs = null;\n\t}\n\n\tpublic void SetMethod(Object target, string methodName, bool dynamic, params Arg[] args) {\n\t\t_target = target;\n\t\t_methodName = methodName;\n\t\t_dynamic = dynamic;\n\t\t_args = args;\n\t\tClearCache();\n\t}\n\n\tprotected abstract void Cache();\n\n\tpublic void OnBeforeSerialize() {\n#if UNITY_EDITOR\n\t\tif (dirty) { ClearCache(); dirty = false; }\n#endif\n\t}\n\n\tpublic void OnAfterDeserialize() {\n#if UNITY_EDITOR\n\t\t_typeName = base.GetType().AssemblyQualifiedName;\n#endif\n\t}\n}\n\n[System.Serializable]\npublic struct Arg {\n\tpublic enum ArgType { Unsupported, Bool, Int, Float, String, Object }\n\tpublic bool boolValue;\n\tpublic int intValue;\n\tpublic float floatValue;\n\tpublic string stringValue;\n\tpublic Object objectValue;\n\tpublic ArgType argType;\n\tpublic string _typeName;\n\n\tpublic object GetValue() {\n\t\treturn GetValue(argType);\n\t}\n\n\tpublic object GetValue(ArgType type) {\n\t\tswitch (type) {\n\t\t\tcase ArgType.Bool:\n\t\t\t\treturn boolValue;\n\t\t\tcase ArgType.Int:\n\t\t\t\treturn intValue;\n\t\t\tcase ArgType.Float:\n\t\t\t\treturn floatValue;\n\t\t\tcase ArgType.String:\n\t\t\t\treturn stringValue;\n\t\t\tcase ArgType.Object:\n\t\t\t\treturn objectValue;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic static Type RealType(ArgType type) {\n\t\tswitch (type) {\n\t\t\tcase ArgType.Bool:\n\t\t\t\treturn typeof(bool);\n\t\t\tcase ArgType.Int:\n\t\t\t\treturn typeof(int);\n\t\t\tcase ArgType.Float:\n\t\t\t\treturn typeof(float);\n\t\t\tcase ArgType.String:\n\t\t\t\treturn typeof(string);\n\t\t\tcase ArgType.Object:\n\t\t\t\treturn typeof(Object);\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t}\n\n\tpublic static ArgType FromRealType(Type type) {\n\t\tif (type == typeof(bool)) return ArgType.Bool;\n\t\telse if (type == typeof(int)) return ArgType.Int;\n\t\telse if (type == typeof(float)) return ArgType.Float;\n\t\telse if (type == typeof(String)) return ArgType.String;\n\t\telse if (typeof(Object).IsAssignableFrom(type)) return ArgType.Object;\n\t\telse return ArgType.Unsupported;\n\t}\n\n\tpublic static bool IsSupported(Type type) {\n\t\treturn FromRealType(type) != ArgType.Unsupported;\n\t}\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/SerializableCallbackBase.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7281861ef496a34429213165496d8cf3\ntimeCreated: 1513845239\nlicenseType: Pro\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/SerializableEvent.cs",
    "content": "﻿[System.Serializable]\npublic class SerializableEvent : SerializableEventBase {\n\tpublic void Invoke() {\n\t\tif (invokable == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableEvent call = invokable as InvokableEvent;\n\t\t\tcall.Invoke();\n\t\t} else {\n\t\t\tinvokable.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tinvokable = new InvokableEvent(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tinvokable = new InvokableEvent(target, methodName);\n\t\t\t} else {\n\t\t\t\tinvokable = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic abstract class SerializableEvent<T0> : SerializableEventBase {\n\tpublic void Invoke(T0 arg0) {\n\t\tif (invokable == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableEvent<T0> call = invokable as InvokableEvent<T0>;\n\t\t\tcall.Invoke(arg0);\n\t\t} else {\n\t\t\tinvokable.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tinvokable = new InvokableEvent<T0>(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tinvokable = new InvokableEvent<T0>(target, methodName);\n\t\t\t} else {\n\t\t\t\tinvokable = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic abstract class SerializableEvent<T0, T1> : SerializableEventBase {\n\tpublic void Invoke(T0 arg0, T1 arg1) {\n\t\tif (invokable == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableEvent<T0, T1> call = invokable as InvokableEvent<T0, T1>;\n\t\t\tcall.Invoke(arg0, arg1);\n\t\t} else {\n\t\t\tinvokable.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tinvokable = new InvokableEvent<T0, T1>(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tinvokable = new InvokableEvent<T0, T1>(target, methodName);\n\t\t\t} else {\n\t\t\t\tinvokable = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic abstract class SerializableEvent<T0, T1, T2> : SerializableEventBase {\n\tpublic void Invoke(T0 arg0, T1 arg1, T2 arg2) {\n\t\tif (invokable == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableEvent<T0, T1, T2> call = invokable as InvokableEvent<T0, T1, T2>;\n\t\t\tcall.Invoke(arg0, arg1, arg2);\n\t\t} else {\n\t\t\tinvokable.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tinvokable = new InvokableEvent<T0, T1, T2>(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tinvokable = new InvokableEvent<T0, T1, T2>(target, methodName);\n\t\t\t} else {\n\t\t\t\tinvokable = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic abstract class SerializableEvent<T0, T1, T2, T3> : SerializableEventBase {\n\tpublic void Invoke(T0 arg0, T1 arg1, T2 arg2, T3 arg3) {\n\t\tif (invokable == null) Cache();\n\t\tif (_dynamic) {\n\t\t\tInvokableEvent<T0, T1, T2, T3> call = invokable as InvokableEvent<T0, T1, T2, T3>;\n\t\t\tcall.Invoke(arg0, arg1, arg2, arg3);\n\t\t} else {\n\t\t\tinvokable.Invoke(Args);\n\t\t}\n\t}\n\n\tprotected override void Cache() {\n\t\tif (_target == null || string.IsNullOrEmpty(_methodName)) {\n\t\t\tinvokable = new InvokableEvent<T0, T1, T2, T3>(null, null);\n\t\t} else {\n\t\t\tif (_dynamic) {\n\t\t\t\tinvokable = new InvokableEvent<T0, T1, T2, T3>(target, methodName);\n\t\t\t} else {\n\t\t\t\tinvokable = GetPersistentMethod();\n\t\t\t}\n\t\t}\n\t}\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/SerializableEvent.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 874a1a13ec4740a4387fe34d59931868\ntimeCreated: 1515747693\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/SerializableEventBase.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing System;\n\npublic abstract class SerializableEventBase : SerializableCallbackBase {\n\tpublic InvokableEventBase invokable;\n\n\tpublic override void ClearCache() {\n\t\tbase.ClearCache();\n\t\tinvokable = null;\n\t}\n\n\tprotected InvokableEventBase GetPersistentMethod() {\n\t\tType[] types = new Type[ArgTypes.Length];\n\t\tArray.Copy(ArgTypes, types, ArgTypes.Length);\n\n\t\tType genericType = null;\n\t\tswitch (types.Length) {\n\t\t\tcase 0:\n\t\t\t\tgenericType = typeof(InvokableEvent);\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tgenericType = typeof(InvokableEvent<>).MakeGenericType(types);\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tgenericType = typeof(InvokableEvent<,>).MakeGenericType(types);\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tgenericType = typeof(InvokableEvent<, ,>).MakeGenericType(types);\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tgenericType = typeof(InvokableEvent<, , ,>).MakeGenericType(types);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new ArgumentException(types.Length + \"args\");\n\t\t}\n\t\treturn Activator.CreateInstance(genericType, new object[] { target, methodName }) as InvokableEventBase;\n\t}\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/SerializableEventBase.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e5856b88cee94a64c95101c3f3de4754\ntimeCreated: 1515747887\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/Siccity.SerializableCallback.asmdef",
    "content": "{\n    \"name\": \"Siccity.SerializableCallback\",\n    \"references\": [],\n    \"includePlatforms\": [],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": false,\n    \"precompiledReferences\": [],\n    \"autoReferenced\": true,\n    \"defineConstraints\": [],\n    \"versionDefines\": [],\n    \"noEngineReferences\": false\n}"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/Siccity.SerializableCallback.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 11a2306c728a4b843a652ec6c2f142bc\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/Test.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing UnityEngine;\n\npublic class Test : MonoBehaviour {\n\tconst int ITERATIONS = 100000;\n\tpublic float f = 0.5f;\n\tpublic string s;\n\tpublic System.Func<float, bool> RegularDelegate;\n\tpublic System.Func<float, bool> DynamicDelegate;\n\tpublic Condition condition;\n\tpublic SerializableEvent ev;\n\n\tvoid Start() {\n\t\tRegularDelegate = TestMethod;\n\t\tDynamicDelegate = (System.Func<float, bool>) System.Delegate.CreateDelegate(typeof(System.Func<float, bool>), this, \"TestMethod\");\n\t\tcondition.Invoke(f);\n\t}\n\n\tvoid Update() {\n\t\tvar method = Stopwatch.StartNew();\n\t\tbool methodb = false;\n\t\tfor (int i = 0; i < ITERATIONS; ++i) {\n\t\t\tmethodb = TestMethod(f);\n\t\t}\n\t\tmethod.Stop();\n\n\t\tvar regularDelegate = Stopwatch.StartNew();\n\t\tbool regularDelegateb = false;\n\t\tfor (int i = 0; i < ITERATIONS; ++i) {\n\t\t\tregularDelegateb = RegularDelegate(f);\n\t\t}\n\t\tregularDelegate.Stop();\n\n\t\tvar dynamicDelegate = Stopwatch.StartNew();\n\t\tbool dynamicDelegateb = false;\n\t\tfor (int i = 0; i < ITERATIONS; ++i) {\n\t\t\tdynamicDelegateb = DynamicDelegate(f);\n\t\t}\n\t\tdynamicDelegate.Stop();\n\n\t\tvar serializedDelegate = Stopwatch.StartNew();\n\t\tbool serializedDelegateb = false;\n\t\tfor (int i = 0; i < ITERATIONS; ++i) {\n\t\t\tserializedDelegateb = condition.Invoke(f);\n\t\t}\n\t\tserializedDelegate.Stop();\n\n\t\tvar serializedEvent = Stopwatch.StartNew();\n\t\tfor (int i = 0; i < ITERATIONS; ++i) {\n\t\t\tev.Invoke();\n\t\t}\n\t\tserializedEvent.Stop();\n\n\t\tUnityEngine.Debug.Log(\"Method: \" + methodb + method.Elapsed);\n\t\tUnityEngine.Debug.Log(\"RegularDelegate: \" + regularDelegateb + regularDelegate.Elapsed);\n\t\tUnityEngine.Debug.Log(\"DynamicDelegate: \" + dynamicDelegateb + dynamicDelegate.Elapsed);\n\t\tUnityEngine.Debug.Log(\"SerializedCallback: \" + serializedDelegateb + serializedDelegate.Elapsed);\n\t\tUnityEngine.Debug.Log(\"SerializedEvent: \" + serializedEvent.Elapsed);\n\t}\n\n\tpublic bool TestMethod(float f) {\n\t\treturn f > 0.5f;\n\t}\n\n\tpublic bool TestMethod(string a) {\n\t\treturn string.IsNullOrEmpty(a);\n\t}\n\n\tpublic bool TestMethod2(float f, string a) {\n\t\treturn f > 0.5f && string.IsNullOrEmpty(a);\n\t}\n\n\tpublic void TestMethod2(string a) {\n\t\ts = a;\n\t}\n}\n\n[Serializable]\npublic class Condition : SerializableCallback<float, bool> { }"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime/Test.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 933cfc79696bbd74ca51c70a8d61ae8d\ntimeCreated: 1514107717\nlicenseType: Free\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/Runtime.meta",
    "content": "fileFormatVersion: 2\nguid: a6c274949c3a3494db6ab4e33e996353\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback/package.json",
    "content": "{\n  \"name\": \"com.github.siccity.serializablecallback\",\n  \"description\": \"UnityEvent and System.Func had a child. Lets you drag-and-drop methods with or without return values / parameters in the Unity inspector. It uses expression trees and reflection to cache a delegate on first execution. Usage is identical to UnityEvent\",\n  \"version\": \"1.0.0\",\n  \"unity\": \"2018.1\",\n  \"displayName\": \"SerializableCallback\",\n  \"author\": {\n    \"name\": \"Thor Brigsted\",\n    \"url\": \"http://thorbrigsted.com/\"\n  }\n}\n"
  },
  {
    "path": "Dependencies/SerializableCallback/package.json.meta",
    "content": "fileFormatVersion: 2\nguid: 70b54a564f424a742af19bd2af6873c5\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableCallback.meta",
    "content": "fileFormatVersion: 2\nguid: e9d9d85b74d78594b85a4a679b74607f\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableDictionary/Editor/SerializableDictionary.Editor.asmdef",
    "content": "{\n    \"name\": \"SerializableDictionary.Editor\",\n    \"rootNamespace\": \"\",\n    \"references\": [\n        \"GUID:479678a6fc2d434439a70c037334ff05\"\n    ],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": false,\n    \"precompiledReferences\": [],\n    \"autoReferenced\": true,\n    \"defineConstraints\": [],\n    \"versionDefines\": [],\n    \"noEngineReferences\": false\n}"
  },
  {
    "path": "Dependencies/SerializableDictionary/Editor/SerializableDictionary.Editor.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 5debd524d9fe37b44aa7aede833a8eb7\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableDictionary/Editor/SerializableDictionaryPropertyDrawer.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEditor;\nusing System.Reflection;\nusing System;\n\npublic class SerializableDictionaryPropertyDrawer : PropertyDrawer\n{\n\tconst string KeysFieldName = \"m_keys\";\n\tconst string ValuesFieldName = \"m_values\";\n\tprotected const float IndentWidth = 15f;\n\n\tstatic GUIContent s_iconPlus = IconContent (\"Toolbar Plus\", \"Add entry\");\n\tstatic GUIContent s_iconMinus = IconContent (\"Toolbar Minus\", \"Remove entry\");\n\tstatic GUIContent s_warningIconConflict = IconContent (\"console.warnicon.sml\", \"Conflicting key, this entry will be lost\");\n\tstatic GUIContent s_warningIconOther = IconContent (\"console.infoicon.sml\", \"Conflicting key\");\n\tstatic GUIContent s_warningIconNull = IconContent (\"console.warnicon.sml\", \"Null key, this entry will be lost\");\n\tstatic GUIStyle s_buttonStyle = GUIStyle.none;\n\tstatic GUIContent s_tempContent = new GUIContent();\n\n\n\tclass ConflictState\n\t{\n\t\tpublic object conflictKey = null;\n\t\tpublic object conflictValue = null;\n\t\tpublic int conflictIndex = -1 ;\n\t\tpublic int conflictOtherIndex = -1 ;\n\t\tpublic bool conflictKeyPropertyExpanded = false;\n\t\tpublic bool conflictValuePropertyExpanded = false;\n\t\tpublic float conflictLineHeight = 0f;\n\t}\n\n\tstruct PropertyIdentity\n\t{\n\t\tpublic PropertyIdentity(SerializedProperty property)\n\t\t{\n\t\t\tthis.instance = property.serializedObject.targetObject;\n\t\t\tthis.propertyPath = property.propertyPath;\n\t\t}\n\n\t\tpublic UnityEngine.Object instance;\n\t\tpublic string propertyPath;\n\t}\n\n\tstatic Dictionary<PropertyIdentity, ConflictState> s_conflictStateDict = new Dictionary<PropertyIdentity, ConflictState>();\n\n\tenum Action\n\t{\n\t\tNone,\n\t\tAdd,\n\t\tRemove\n\t}\n\n\tpublic override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n\t{\n\t\tlabel = EditorGUI.BeginProperty(position, label, property);\n\n\t\tAction buttonAction = Action.None;\n\t\tint buttonActionIndex = 0;\n\n\t\tvar keyArrayProperty = property.FindPropertyRelative(KeysFieldName);\n\t\tvar valueArrayProperty = property.FindPropertyRelative(ValuesFieldName);\n\n\t\tConflictState conflictState = GetConflictState(property);\n\n\t\tif(conflictState.conflictIndex != -1)\n\t\t{\n\t\t\tkeyArrayProperty.InsertArrayElementAtIndex(conflictState.conflictIndex);\n\t\t\tvar keyProperty = keyArrayProperty.GetArrayElementAtIndex(conflictState.conflictIndex);\n\t\t\tSetPropertyValue(keyProperty, conflictState.conflictKey);\n\t\t\tkeyProperty.isExpanded = conflictState.conflictKeyPropertyExpanded;\n\n\t\t\tvalueArrayProperty.InsertArrayElementAtIndex(conflictState.conflictIndex);\n\t\t\tvar valueProperty = valueArrayProperty.GetArrayElementAtIndex(conflictState.conflictIndex);\n\t\t\tSetPropertyValue(valueProperty, conflictState.conflictValue);\n\t\t\tvalueProperty.isExpanded = conflictState.conflictValuePropertyExpanded;\n\t\t}\n\n\t\tvar buttonWidth = s_buttonStyle.CalcSize(s_iconPlus).x;\n\n\t\tvar labelPosition = position;\n\t\tlabelPosition.height = EditorGUIUtility.singleLineHeight;\n\t\tif (property.isExpanded)\n\t\t\tlabelPosition.xMax -= s_buttonStyle.CalcSize(s_iconPlus).x;\n\n\t\tEditorGUI.PropertyField(labelPosition, property, label, false);\n\t\t// property.isExpanded = EditorGUI.Foldout(labelPosition, property.isExpanded, label);\n\t\tif (property.isExpanded)\n\t\t{\n\t\t\tvar buttonPosition = position;\n\t\t\tbuttonPosition.xMin = buttonPosition.xMax - buttonWidth;\n\t\t\tbuttonPosition.height = EditorGUIUtility.singleLineHeight;\n\t\t\tEditorGUI.BeginDisabledGroup(conflictState.conflictIndex != -1);\n\t\t\tif(GUI.Button(buttonPosition, s_iconPlus, s_buttonStyle))\n\t\t\t{\n\t\t\t\tbuttonAction = Action.Add;\n\t\t\t\tbuttonActionIndex = keyArrayProperty.arraySize;\n\t\t\t}\n\t\t\tEditorGUI.EndDisabledGroup();\n\n\t\t\tEditorGUI.indentLevel++;\n\t\t\tvar linePosition = position;\n\t\t\tlinePosition.y += EditorGUIUtility.singleLineHeight;\n\t\t\tlinePosition.xMax -= buttonWidth;\n\n\t\t\tforeach(var entry in EnumerateEntries(keyArrayProperty, valueArrayProperty))\n\t\t\t{\n\t\t\t\tvar keyProperty = entry.keyProperty;\n\t\t\t\tvar valueProperty = entry.valueProperty;\n\t\t\t\tint i = entry.index;\n\n\t\t\t\tfloat lineHeight = DrawKeyValueLine(keyProperty, valueProperty, linePosition, i);\n\n\t\t\t\tbuttonPosition = linePosition;\n\t\t\t\tbuttonPosition.x = linePosition.xMax;\n\t\t\t\tbuttonPosition.height = EditorGUIUtility.singleLineHeight;\n\t\t\t\tif(GUI.Button(buttonPosition, s_iconMinus, s_buttonStyle))\n\t\t\t\t{\n\t\t\t\t\tbuttonAction = Action.Remove;\n\t\t\t\t\tbuttonActionIndex = i;\n\t\t\t\t}\n\n\t\t\t\tif(i == conflictState.conflictIndex && conflictState.conflictOtherIndex == -1)\n\t\t\t\t{\n\t\t\t\t\tvar iconPosition = linePosition;\n\t\t\t\t\ticonPosition.size =  s_buttonStyle.CalcSize(s_warningIconNull);\n\t\t\t\t\tGUI.Label(iconPosition, s_warningIconNull);\n\t\t\t\t}\n\t\t\t\telse if(i == conflictState.conflictIndex)\n\t\t\t\t{\n\t\t\t\t\tvar iconPosition = linePosition;\n\t\t\t\t\ticonPosition.size =  s_buttonStyle.CalcSize(s_warningIconConflict);\n\t\t\t\t\tGUI.Label(iconPosition, s_warningIconConflict);\n\t\t\t\t}\n\t\t\t\telse if(i == conflictState.conflictOtherIndex)\n\t\t\t\t{\n\t\t\t\t\tvar iconPosition = linePosition;\n\t\t\t\t\ticonPosition.size =  s_buttonStyle.CalcSize(s_warningIconOther);\n\t\t\t\t\tGUI.Label(iconPosition, s_warningIconOther);\n\t\t\t\t}\n\n\n\t\t\t\tlinePosition.y += lineHeight;\n\t\t\t}\n\n\t\t\tEditorGUI.indentLevel--;\n\t\t}\n\n\t\tif(buttonAction == Action.Add)\n\t\t{\n\t\t\tkeyArrayProperty.InsertArrayElementAtIndex(buttonActionIndex);\n\t\t\tvalueArrayProperty.InsertArrayElementAtIndex(buttonActionIndex);\n\t\t}\n\t\telse if(buttonAction == Action.Remove)\n\t\t{\n\t\t\tDeleteArrayElementAtIndex(keyArrayProperty, buttonActionIndex);\n\t\t\tDeleteArrayElementAtIndex(valueArrayProperty, buttonActionIndex);\n\t\t}\n\n\t\tconflictState.conflictKey = null;\n\t\tconflictState.conflictValue = null;\n\t\tconflictState.conflictIndex = -1;\n\t\tconflictState.conflictOtherIndex = -1;\n\t\tconflictState.conflictLineHeight = 0f;\n\t\tconflictState.conflictKeyPropertyExpanded = false;\n\t\tconflictState.conflictValuePropertyExpanded = false;\n\n\t\tforeach(var entry1 in EnumerateEntries(keyArrayProperty, valueArrayProperty))\n\t\t{\n\t\t\tvar keyProperty1 = entry1.keyProperty;\n\t\t\tint i = entry1.index;\n\t\t\tobject keyProperty1Value = GetPropertyValue(keyProperty1);\n\n\t\t\tif(keyProperty1Value == null)\n\t\t\t{\n\t\t\t\tvar valueProperty1 = entry1.valueProperty;\n\t\t\t\tSaveProperty(keyProperty1, valueProperty1, i, -1, conflictState);\n\t\t\t\tDeleteArrayElementAtIndex(valueArrayProperty, i);\n\t\t\t\tDeleteArrayElementAtIndex(keyArrayProperty, i);\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\n\t\t\tforeach(var entry2 in EnumerateEntries(keyArrayProperty, valueArrayProperty, i + 1))\n\t\t\t{\n\t\t\t\tvar keyProperty2 = entry2.keyProperty;\n\t\t\t\tint j = entry2.index;\n\t\t\t\tobject keyProperty2Value = GetPropertyValue(keyProperty2);\n\n\t\t\t\tif(ComparePropertyValues(keyProperty1Value, keyProperty2Value))\n\t\t\t\t{\n\t\t\t\t\tvar valueProperty2 = entry2.valueProperty;\n\t\t\t\t\tSaveProperty(keyProperty2, valueProperty2, j, i, conflictState);\n\t\t\t\t\tDeleteArrayElementAtIndex(keyArrayProperty, j);\n\t\t\t\t\tDeleteArrayElementAtIndex(valueArrayProperty, j);\n\n\t\t\t\t\tgoto breakLoops;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreakLoops:\n\n\t\tEditorGUI.EndProperty();\n\t}\n\n\tstatic float DrawKeyValueLine(SerializedProperty keyProperty, SerializedProperty valueProperty, Rect linePosition, int index)\n\t{\n\t\tbool keyCanBeExpanded = CanPropertyBeExpanded(keyProperty);\n\t\tbool valueCanBeExpanded = CanPropertyBeExpanded(valueProperty);\n\n\t\tif(!keyCanBeExpanded && valueCanBeExpanded)\n\t\t{\n\t\t\treturn DrawKeyValueLineExpand(keyProperty, valueProperty, linePosition);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tvar keyLabel = keyCanBeExpanded ? (\"Key \" + index.ToString()) : \"\";\n\t\t\tvar valueLabel = valueCanBeExpanded ? (\"Value \" + index.ToString()) : \"\";\n\t\t\treturn DrawKeyValueLineSimple(keyProperty, valueProperty, keyLabel, valueLabel, linePosition);\n\t\t}\n\t}\n\n\tstatic float DrawKeyValueLineSimple(SerializedProperty keyProperty, SerializedProperty valueProperty, string keyLabel, string valueLabel, Rect linePosition)\n\t{\n\t\tfloat labelWidth = EditorGUIUtility.labelWidth;\n\t\tfloat labelWidthRelative = labelWidth / linePosition.width;\n\n\t\tfloat keyPropertyHeight = EditorGUI.GetPropertyHeight(keyProperty);\n\t\tvar keyPosition = linePosition;\n\t\tkeyPosition.height = keyPropertyHeight;\n\t\tkeyPosition.width = labelWidth - IndentWidth;\n\t\tEditorGUIUtility.labelWidth = keyPosition.width * labelWidthRelative;\n\t\tEditorGUI.PropertyField(keyPosition, keyProperty, TempContent(keyLabel), true);\n\n\t\tfloat valuePropertyHeight = EditorGUI.GetPropertyHeight(valueProperty);\n\t\tvar valuePosition = linePosition;\n\t\tvaluePosition.height = valuePropertyHeight;\n\t\tvaluePosition.xMin += labelWidth;\n\t\tEditorGUIUtility.labelWidth = valuePosition.width * labelWidthRelative;\n\t\tEditorGUI.indentLevel--;\n\t\tEditorGUI.PropertyField(valuePosition, valueProperty, TempContent(valueLabel), true);\n\t\tEditorGUI.indentLevel++;\n\n\t\tEditorGUIUtility.labelWidth = labelWidth;\n\n\t\treturn Mathf.Max(keyPropertyHeight, valuePropertyHeight);\n\t}\n\n\tstatic float DrawKeyValueLineExpand(SerializedProperty keyProperty, SerializedProperty valueProperty, Rect linePosition)\n\t{\n\t\tfloat labelWidth = EditorGUIUtility.labelWidth;\n\n\t\tfloat keyPropertyHeight = EditorGUI.GetPropertyHeight(keyProperty);\n\t\tvar keyPosition = linePosition;\n\t\tkeyPosition.height = keyPropertyHeight;\n\t\tkeyPosition.width = labelWidth - IndentWidth;\n\t\tEditorGUI.PropertyField(keyPosition, keyProperty, GUIContent.none, true);\n\n\t\tfloat valuePropertyHeight = EditorGUI.GetPropertyHeight(valueProperty);\n\t\tvar valuePosition = linePosition;\n\t\tvaluePosition.height = valuePropertyHeight;\n\t\tEditorGUI.PropertyField(valuePosition, valueProperty, GUIContent.none, true);\n\n\t\tEditorGUIUtility.labelWidth = labelWidth;\n\n\t\treturn Mathf.Max(keyPropertyHeight, valuePropertyHeight);\n\t}\n\n\tstatic bool CanPropertyBeExpanded(SerializedProperty property)\n\t{\n\t\tswitch(property.propertyType)\n\t\t{\n\t\tcase SerializedPropertyType.Generic:\n\t\tcase SerializedPropertyType.Vector4:\n\t\tcase SerializedPropertyType.Quaternion:\n\t\t\treturn true;\n\t\tdefault:\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tstatic void SaveProperty(SerializedProperty keyProperty, SerializedProperty valueProperty, int index, int otherIndex, ConflictState conflictState)\n\t{\n\t\tconflictState.conflictKey = GetPropertyValue(keyProperty);\n\t\tconflictState.conflictValue = GetPropertyValue(valueProperty);\n\t\tfloat keyPropertyHeight = EditorGUI.GetPropertyHeight(keyProperty);\n\t\tfloat valuePropertyHeight = EditorGUI.GetPropertyHeight(valueProperty);\n\t\tfloat lineHeight = Mathf.Max(keyPropertyHeight, valuePropertyHeight);\n\t\tconflictState.conflictLineHeight = lineHeight;\n\t\tconflictState.conflictIndex = index;\n\t\tconflictState.conflictOtherIndex = otherIndex;\n\t\tconflictState.conflictKeyPropertyExpanded = keyProperty.isExpanded;\n\t\tconflictState.conflictValuePropertyExpanded = valueProperty.isExpanded;\n\t}\n\n\tpublic override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n\t{\n\t\tfloat propertyHeight = EditorGUIUtility.singleLineHeight;\n\n\t\tif (property.isExpanded)\n\t\t{\n\t\t\tvar keysProperty = property.FindPropertyRelative(KeysFieldName);\n\t\t\tvar valuesProperty = property.FindPropertyRelative(ValuesFieldName);\n\n\t\t\tforeach(var entry in EnumerateEntries(keysProperty, valuesProperty))\n\t\t\t{\n\t\t\t\tvar keyProperty = entry.keyProperty;\n\t\t\t\tvar valueProperty = entry.valueProperty;\n\t\t\t\tfloat keyPropertyHeight = EditorGUI.GetPropertyHeight(keyProperty);\n\t\t\t\tfloat valuePropertyHeight = EditorGUI.GetPropertyHeight(valueProperty);\n\t\t\t\tfloat lineHeight = Mathf.Max(keyPropertyHeight, valuePropertyHeight);\n\t\t\t\tpropertyHeight += lineHeight;\n\t\t\t}\n\n\t\t\tConflictState conflictState = GetConflictState(property);\n\n\t\t\tif(conflictState.conflictIndex != -1)\n\t\t\t{\n\t\t\t\tpropertyHeight += conflictState.conflictLineHeight;\n\t\t\t}\n\t\t}\n\n\t\treturn propertyHeight;\n\t}\n\n\tstatic ConflictState GetConflictState(SerializedProperty property)\n\t{\n\t\tConflictState conflictState;\n\t\tPropertyIdentity propId = new PropertyIdentity(property);\n\t\tif(!s_conflictStateDict.TryGetValue(propId, out conflictState))\n\t\t{\n\t\t\tconflictState = new ConflictState();\n\t\t\ts_conflictStateDict.Add(propId, conflictState);\n\t\t}\n\t\treturn conflictState;\n\t}\n\n\tstatic Dictionary<SerializedPropertyType, PropertyInfo> s_serializedPropertyValueAccessorsDict;\n\n\tstatic SerializableDictionaryPropertyDrawer()\n\t{\n\t\tDictionary<SerializedPropertyType, string> serializedPropertyValueAccessorsNameDict = new Dictionary<SerializedPropertyType, string>() {\n\t\t\t{ SerializedPropertyType.Integer, \"intValue\" },\n\t\t\t{ SerializedPropertyType.Boolean, \"boolValue\" },\n\t\t\t{ SerializedPropertyType.Float, \"floatValue\" },\n\t\t\t{ SerializedPropertyType.String, \"stringValue\" },\n\t\t\t{ SerializedPropertyType.Color, \"colorValue\" },\n\t\t\t{ SerializedPropertyType.ObjectReference, \"objectReferenceValue\" },\n\t\t\t{ SerializedPropertyType.LayerMask, \"intValue\" },\n\t\t\t{ SerializedPropertyType.Enum, \"intValue\" },\n\t\t\t{ SerializedPropertyType.Vector2, \"vector2Value\" },\n\t\t\t{ SerializedPropertyType.Vector3, \"vector3Value\" },\n\t\t\t{ SerializedPropertyType.Vector4, \"vector4Value\" },\n\t\t\t{ SerializedPropertyType.Rect, \"rectValue\" },\n\t\t\t{ SerializedPropertyType.ArraySize, \"intValue\" },\n\t\t\t{ SerializedPropertyType.Character, \"intValue\" },\n\t\t\t{ SerializedPropertyType.AnimationCurve, \"animationCurveValue\" },\n\t\t\t{ SerializedPropertyType.Bounds, \"boundsValue\" },\n\t\t\t{ SerializedPropertyType.Quaternion, \"quaternionValue\" },\n\t\t};\n\t\tType serializedPropertyType = typeof(SerializedProperty);\n\n\t\ts_serializedPropertyValueAccessorsDict\t= new Dictionary<SerializedPropertyType, PropertyInfo>();\n\t\tBindingFlags flags = BindingFlags.Instance | BindingFlags.Public;\n\n\t\tforeach(var kvp in serializedPropertyValueAccessorsNameDict)\n\t\t{\n\t\t\tPropertyInfo propertyInfo = serializedPropertyType.GetProperty(kvp.Value, flags);\n\t\t\ts_serializedPropertyValueAccessorsDict.Add(kvp.Key, propertyInfo);\n\t\t}\n\t}\n\n\tstatic GUIContent IconContent(string name, string tooltip)\n\t{\n\t\tvar builtinIcon = EditorGUIUtility.IconContent (name);\n\t\treturn new GUIContent(builtinIcon.image, tooltip);\n\t}\n\n\tstatic GUIContent TempContent(string text)\n\t{\n\t\ts_tempContent.text = text;\n\t\treturn s_tempContent;\n\t}\n\n\tstatic void DeleteArrayElementAtIndex(SerializedProperty arrayProperty, int index)\n\t{\n\t\tvar property = arrayProperty.GetArrayElementAtIndex(index);\n\t\t// if(arrayProperty.arrayElementType.StartsWith(\"PPtr<$\"))\n\t\tif(property.propertyType == SerializedPropertyType.ObjectReference)\n\t\t{\n\t\t\tproperty.objectReferenceValue = null;\n\t\t}\n\n\t\tarrayProperty.DeleteArrayElementAtIndex(index);\n\t}\n\n\tpublic static object GetPropertyValue(SerializedProperty p)\n\t{\n\t\tPropertyInfo propertyInfo;\n\t\tif(s_serializedPropertyValueAccessorsDict.TryGetValue(p.propertyType, out propertyInfo))\n\t\t{\n\t\t\treturn propertyInfo.GetValue(p, null);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(p.isArray)\n\t\t\t\treturn GetPropertyValueArray(p);\n\t\t\telse\n\t\t\t\treturn GetPropertyValueGeneric(p);\n\t\t}\n\t}\n\n\tstatic void SetPropertyValue(SerializedProperty p, object v)\n\t{\n\t\tPropertyInfo propertyInfo;\n\t\tif(s_serializedPropertyValueAccessorsDict.TryGetValue(p.propertyType, out propertyInfo))\n\t\t{\n\t\t\tpropertyInfo.SetValue(p, v, null);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif(p.isArray)\n\t\t\t\tSetPropertyValueArray(p, v);\n\t\t\telse\n\t\t\t\tSetPropertyValueGeneric(p, v);\n\t\t}\n\t}\n\n\tstatic object GetPropertyValueArray(SerializedProperty property)\n\t{\n\t\tobject[] array = new object[property.arraySize];\n\t\tfor(int i = 0; i < property.arraySize; i++)\n\t\t{\n\t\t\tSerializedProperty item = property.GetArrayElementAtIndex(i);\n\t\t\tarray[i] = GetPropertyValue(item);\n\t\t}\n\t\treturn array;\n\t}\n\n\tstatic object GetPropertyValueGeneric(SerializedProperty property)\n\t{\n\t\tDictionary<string, object> dict = new Dictionary<string, object>();\n\t\tvar iterator = property.Copy();\n\t\tif(iterator.Next(true))\n\t\t{\n\t\t\tvar end = property.GetEndProperty();\n\t\t\tdo\n\t\t\t{\n\t\t\t\tstring name = iterator.name;\n\t\t\t\tobject value = GetPropertyValue(iterator);\n\t\t\t\tdict.Add(name, value);\n\t\t\t} while(iterator.Next(false) && iterator.propertyPath != end.propertyPath);\n\t\t}\n\t\treturn dict;\n\t}\n\n\tstatic void SetPropertyValueArray(SerializedProperty property, object v)\n\t{\n\t\tobject[] array = (object[]) v;\n\t\tproperty.arraySize = array.Length;\n\t\tfor(int i = 0; i < property.arraySize; i++)\n\t\t{\n\t\t\tSerializedProperty item = property.GetArrayElementAtIndex(i);\n\t\t\tSetPropertyValue(item, array[i]);\n\t\t}\n\t}\n\n\tstatic void SetPropertyValueGeneric(SerializedProperty property, object v)\n\t{\n\t\tDictionary<string, object> dict = (Dictionary<string, object>) v;\n\t\tvar iterator = property.Copy();\n\t\tif(iterator.Next(true))\n\t\t{\n\t\t\tvar end = property.GetEndProperty();\n\t\t\tdo\n\t\t\t{\n\t\t\t\tstring name = iterator.name;\n\t\t\t\tSetPropertyValue(iterator, dict[name]);\n\t\t\t} while(iterator.Next(false) && iterator.propertyPath != end.propertyPath);\n\t\t}\n\t}\n\n\tstatic bool ComparePropertyValues(object value1, object value2)\n\t{\n\t\tif(value1 is Dictionary<string, object> && value2 is Dictionary<string, object>)\n\t\t{\n\t\t\tvar dict1 = (Dictionary<string, object>)value1;\n\t\t\tvar dict2 = (Dictionary<string, object>)value2;\n\t\t\treturn CompareDictionaries(dict1, dict2);\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn object.Equals(value1, value2);\n\t\t}\n\t}\n\n\tstatic bool CompareDictionaries(Dictionary<string, object> dict1, Dictionary<string, object> dict2)\n\t{\n\t\tif(dict1.Count != dict2.Count)\n\t\t\treturn false;\n\n\t\tforeach(var kvp1 in dict1)\n\t\t{\n\t\t\tvar key1 = kvp1.Key;\n\t\t\tobject value1 = kvp1.Value;\n\n\t\t\tobject value2;\n\t\t\tif(!dict2.TryGetValue(key1, out value2))\n\t\t\t\treturn false;\n\n\t\t\tif(!ComparePropertyValues(value1, value2))\n\t\t\t\treturn false;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\n\tstruct EnumerationEntry\n\t{\n\t\tpublic SerializedProperty keyProperty;\n\t\tpublic SerializedProperty valueProperty;\n\t\tpublic int index;\n\n\t\tpublic EnumerationEntry(SerializedProperty keyProperty, SerializedProperty valueProperty, int index)\n\t\t{\n\t\t\tthis.keyProperty = keyProperty;\n\t\t\tthis.valueProperty = valueProperty;\n\t\t\tthis.index = index;\n\t\t}\n\t}\n\n\tstatic IEnumerable<EnumerationEntry> EnumerateEntries(SerializedProperty keyArrayProperty, SerializedProperty valueArrayProperty, int startIndex = 0)\n\t{\n\t\tif(keyArrayProperty.arraySize > startIndex)\n\t\t{\n\t\t\tint index = startIndex;\n\t\t\tvar keyProperty = keyArrayProperty.GetArrayElementAtIndex(startIndex);\n\t\t\tvar valueProperty = valueArrayProperty.GetArrayElementAtIndex(startIndex);\n\t\t\tvar endProperty = keyArrayProperty.GetEndProperty();\n\n\t\t\tdo\n\t\t\t{\n\t\t\t\tyield return new EnumerationEntry(keyProperty, valueProperty, index);\n\t\t\t\tindex++;\n\t\t\t} while(keyProperty.Next(false) && valueProperty.Next(false) && !SerializedProperty.EqualContents(keyProperty, endProperty));\n\t\t}\n\t}\n}\n\npublic class SerializableDictionaryStoragePropertyDrawer : PropertyDrawer\n{\n\tpublic override void OnGUI(Rect position, SerializedProperty property, GUIContent label)\n\t{\n\t\tproperty.Next(true);\n\t\tEditorGUI.PropertyField(position, property, label, true);\n\t}\n\n\tpublic override float GetPropertyHeight(SerializedProperty property, GUIContent label)\n\t{\n\t\tproperty.Next(true);\n\t\treturn EditorGUI.GetPropertyHeight(property);\n\t}\n}\n"
  },
  {
    "path": "Dependencies/SerializableDictionary/Editor/SerializableDictionaryPropertyDrawer.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 91da51d02ab9ebc459d80d5965d40d19\ntimeCreated: 1492869349\nlicenseType: Store\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableDictionary/Editor.meta",
    "content": "fileFormatVersion: 2\nguid: 20029ee1c099f4b47afbac48208879b9\nfolderAsset: yes\nDefaultImporter:\n  userData: \n"
  },
  {
    "path": "Dependencies/SerializableDictionary/LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2017 Mathieu Le Ber\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Dependencies/SerializableDictionary/LICENSE.md.meta",
    "content": "fileFormatVersion: 2\nguid: 2a97e78bf2f61e647b9ea0a65d08182f\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableDictionary/Runtime/SerializableDictionary.Runtime.asmdef",
    "content": "﻿{\n\t\"name\": \"SerializableDictionary.Runtime\"\n}\n"
  },
  {
    "path": "Dependencies/SerializableDictionary/Runtime/SerializableDictionary.Runtime.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 479678a6fc2d434439a70c037334ff05\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableDictionary/Runtime/SerializableDictionary.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Runtime.Serialization;\nusing UnityEngine;\n\npublic abstract class SerializableDictionaryBase<TKey, TValue, TValueStorage> : Dictionary<TKey, TValue>, ISerializationCallbackReceiver\n{\n\t[SerializeField]\n\tTKey[] m_keys;\n\t[SerializeField]\n\tTValueStorage[] m_values;\n\n\tpublic SerializableDictionaryBase()\n\t{\n\t}\n\n\tpublic SerializableDictionaryBase(IDictionary<TKey, TValue> dict) : base(dict.Count)\n\t{\n\t\tforeach (var kvp in dict)\n\t\t{\n\t\t\tthis[kvp.Key] = kvp.Value;\n\t\t}\n\t}\n\n\tprotected SerializableDictionaryBase(SerializationInfo info, StreamingContext context) : base(info,context){}\n\n\tprotected abstract void SetValue(TValueStorage[] storage, int i, TValue value);\n\tprotected abstract TValue GetValue(TValueStorage[] storage, int i);\n\n\tpublic void CopyFrom(IDictionary<TKey, TValue> dict)\n\t{\n\t\tthis.Clear();\n\t\tforeach (var kvp in dict)\n\t\t{\n\t\t\tthis[kvp.Key] = kvp.Value;\n\t\t}\n\t}\n\n\tpublic void OnAfterDeserialize()\n\t{\n\t\tif(m_keys != null && m_values != null && m_keys.Length == m_values.Length)\n\t\t{\n\t\t\tthis.Clear();\n\t\t\tint n = m_keys.Length;\n\t\t\tfor(int i = 0; i < n; ++i)\n\t\t\t{\n\t\t\t\tthis[m_keys[i]] = GetValue(m_values, i);\n\t\t\t}\n\n\t\t\tm_keys = null;\n\t\t\tm_values = null;\n\t\t}\n\n\t}\n\n\tpublic void OnBeforeSerialize()\n\t{\n\t\tint n = this.Count;\n\t\tm_keys = new TKey[n];\n\t\tm_values = new TValueStorage[n];\n\n\t\tint i = 0;\n\t\tforeach(var kvp in this)\n\t\t{\n\t\t\tm_keys[i] = kvp.Key;\n\t\t\tSetValue(m_values, i, kvp.Value);\n\t\t\t++i;\n\t\t}\n\t}\n}\n\npublic class SerializableDictionary<TKey, TValue> : SerializableDictionaryBase<TKey, TValue, TValue>\n{\n\tpublic SerializableDictionary()\n\t{\n\t}\n\n\tpublic SerializableDictionary(IDictionary<TKey, TValue> dict) : base(dict)\n\t{\n\t}\n\n\tprotected SerializableDictionary(SerializationInfo info, StreamingContext context) : base(info,context){}\n\n\tprotected override TValue GetValue(TValue[] storage, int i)\n\t{\n\t\treturn storage[i];\n\t}\n\n\tprotected override void SetValue(TValue[] storage, int i, TValue value)\n\t{\n\t\tstorage[i] = value;\n\t}\n}\n\npublic static class SerializableDictionary\n{\n\tpublic class Storage<T>\n\t{\n\t\tpublic T data;\n\t}\n}\n\npublic class SerializableDictionary<TKey, TValue, TValueStorage> : SerializableDictionaryBase<TKey, TValue, TValueStorage> where TValueStorage : SerializableDictionary.Storage<TValue>, new()\n{\n\tpublic SerializableDictionary()\n\t{\n\t}\n\n\tpublic SerializableDictionary(IDictionary<TKey, TValue> dict) : base(dict)\n\t{\n\t}\n\n\tprotected SerializableDictionary(SerializationInfo info, StreamingContext context) : base(info,context){}\n\n\tprotected override TValue GetValue(TValueStorage[] storage, int i)\n\t{\n\t\treturn storage[i].data;\n\t}\n\n\tprotected override void SetValue(TValueStorage[] storage, int i, TValue value)\n\t{\n\t\tstorage[i] = new TValueStorage();\n\t\tstorage[i].data = value;\n\t}\n}\n"
  },
  {
    "path": "Dependencies/SerializableDictionary/Runtime/SerializableDictionary.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e7be1c9624387604fba4005ccf7dbd5a\ntimeCreated: 1492868176\nlicenseType: Store\nMonoImporter:\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableDictionary/Runtime.meta",
    "content": "fileFormatVersion: 2\nguid: 530de5b115dd7534da8f7a363e46ff21\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies/SerializableDictionary.meta",
    "content": "fileFormatVersion: 2\nguid: fe19274f8c2b0a84792bd6eb2e84f3bd\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Dependencies.meta",
    "content": "fileFormatVersion: 2\nguid: 7347c27e9815d5940be3e3aaab93719d\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/AssetCallbacks/CreateDlogGraph.cs",
    "content": "using UnityEditor;\nusing UnityEditor.ProjectWindowCallback;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    internal class CreateDlogGraph : EndNameEditAction {\n        [MenuItem(\"Assets/Create/Dialogue Graph/Empty Dialogue Graph\", false, 1)]\n        public static void CreateDialogueGraph()\n        {\n            ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, CreateInstance<CreateDlogGraph>(),\n                $\"New Dialogue Graph.{DlogGraphImporter.Extension}\", Resources.Load<Texture2D>(ResourcesUtility.IconBig), null);\n        }\n        public override void Action(int instanceId, string pathName, string resourceFile) {\n            var dlogGraph = new DlogGraphData();\n            var dlogObject = CreateInstance<DlogGraphObject>();\n            dlogObject.Initialize(dlogGraph);\n            dlogObject.DlogGraph.AssetGuid = AssetDatabase.GetAssetPath(instanceId);\n            dlogObject.DlogGraph.DialogueGraphVersion = DialogueGraphUtility.LatestVersion;\n            dlogObject.AssetGuid = dlogObject.DlogGraph.AssetGuid;\n            DialogueGraphUtility.CreateFile(pathName, dlogObject, false);\n            AssetDatabase.ImportAsset(pathName);\n        }\n    }\n}"
  },
  {
    "path": "Editor/AssetCallbacks/CreateDlogGraph.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 59cfb2bf5b2642d7b229cd3deef9cb50\ntimeCreated: 1601287977"
  },
  {
    "path": "Editor/AssetCallbacks.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 2fa84c3ec7fe454fa441b8dcd5ac2265\ntimeCreated: 1601287955"
  },
  {
    "path": "Editor/DialogueGraph.Editor.asmdef",
    "content": "{\n    \"name\": \"DialogueGraph.Editor\",\n    \"rootNamespace\": \"\",\n    \"references\": [\n        \"GUID:d6f4b79f0a67eb24690aba82c1078929\",\n        \"GUID:4988cf9794f41d64c884876ab6574b89\",\n        \"GUID:5debd524d9fe37b44aa7aede833a8eb7\",\n        \"GUID:479678a6fc2d434439a70c037334ff05\"\n    ],\n    \"includePlatforms\": [\n        \"Editor\"\n    ],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": true,\n    \"precompiledReferences\": [\n        \"Newtonsoft.Json.dll\"\n    ],\n    \"autoReferenced\": true,\n    \"defineConstraints\": [],\n    \"versionDefines\": [],\n    \"noEngineReferences\": false\n}"
  },
  {
    "path": "Editor/DialogueGraph.Editor.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: 88c608744485bf646beed5cc3dd91a6c\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Extensions/DlogExtensions.cs",
    "content": "using Newtonsoft.Json;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public static class DlogExtensions {\n        public static AbstractProperty Deserialize(this SerializedProperty property) {\n            var type = System.Type.GetType(property.Type);\n            return (AbstractProperty) JsonConvert.DeserializeObject(property.Data, type, new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.All});\n        }\n\n        public static void InjectCustomStyle(this DlogPort port) {\n            var cap = port.Q(\"cap\");\n            var width = cap.style.width;\n            width.value = new Length(8, LengthUnit.Pixel);\n            cap.style.width = width;\n            var height = cap.style.height;\n            height.value = new Length(12, LengthUnit.Pixel);\n            cap.style.height = height;\n\n            // Border color\n            var bLColor = cap.style.borderLeftColor;\n            bLColor.value = port.portColor;\n            cap.style.borderLeftColor = bLColor;\n            \n            var bTColor = cap.style.borderTopColor;\n            bTColor.value = port.portColor;\n            cap.style.borderTopColor = bTColor;\n            \n            var bRColor = cap.style.borderRightColor;\n            bRColor.value = port.portColor;\n            cap.style.borderRightColor = bRColor;\n            \n            var bBColor = cap.style.borderBottomColor;\n            bBColor.value = port.portColor;\n            cap.style.borderBottomColor = bBColor;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Extensions/DlogExtensions.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 6c473de560d3477fa93a162cabb53e0e\ntimeCreated: 1603619074"
  },
  {
    "path": "Editor/Extensions/GUILayoutHelper.cs",
    "content": "using System;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    public static class GUILayoutHelper {\n        public static void BeginCenterVertically() {\n            GUILayout.BeginHorizontal();\n            GUILayout.BeginVertical();\n            GUILayout.FlexibleSpace();\n        }\n\n        public static void EndCenterVertically() {\n            GUILayout.FlexibleSpace();\n            GUILayout.EndVertical();\n            GUILayout.EndHorizontal();\n        }\n\n        public static void CenterVertically(Action drawGUI) {\n            BeginCenterVertically();\n            drawGUI();\n            EndCenterVertically();\n        }\n    }\n}"
  },
  {
    "path": "Editor/Extensions/GUILayoutHelper.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: b82632cfd46f4b8ca42700903771073e\ntimeCreated: 1606319893"
  },
  {
    "path": "Editor/Extensions/GraphViewExtensions.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public static class GraphViewExtensions {\n        public static void InsertCopyPasteData(this DlogGraphView graphView, CopyPasteData copyPasteData) {\n            if (copyPasteData == null) return;\n            foreach (var property in copyPasteData.Properties) {\n                var copy = property.Copy();\n                graphView.DlogGraph.SanitizePropertyName(copy);\n                graphView.DlogGraph.SanitizePropertyReference(copy, property.OverrideReferenceName);\n                graphView.DlogGraph.AddProperty(copy);\n\n                var dependentNodes = copyPasteData.Nodes.Where(node => node.Type == typeof(PropertyNode).FullName);\n                foreach (var node in dependentNodes) {\n                    var root = JObject.Parse(node.NodeData);\n                    root[\"propertyGuid\"] = copy.GUID;\n                    node.NodeData = root.ToString(Formatting.None);\n                }\n            }\n            \n            var remappedNodes = new List<SerializedNode>();\n            var remappedEdges = new List<SerializedEdge>();\n            graphView.DlogGraph.Paste(copyPasteData, remappedNodes, remappedEdges);\n\n            // Compute the mean of the copied nodes.\n            var centroid = Vector2.zero;\n            var count = 1;\n            foreach (var node in remappedNodes) {\n                var position = node.DrawState.Position.position;\n                centroid += (position - centroid) / count;\n                ++count;\n            }\n\n            // Get the center of the current view\n            var viewCenter = graphView.contentViewContainer.WorldToLocal(graphView.layout.center);\n\n            foreach (var node in remappedNodes) {\n                var drawState = node.DrawState;\n                var positionRect = drawState.Position;\n                var position = positionRect.position;\n                position += viewCenter - centroid;\n                positionRect.position = position;\n                drawState.Position = positionRect;\n                node.DrawState = drawState;\n            }\n\n            graphView.ClearSelection();\n            graphView.DlogGraph.QueueSelection(remappedNodes, remappedEdges);\n        }\n    }\n}"
  },
  {
    "path": "Editor/Extensions/GraphViewExtensions.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 9170694da96b489daea9c57d451d8470\ntimeCreated: 1602766163"
  },
  {
    "path": "Editor/Extensions/VisualElementExtensions.cs",
    "content": "using UnityEngine;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public static class VisualElementExtensions {\n        public static void AddStyleSheet(this VisualElement element, string path) {\n            var stylesheet = Resources.Load<StyleSheet>(path);\n            if(stylesheet == null) Debug.LogWarning($\"StyleSheet at path \\\"{path}\\\" could not be found\");\n            else element.styleSheets.Add(stylesheet);\n        }\n    }\n}"
  },
  {
    "path": "Editor/Extensions/VisualElementExtensions.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 229e7e4f55474e20ad013144d24a39ae\ntimeCreated: 1601282440"
  },
  {
    "path": "Editor/Extensions.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 2a94fe7d0d1e46e7ac194f7ab65aafb1\ntimeCreated: 1601282428"
  },
  {
    "path": "Editor/Graph/Attributes/TitleAttribute.cs",
    "content": "using System;\n\nnamespace DialogueGraph {\n    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]\n    public class TitleAttribute : Attribute {\n        public readonly string[] Title;\n        public TitleAttribute(params string[] title) {\n            Title = title;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Attributes/TitleAttribute.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: c6b5cce28add4b3cb603e233a3926bd1\ntimeCreated: 1601474130"
  },
  {
    "path": "Editor/Graph/Attributes.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 2710773280374843a854a2c722541286\ntimeCreated: 1601474123"
  },
  {
    "path": "Editor/Graph/Data/CopyPasteData.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public class CopyPasteData : ISerializationCallbackReceiver {\n        [NonSerialized] private HashSet<SerializedNode> nodes = new HashSet<SerializedNode>();\n        [NonSerialized] private HashSet<SerializedEdge> edges = new HashSet<SerializedEdge>();\n        [NonSerialized] private HashSet<AbstractProperty> properties = new HashSet<AbstractProperty>();\n        // these are the properties that don't get copied but are required by property nodes that get copied\n        [NonSerialized] private HashSet<AbstractProperty> metaProperties = new HashSet<AbstractProperty>();\n\n        [SerializeField] private List<SerializedNode> serializedNodes = new List<SerializedNode>();\n        [SerializeField] private List<SerializedEdge> serializedEdges = new List<SerializedEdge>();\n        [SerializeField] private List<SerializedProperty> serializedProperties = new List<SerializedProperty>();\n        [SerializeField] private List<SerializedProperty> serializedMetaProperties = new List<SerializedProperty>();\n\n        public IEnumerable<SerializedNode> Nodes => nodes;\n        public IEnumerable<SerializedEdge> Edges => edges;\n        public IEnumerable<SerializedNode> SerializedNodes => serializedNodes;\n        public IEnumerable<SerializedEdge> SerializedEdges => serializedEdges;\n        public IEnumerable<SerializedProperty> SerializedProperties => serializedProperties;\n        public IEnumerable<SerializedProperty> SerializedMetaProperties => serializedMetaProperties;\n        public IEnumerable<AbstractProperty> Properties => properties;\n        public IEnumerable<AbstractProperty> MetaProperties => metaProperties;\n\n        private EditorView editorView;\n\n        public CopyPasteData(EditorView editorView, IEnumerable<SerializedNode> nodes, IEnumerable<SerializedEdge> edges, IEnumerable<AbstractProperty> properties, IEnumerable<AbstractProperty> metaProperties) {\n            this.editorView = editorView;\n            \n            foreach (var node in nodes) {\n                AddNode(node);\n                foreach (var edge in GetAllEdgesForNode(node)) {\n                    AddEdge(edge);\n                }\n            }\n\n            foreach (var edge in edges) {\n                AddEdge(edge);\n            }\n\n            foreach (var property in properties) {\n                AddProperty(property);\n            }\n\n            foreach (var metaProperty in metaProperties) {\n                AddMetaProperty(metaProperty);\n            }\n        }\n\n        private void AddNode(SerializedNode node) {\n            nodes.Add(node);\n        }\n\n        private void AddEdge(SerializedEdge edge) {\n            edges.Add(edge);\n        }\n        private void AddProperty(AbstractProperty property) {\n            properties.Add(property);\n        }\n        private void AddMetaProperty(AbstractProperty property) {\n            metaProperties.Add(property);\n        }\n\n        public void OnBeforeSerialize() {\n            serializedNodes = new List<SerializedNode>();\n            foreach (var node in nodes) {\n                serializedNodes.Add(node);\n            }\n            \n            serializedEdges = new List<SerializedEdge>();\n            foreach (var edge in edges) {\n                serializedEdges.Add(edge);\n            }\n            \n            serializedProperties = new List<SerializedProperty>();\n            foreach (var property in properties) {\n                serializedProperties.Add(new SerializedProperty(property));\n            }\n\n            serializedMetaProperties = new List<SerializedProperty>();\n            foreach (var property in metaProperties) {\n                serializedMetaProperties.Add(new SerializedProperty(property));\n            }\n        }\n\n        public void OnAfterDeserialize() {\n            nodes = new HashSet<SerializedNode>();\n            edges = new HashSet<SerializedEdge>();\n            properties = new HashSet<AbstractProperty>();\n            metaProperties = new HashSet<AbstractProperty>();\n            foreach (var node in serializedNodes) {\n                nodes.Add(node);\n            }\n            foreach (var edge in serializedEdges) {\n                edges.Add(edge);\n            }\n            foreach (var prop in serializedProperties) {\n                properties.Add(prop.Deserialize());\n            }\n            foreach (var prop in serializedMetaProperties) {\n                metaProperties.Add(prop.Deserialize());\n            }\n        }\n\n        private IEnumerable<SerializedEdge> GetAllEdgesForNode(SerializedNode node) {\n            var edges = new List<SerializedEdge>();\n            foreach (var portConnections in node.GuidPortDictionary.Values.Select(port => port.connections)) {\n                edges.AddRange(portConnections.Select(edge => edge.userData).OfType<SerializedEdge>());\n            }\n            return edges;\n        }\n\n        public static CopyPasteData FromJson(string json) {\n            try {\n                return JsonUtility.FromJson<CopyPasteData>(json);\n            } catch {\n                // ignored. just means json was not a CopyPasteData object\n                return null;\n            }\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/CopyPasteData.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 59de5bfe57a04708b153166215579951\ntimeCreated: 1602764627"
  },
  {
    "path": "Editor/Graph/Data/DlogGraphData.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public class DlogGraphData : ISerializationCallbackReceiver {\n        public DlogGraphObject Owner { get; set; }\n        [SerializeField] public string AssetGuid;\n        [SerializeField] public bool IsBlackboardVisible;\n        [SerializeField] public string DialogueGraphVersion;\n\n\n        [NonSerialized] private Dictionary<string, SerializedNode> nodeDictionary = new Dictionary<string, SerializedNode>();\n        [SerializeField] private List<SerializedNode> nodes = new List<SerializedNode>();\n        [NonSerialized] private List<SerializedNode> addedNodes = new List<SerializedNode>();\n        [NonSerialized] private List<SerializedNode> removedNodes = new List<SerializedNode>();\n        [NonSerialized] private List<SerializedNode> pastedNodes = new List<SerializedNode>();\n        public List<SerializedNode> Nodes => nodes;\n        public List<SerializedNode> AddedNodes => addedNodes;\n        public List<SerializedNode> RemovedNodes => removedNodes;\n        public List<SerializedNode> PastedNodes => pastedNodes;\n\n        [SerializeField] private List<SerializedEdge> edges = new List<SerializedEdge>();\n        [NonSerialized] private List<SerializedEdge> addedEdges = new List<SerializedEdge>();\n        [NonSerialized] private List<SerializedEdge> removedEdges = new List<SerializedEdge>();\n        public List<SerializedEdge> Edges => edges;\n        public List<SerializedEdge> AddedEdges => addedEdges;\n        public List<SerializedEdge> RemovedEdges => removedEdges;\n\n        [NonSerialized] private List<AbstractProperty> properties = new List<AbstractProperty>();\n        [NonSerialized] private List<AbstractProperty> addedProperties = new List<AbstractProperty>();\n        [NonSerialized] private List<AbstractProperty> removedProperties = new List<AbstractProperty>();\n        [NonSerialized] private List<AbstractProperty> movedProperties = new List<AbstractProperty>();\n        [SerializeField] private List<SerializedProperty> serializedProperties = new List<SerializedProperty>();\n        public List<AbstractProperty> Properties => properties;\n        public List<AbstractProperty> AddedProperties => addedProperties;\n        public List<AbstractProperty> RemovedProperties => removedProperties;\n        public List<AbstractProperty> MovedProperties => movedProperties;\n\n        [NonSerialized] private List<SerializedNode> nodeSelectionQueue = new List<SerializedNode>();\n        [NonSerialized] private List<SerializedEdge> edgeSelectionQueue = new List<SerializedEdge>();\n        public List<SerializedNode> NodeSelectionQueue => nodeSelectionQueue;\n        public List<SerializedEdge> EdgeSelectionQueue => edgeSelectionQueue;\n\n        public void OnBeforeSerialize() {\n            if (Owner != null)\n                IsBlackboardVisible = Owner.IsBlackboardVisible;\n\n            serializedProperties.Clear();\n            foreach (var property in properties) {\n                serializedProperties.Add(new SerializedProperty(property));\n            }\n        }\n\n        public void OnAfterDeserialize() {\n            nodes.ForEach(node => nodeDictionary.Add(node.GUID, node));\n            serializedProperties.ForEach(prop => AddProperty(prop.Deserialize()));\n        }\n\n        public void ClearChanges() {\n            addedNodes.Clear();\n            removedNodes.Clear();\n            addedEdges.Clear();\n            removedEdges.Clear();\n            addedProperties.Clear();\n            removedProperties.Clear();\n            movedProperties.Clear();\n            nodeSelectionQueue.Clear();\n            edgeSelectionQueue.Clear();\n        }\n\n        public void ReplaceWith(DlogGraphData otherGraphData) {\n            // Remove everything\n            var removedNodesGuid = new List<string>();\n            removedNodesGuid.AddRange(nodes.Select(node => node.GUID));\n            foreach (var node in removedNodesGuid) {\n                RemoveNode(nodeDictionary[node]);\n            }\n\n            var removedProperties = new List<AbstractProperty>(properties);\n            foreach (var prop in removedProperties)\n                RemoveProperty(prop);\n\n            // Add back everything\n            foreach (var node in otherGraphData.nodes) {\n                AddNode(node);\n            }\n\n            foreach (var edge in otherGraphData.edges) {\n                AddEdge(edge);\n            }\n\n            foreach (var property in otherGraphData.properties) {\n                AddProperty(property);\n            }\n        }\n\n        public void AddNode(SerializedNode node) {\n            nodeDictionary.Add(node.GUID, node);\n            nodes.Add(node);\n            addedNodes.Add(node);\n        }\n\n        public void RemoveNode(SerializedNode node) {\n            if (!nodeDictionary.ContainsKey(node.GUID))\n                throw new InvalidOperationException($\"Cannot remove node ({node.GUID}) because it doesn't exist.\");\n\n            nodes.Remove(node);\n            nodeDictionary.Remove(node.GUID);\n            removedNodes.Add(node);\n\n            edges.Where(edge => edge.Input == node.GUID || edge.Output == node.GUID).ToList().ForEach(RemoveEdge);\n        }\n\n        public bool HasEdge(Edge edge) {\n            var serializedEdge = new SerializedEdge {\n                Input = edge.input.node.viewDataKey,\n                Output = edge.output.node.viewDataKey,\n                InputPort = edge.input.viewDataKey,\n                OutputPort = edge.output.viewDataKey\n            };\n            return Edges.Any(edge1 => edge1.Input == serializedEdge.Input && edge1.Output == serializedEdge.Output && edge1.InputPort == serializedEdge.InputPort && edge1.OutputPort == serializedEdge.OutputPort);\n        }\n\n        public void AddEdge(Edge edge) {\n            var serializedEdge = new SerializedEdge {\n                Input = edge.input.node.viewDataKey,\n                Output = edge.output.node.viewDataKey,\n                InputPort = edge.input.viewDataKey,\n                OutputPort = edge.output.viewDataKey,\n                InputCapacity  = edge.input.capacity,\n                OutputCapacity = edge.output.capacity\n            };\n            AddEdge(serializedEdge);\n        }\n\n        public void AddEdge(SerializedEdge edge) {\n            if (edge.InputCapacity == Port.Capacity.Single) {\n                // Remove all edges with the same port\n                var temp = new List<SerializedEdge>();\n                temp.AddRange(edges.Where(edge1 => edge1.InputPort == edge.InputPort));\n                temp.ForEach(RemoveEdge);\n            }\n\n            if (edge.OutputCapacity == Port.Capacity.Single) {\n                // Remove all edges with the same port\n                var temp = new List<SerializedEdge>();\n                temp.AddRange(edges.Where(edge1 => edge1.OutputPort == edge.OutputPort));\n                temp.ForEach(RemoveEdge);\n            }\n\n            edges.Add(edge);\n            addedEdges.Add(edge);\n        }\n\n        public void RemoveEdge(SerializedEdge edge) {\n            edges.Remove(edge);\n            removedEdges.Add(edge);\n        }\n\n        public void AddProperty(AbstractProperty property) {\n            if (property == null) return;\n            if (properties.Contains(property)) return;\n            properties.Add(property);\n            addedProperties.Add(property);\n        }\n\n        public void RemoveProperty(AbstractProperty property) {\n            var propertyNodes = nodes.FindAll(node => node.Node is PropertyNode propertyNode && propertyNode.PropertyGuid == property.GUID);\n            foreach (var node in propertyNodes)\n                RemoveNode(node);\n\n            if (properties.Remove(property)) {\n                removedProperties.Add(property);\n                addedProperties.Remove(property);\n                movedProperties.Remove(property);\n            }\n        }\n\n        public void MoveProperty(AbstractProperty property, int newIndex) {\n            if (newIndex > properties.Count || newIndex < 0)\n                throw new ArgumentException(\"New index is not within properties list.\");\n            var currentIndex = properties.IndexOf(property);\n            if (currentIndex == -1)\n                throw new ArgumentException(\"Property is not in graph.\");\n            if (newIndex == currentIndex) {\n                Debug.Log($\"New index is the same as current index {newIndex} == {currentIndex}\");\n                return;\n            }\n            properties.RemoveAt(currentIndex);\n            if (newIndex > currentIndex)\n                newIndex--;\n            var isLast = newIndex == properties.Count;\n            if (isLast) {\n                Debug.Log($\"New index is the last index new:{newIndex} current:{currentIndex}\");\n                properties.Add(property);\n            } else {\n                Debug.Log($\"new:{newIndex} current:{currentIndex}\");\n                properties.Insert(newIndex, property);\n            }\n            if (!movedProperties.Contains(property))\n                movedProperties.Add(property);\n        }\n\n        public void RemoveElements(List<SerializedNode> nodes, List<SerializedEdge> edges) {\n            foreach (var edge in edges) {\n                RemoveEdge(edge);\n            }\n\n            foreach (var node in nodes) {\n                RemoveNode(node);\n            }\n        }\n\n        public void QueueSelection(List<SerializedNode> nodes, List<SerializedEdge> edges) {\n            nodeSelectionQueue.AddRange(nodes);\n            edgeSelectionQueue.AddRange(edges);\n        }\n\n        public void SanitizePropertyName(AbstractProperty property) {\n            property.DisplayName = property.DisplayName.Trim();\n            property.DisplayName = DialogueGraphUtility.SanitizeName(properties.Where(prop => prop.GUID != property.GUID).Select(prop => prop.DisplayName), \"{0} ({1})\", property.DisplayName);\n        }\n\n        public void SanitizePropertyReference(AbstractProperty property, string newReferenceName) {\n            if (string.IsNullOrEmpty(newReferenceName))\n                return;\n\n            var name = newReferenceName.Trim();\n            if (string.IsNullOrEmpty(name))\n                return;\n\n            property.OverrideReferenceName = DialogueGraphUtility.SanitizeName(properties.Where(prop => prop.GUID != property.GUID).Select(prop => prop.ReferenceName), \"{0} ({1})\", name);\n        }\n\n        public void Paste(CopyPasteData copyPasteData, List<SerializedNode> remappedNodes, List<SerializedEdge> remappedEdges) {\n            var nodeGuidMap = new Dictionary<string, string>();\n            var portGuidMap = new Dictionary<string, string>();\n            foreach (var node in copyPasteData.Nodes) {\n                var oldGuid = node.GUID;\n                var newGuid = Guid.NewGuid().ToString();\n                node.GUID = newGuid;\n                nodeGuidMap[oldGuid] = newGuid;\n                for (var i = 0; i < node.PortData.Count; i++) {\n                    var newPortGuid = Guid.NewGuid().ToString();\n                    var oldPortGuid = node.PortData[i];\n                    portGuidMap[oldPortGuid] = newPortGuid;\n\n                    node.PortData[i] = newPortGuid;\n                }\n\n                // Ugly magic to change dynamic port guid data\n                if (node.Type == typeof(SelfNode).FullName) {\n                    var data = JObject.Parse(node.NodeData);\n                    var lines = JsonConvert.DeserializeObject<List<LineDataSelf>>(data.Value<string>(\"lines\"));\n\n                    foreach (var currLine in lines) {\n                        currLine.PortGuidA = portGuidMap[currLine.PortGuidA];\n                        currLine.PortGuidB = portGuidMap[currLine.PortGuidB];\n                    }\n\n                    data[\"lines\"] = new JValue(JsonConvert.SerializeObject(lines));\n                    node.NodeData = data.ToString(Formatting.None);\n                } else if (node.Type == typeof(NpcNode).FullName) {\n                    var data = JObject.Parse(node.NodeData);\n                    var lines = JsonConvert.DeserializeObject<List<LineDataNpc>>(data.Value<string>(\"lines\"));\n\n                    foreach (var currLine in lines) {\n                        currLine.PortGuidA = portGuidMap[currLine.PortGuidA];\n                        currLine.PortGuidB = portGuidMap[currLine.PortGuidB];\n                        currLine.PortGuidC = portGuidMap[currLine.PortGuidC];\n                    }\n\n                    data[\"lines\"] = new JValue(JsonConvert.SerializeObject(lines));\n                    node.NodeData = data.ToString(Formatting.None);\n                }\n\n                // offset the pasted node slightly so it's not on top of the original one\n                var drawState = node.DrawState;\n                var position = drawState.Position;\n                position.x += 30;\n                position.y += 30;\n                drawState.Position = position;\n                node.DrawState = drawState;\n                remappedNodes.Add(node);\n                AddNode(node);\n\n                // add the node to the pasted node list\n                pastedNodes.Add(node);\n            }\n\n            foreach (var edge in copyPasteData.Edges) {\n                if ((nodeGuidMap.ContainsKey(edge.Input) && nodeGuidMap.ContainsKey(edge.Output)) && (portGuidMap.ContainsKey(edge.InputPort) && portGuidMap.ContainsKey(edge.OutputPort))) {\n                    var remappedOutputGuid = nodeGuidMap.ContainsKey(edge.Output) ? nodeGuidMap[edge.Output] : edge.Output;\n                    var remappedInputGuid = nodeGuidMap.ContainsKey(edge.Input) ? nodeGuidMap[edge.Input] : edge.Input;\n                    var remappedOutputPortGuid = portGuidMap.ContainsKey(edge.OutputPort) ? portGuidMap[edge.OutputPort] : edge.OutputPort;\n                    var remappedInputPortGuid = portGuidMap.ContainsKey(edge.InputPort) ? portGuidMap[edge.InputPort] : edge.InputPort;\n                    var remappedEdge = new SerializedEdge {\n                        Input = remappedInputGuid,\n                        Output = remappedOutputGuid,\n                        InputPort = remappedInputPortGuid,\n                        OutputPort = remappedOutputPortGuid,\n                        InputCapacity = edge.InputCapacity,\n                        OutputCapacity = edge.OutputCapacity\n                    };\n                    remappedEdges.Add(remappedEdge);\n                    AddEdge(remappedEdge);\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/DlogGraphData.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: c191dd86e9a94d78baaeb54ed76b3022\ntimeCreated: 1601289631"
  },
  {
    "path": "Editor/Graph/Data/DlogGraphObject.cs",
    "content": "using System;\nusing UnityEditor;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    public class DlogGraphObject : ScriptableObject, ISerializationCallbackReceiver {\n        [NonSerialized] private DlogGraphData dlogGraph;\n        [NonSerialized] private int objectVersion;\n\n        [SerializeField] public string AssetGuid;\n        [SerializeField] public bool IsBlackboardVisible;\n        [SerializeField] private string serializedGraph;\n        [SerializeField] private int fileVersion;\n        [SerializeField] private bool isDirty;\n\n        public DlogGraphData DlogGraph {\n            get => dlogGraph;\n            set {\n                dlogGraph = value;\n                if (dlogGraph != null)\n                    dlogGraph.Owner = this;\n            }\n        }\n\n        public void Initialize(DlogGraphData dlogData) {\n            DlogGraph = dlogData;\n            IsBlackboardVisible = DlogGraph.IsBlackboardVisible;\n        }\n\n        public bool IsDirty {\n            get => isDirty;\n            set => isDirty = value;\n        }\n\n        public bool WasUndoRedoPerformed => objectVersion != fileVersion;\n\n        public void RegisterCompleteObjectUndo(string name) {\n            Undo.RegisterCompleteObjectUndo(this, name);\n            fileVersion++;\n            objectVersion++;\n            isDirty = true;\n        }\n\n        public void OnBeforeSerialize() {\n            if(dlogGraph == null) return;\n\n            serializedGraph = JsonUtility.ToJson(dlogGraph, true);\n            AssetGuid = dlogGraph.AssetGuid;\n        }\n\n        public void OnAfterDeserialize() {\n            if(DlogGraph != null) return;\n            DlogGraph = Deserialize();\n        }\n\n        public void HandleUndoRedo() {\n            if (!WasUndoRedoPerformed) {\n                Debug.LogError(\"Trying to handle undo/redo when undo/redo was not performed\", this);\n                return;\n            }\n            var deserialized = Deserialize();\n            dlogGraph.ReplaceWith(deserialized);\n            // Undo.PerformUndo();\n        }\n\n        private DlogGraphData Deserialize() {\n            var deserialized = JsonUtility.FromJson<DlogGraphData>(serializedGraph);\n            deserialized.AssetGuid = AssetGuid;\n            objectVersion = fileVersion;\n            serializedGraph = \"\";\n            return deserialized;\n        }\n\n        public void RecalculateAssetGuid(string assetPath) {\n            AssetGuid = AssetDatabase.AssetPathToGUID(assetPath);\n            dlogGraph.AssetGuid = AssetGuid;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/DlogGraphObject.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 45a52db35d93407fb259c4996ec53fa6\ntimeCreated: 1601289640"
  },
  {
    "path": "Editor/Graph/Data/NodeDrawState.cs",
    "content": "using System;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public struct NodeDrawState {\n        [SerializeField] public Rect Position;\n        [SerializeField] public bool Expanded;\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/NodeDrawState.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 76290e77b5a74b6ba5d52be0d2aaa0ef\ntimeCreated: 1601551907"
  },
  {
    "path": "Editor/Graph/Data/Properties/AbstractProperty.cs",
    "content": "using System;\nusing DialogueGraph.Runtime;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public abstract class AbstractProperty {\n        [SerializeField] public string GUID = Guid.NewGuid().ToString();\n        [SerializeField] public PropertyType Type;\n        [SerializeField] private string name;\n        [SerializeField] private string defaultReferenceName;\n        [SerializeField] private string overrideReferenceName;\n        [SerializeField] private bool hidden;\n\n        public string DisplayName {\n            get {\n                if (string.IsNullOrEmpty(name))\n                    return $\"{Type}_{ShortGuid}\";\n                return name;\n            }\n            set => name = value;\n        }\n\n        public string ReferenceName {\n            get {\n                if (string.IsNullOrEmpty(OverrideReferenceName)) {\n                    if (string.IsNullOrEmpty(defaultReferenceName))\n                        defaultReferenceName = GetDefaultReferenceName();\n                    return defaultReferenceName;\n                }\n                return OverrideReferenceName;\n            }\n        }\n\n        public string OverrideReferenceName {\n            get => overrideReferenceName;\n            set => overrideReferenceName = value;\n        }\n\n        public bool Hidden {\n            get => hidden;\n            set => hidden = value;\n        }\n\n        public virtual string GetDefaultReferenceName() {\n            return $\"{Type}_{ShortGuid}\";\n        }\n\n        public string ShortGuid {\n            get {\n                if (string.IsNullOrEmpty(GUID))\n                    GUID = Guid.NewGuid().ToString();\n                if (Guid.TryParse(GUID, out var parsedGuid))\n                    return $\"{Convert.ToBase64String(parsedGuid.ToByteArray()).GetHashCode():X}\";\n                return $\"{Convert.ToBase64String(Guid.NewGuid().ToByteArray()).GetHashCode():X}\";\n            }\n        }\n\n        public abstract AbstractProperty Copy();\n    }\n\n    [Serializable]\n    public abstract class AbstractProperty<T> : AbstractProperty {\n        private T value;\n        public T Value {\n            get => value;\n            set => this.value = value;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/Properties/AbstractProperty.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 8b7821e2c03c442f8979d30247900abe\ntimeCreated: 1602590130"
  },
  {
    "path": "Editor/Graph/Data/Properties/ActorProperty.cs",
    "content": "using System;\nusing DialogueGraph.Runtime;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public class ActorProperty : AbstractProperty {\n        public ActorProperty() {\n            DisplayName = \"Actor\";\n            Type = PropertyType.Actor;\n        }\n\n        public override AbstractProperty Copy() {\n            return new ActorProperty {\n                DisplayName = DisplayName,\n                Hidden = Hidden\n            };\n        }\n    }\n\n}"
  },
  {
    "path": "Editor/Graph/Data/Properties/ActorProperty.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: b1714ccfa2d94454bad768ada07829b1\ntimeCreated: 1602591421"
  },
  {
    "path": "Editor/Graph/Data/Properties/CheckProperty.cs",
    "content": "using System;\nusing DialogueGraph.Runtime;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public class CheckProperty : AbstractProperty {\n        public CheckProperty() {\n            DisplayName = \"Check\";\n            Type = PropertyType.Check;\n        }\n\n        public override AbstractProperty Copy() {\n            return new CheckProperty {\n                DisplayName = DisplayName,\n                Hidden = Hidden\n            };\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/Properties/CheckProperty.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 791df7817718417b8d85ff456275f787\ntimeCreated: 1602591348"
  },
  {
    "path": "Editor/Graph/Data/Properties/TriggerProperty.cs",
    "content": "using System;\nusing DialogueGraph.Runtime;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public class TriggerProperty : AbstractProperty {\n        public TriggerProperty() {\n            DisplayName = \"Trigger\";\n            Type = PropertyType.Trigger;\n        }\n\n        public override AbstractProperty Copy() {\n            return new TriggerProperty {\n                DisplayName = DisplayName,\n                Hidden = Hidden\n            };\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/Properties/TriggerProperty.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: b4055b2efff2408cbc7af168eedbc563\ntimeCreated: 1602590953"
  },
  {
    "path": "Editor/Graph/Data/Properties.meta",
    "content": "﻿fileFormatVersion: 2\nguid: f28d6edcc2e74cfc9d314ba343872167\ntimeCreated: 1602590819"
  },
  {
    "path": "Editor/Graph/Data/SerializedEdge.cs",
    "content": "using System;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\nusing Edge = UnityEditor.Experimental.GraphView.Edge;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public class SerializedEdge {\n        [SerializeField] public string Input;\n        [SerializeField] public string Output;\n        [SerializeField] public string InputPort;\n        [SerializeField] public string OutputPort;\n        public Port.Capacity InputCapacity;\n        public Port.Capacity OutputCapacity;\n\n        public Edge Edge;\n        public EditorView EditorView;\n\n        public void BuildEdge(EditorView editorView) {\n            EditorView = editorView;\n            var inputNode = editorView.GraphView.nodes.ToList().Find(node => node.viewDataKey == Input) as AbstractNode;\n            var outputNode = editorView.GraphView.nodes.ToList().Find(node => node.viewDataKey == Output) as AbstractNode;\n            var inputPort = inputNode.Owner.GuidPortDictionary[InputPort];\n            var outputPort = outputNode.Owner.GuidPortDictionary[OutputPort];\n            Edge = inputPort.ConnectTo(outputPort);\n            Edge.userData = this;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/SerializedEdge.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 647548daa8934a929f8e14371c0705df\ntimeCreated: 1601479470"
  },
  {
    "path": "Editor/Graph/Data/SerializedNode.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public class SerializedNode : ISerializationCallbackReceiver {\n        [SerializeField] public string GUID;\n        [SerializeField] public string Type;\n        [SerializeField] public NodeDrawState DrawState;\n        [SerializeField] public string NodeData;\n        [SerializeField] public List<string> PortData;\n        [NonSerialized] public Dictionary<string, Port> GuidPortDictionary;\n\n        public EditorView EditorView;\n        public AbstractNode Node;\n\n        public SerializedNode(Type type, Rect position) {\n            Type = type.FullName;\n            DrawState.Position = position;\n            DrawState.Expanded = true;\n            GUID = Guid.NewGuid().ToString();\n        }\n\n        public void BuildNode(EditorView editorView, EdgeConnectorListener edgeConnectorListener, bool buildPortData = true) {\n            EditorView = editorView;\n            Node = (AbstractNode) Activator.CreateInstance(System.Type.GetType(Type));\n            Node.InitializeNode(edgeConnectorListener);\n            Node.GUID = GUID;\n            Node.viewDataKey = GUID;\n            Node.Owner = this;\n            Node.SetExpandedWithoutNotify(DrawState.Expanded);\n            Node.SetPosition(DrawState.Position);\n            if (!string.IsNullOrEmpty(NodeData))\n                Node.SetNodeData(NodeData);\n            Node.Refresh();\n\n            if (buildPortData)\n                BuildPortData();\n        }\n\n        public void BuildPortData() {\n            if ((Node.Ports == null || Node.Ports.Count == 0) && (PortData == null || PortData.Count == 0)) {\n                return;\n            }\n\n            if ((PortData == null || PortData.Count == 0) && Node.Ports.Count != 0 || (PortData != null && PortData.Count != Node.Ports.Count && Node.Ports.Count != 0)) {\n                // GET\n                PortData = new List<string>();\n                foreach (var port in Node.Ports) {\n                    PortData.Add(port.viewDataKey);\n                }\n            } else {\n                // SET\n                if (PortData == null)\n                    throw new InvalidDataException(\"Serialized port data somehow ended up as null when it was not supposed to.\");\n                for (var i = 0; i < PortData.Count; i++) {\n                    Node.Ports[i].viewDataKey = PortData[i];\n                }\n            }\n\n            // Build dictionary\n            GuidPortDictionary = new Dictionary<string, Port>();\n            foreach (var port in Node.Ports) {\n                GuidPortDictionary.Add(port.viewDataKey, port);\n            }\n        }\n\n        public void OnBeforeSerialize() {\n            if (Node == null)\n                return;\n            Node.OnNodeSerialized();\n            NodeData = Node.GetNodeData();\n        }\n\n        public void OnAfterDeserialize() {\n            if (Node == null)\n                return;\n            Node.OnNodeDeserialized();\n            if (!string.IsNullOrEmpty(NodeData))\n                Node.SetNodeData(NodeData);\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/SerializedNode.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 7a13f7ce51ca435792839c6342944c7d\ntimeCreated: 1601479420"
  },
  {
    "path": "Editor/Graph/Data/SerializedProperty.cs",
    "content": "using System;\nusing Newtonsoft.Json;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public class SerializedProperty {\n        public string Type;\n        public string Data;\n\n        public SerializedProperty(AbstractProperty property) {\n            Data = JsonConvert.SerializeObject(property, Formatting.None, new JsonSerializerSettings {TypeNameHandling = TypeNameHandling.All});\n            Type = property.GetType().FullName;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/SerializedProperty.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 851b6a27fb244793a696f96b78ccf017\ntimeCreated: 1602600670"
  },
  {
    "path": "Editor/Graph/Data/VersionMismatchObject.cs",
    "content": "using UnityEngine;\n\nnamespace DialogueGraph {\n    internal class VersionMismatchObject : ScriptableObject {\n    }\n}"
  },
  {
    "path": "Editor/Graph/Data/VersionMismatchObject.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 15c4241bdbc14e7e9ac2eabe65b9b4b7\ntimeCreated: 1649591459"
  },
  {
    "path": "Editor/Graph/Data.meta",
    "content": "﻿fileFormatVersion: 2\nguid: dd017a28da8740f881573ba039014b54\ntimeCreated: 1601480300"
  },
  {
    "path": "Editor/Graph/Nodes/AbstractNode.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public abstract class AbstractNode : Node {\n        public SerializedNode Owner { get; set; }\n        public string GUID;\n        public readonly List<Port> Ports = new List<Port>();\n\n        protected EdgeConnectorListener EdgeConnectorListener;\n\n        public override bool expanded {\n            get => base.expanded;\n            set {\n                Owner.EditorView.DlogObject.RegisterCompleteObjectUndo(\"Expanded state changed\");\n                base.expanded = value;\n                Owner.DrawState.Expanded = value;\n            }\n        }\n\n        // ReSharper disable once InconsistentNaming, UnusedAutoPropertyAccessor.Local\n        [Obsolete(\"Use AddPort instead of manually adding ports to the container. Only use this if you're adding custom items to the container.\", false)]\n        protected new VisualElement inputContainer => base.inputContainer;\n\n        // ReSharper disable once InconsistentNaming, UnusedAutoPropertyAccessor.Local\n        [Obsolete(\"Use AddPort instead of manually adding ports to the container. Only use this if you're adding custom items to the container.\", false)]\n        protected new VisualElement outputContainer => base.outputContainer;\n\n        protected void AddPort(Port port, bool alsoAddToHierarchy = true) {\n            Ports.Add(port);\n            \n            if(!alsoAddToHierarchy) return;\n            var isInput = port.direction == Direction.Input;\n            if (isInput) {\n                base.inputContainer.Add(port);\n            } else {\n                base.outputContainer.Add(port);\n            }\n\n        }\n\n        public virtual void InitializeNode(EdgeConnectorListener edgeConnectorListener) {\n            EdgeConnectorListener = edgeConnectorListener;\n        }\n\n        protected void Initialize(string nodeTitle, Rect nodePosition) {\n            base.title = nodeTitle;\n            base.SetPosition(nodePosition);\n            GUID = Guid.NewGuid().ToString();\n            viewDataKey = GUID;\n            this.AddStyleSheet(\"Styles/Node/Node\");\n            InjectCustomStyle();\n        }\n\n        protected virtual void InjectCustomStyle() {\n            var border = this.Q(\"node-border\");\n            var overflowStyle = border.style.overflow;\n            overflowStyle.value = Overflow.Visible;\n            border.style.overflow = overflowStyle;\n\n            var selectionBorder = this.Q(\"selection-border\");\n            selectionBorder.SendToBack();\n        }\n\n        public void Refresh() {\n            RefreshPorts();\n            RefreshExpandedState();\n        }\n\n        public void SetExpandedWithoutNotify(bool value) {\n            base.expanded = value;\n        }\n\n        public virtual void SetNodeData(string jsonData) { }\n\n        public virtual string GetNodeData() {\n            var root = new JObject();\n            return root.ToString(Formatting.None);\n        }\n\n        public virtual void OnNodeSerialized() { }\n        public virtual void OnNodeDeserialized() { }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/AbstractNode.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: eb86560c1bb04cc997a78be15a95ac6e\ntimeCreated: 1601474268"
  },
  {
    "path": "Editor/Graph/Nodes/Boolean/BinaryBooleanNode.cs",
    "content": "using UnityEditor.Experimental.GraphView;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public abstract class BinaryBooleanNode : AbstractNode {\n        protected abstract string Title { get; }\n        protected abstract BooleanOperation Operation { get; }\n\n        public override void InitializeNode(EdgeConnectorListener edgeConnectorListener) {\n            base.InitializeNode(edgeConnectorListener);\n            Initialize(Title, EditorView.DefaultNodePosition);\n            this.AddStyleSheet(\"Styles/Node/BooleanNode\");\n            AddToClassList(Operation.ToString());\n\n            DlogPort inA = DlogPort.Create(\"INA\", Orientation.Horizontal, Direction.Input, Port.Capacity.Single, PortType.Boolean, true, edgeConnectorListener, true);\n            DlogPort inB = DlogPort.Create(\"INB\", Orientation.Horizontal, Direction.Input, Port.Capacity.Single, PortType.Boolean, true, edgeConnectorListener, true);\n            DlogPort @out = DlogPort.Create(\"OUT\", Orientation.Horizontal, Direction.Output, Port.Capacity.Single, PortType.Boolean, true, edgeConnectorListener, true);\n\n            AddPort(inA, false);\n            AddPort(inB, false);\n            AddPort(@out, false);\n\n            VisualElement booleanMain = UIElementsFactory.VisualElement<VisualElement>(\"boolean-main\", null);\n            VisualElement booleanInput = UIElementsFactory.VisualElement<VisualElement>(\"boolean-input\", new[] {\"boolean-column\"});\n            VisualElement booleanOutput = UIElementsFactory.VisualElement<VisualElement>(\"boolean-output\", new[] {\"boolean-column\"});\n\n            booleanMain.Add(booleanInput);\n            booleanMain.Add(UIElementsFactory.TextElement<Label>(\"boolean-operation\", Operation.ToString(), new[] {\"boolean-column\"}));\n            booleanMain.Add(booleanOutput);\n            booleanInput.Add(inA);\n            booleanInput.Add(inB);\n            booleanOutput.Add(@out);\n\n            titleContainer.Clear();\n            titleContainer.Add(booleanMain);\n            Refresh();\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/Boolean/BinaryBooleanNode.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 2d98f66e26a848fc9816693d42cacd53\ntimeCreated: 1649584538"
  },
  {
    "path": "Editor/Graph/Nodes/Boolean/BooleanNodes.cs",
    "content": "namespace DialogueGraph {\n    [Title(\"Boolean\", \"NOT\")]\n    public class NotBooleanNode : UnaryBooleanNode {\n        protected override string Title => \"Not/Negate\";\n        protected override BooleanOperation Operation => BooleanOperation.NOT;\n    }\n\n    [Title(\"Boolean\", \"AND\")]\n    public class AndBooleanNode : BinaryBooleanNode {\n        protected override string Title => \"And\";\n        protected override BooleanOperation Operation => BooleanOperation.AND;\n    }\n\n    [Title(\"Boolean\", \"OR\")]\n    public class OrBooleanNode : BinaryBooleanNode {\n        protected override string Title => \"Or\";\n        protected override BooleanOperation Operation => BooleanOperation.OR;\n    }\n\n    [Title(\"Boolean\", \"XOR\")]\n    public class XorBooleanNode : BinaryBooleanNode {\n        protected override string Title => \"Xor\";\n        protected override BooleanOperation Operation => BooleanOperation.XOR;\n    }\n\n    [Title(\"Boolean\", \"NAND\")]\n    public class NandBooleanNode : BinaryBooleanNode {\n        protected override string Title => \"Nand\";\n        protected override BooleanOperation Operation => BooleanOperation.NAND;\n    }\n\n    [Title(\"Boolean\", \"NOR\")]\n    public class NorBooleanNode : BinaryBooleanNode {\n        protected override string Title => \"Nor\";\n        protected override BooleanOperation Operation => BooleanOperation.NOR;\n    }\n\n    [Title(\"Boolean\", \"XNOR\")]\n    public class XnorBooleanNode : BinaryBooleanNode {\n        protected override string Title => \"Xnor\";\n        protected override BooleanOperation Operation => BooleanOperation.XNOR;\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/Boolean/BooleanNodes.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 7dc49fe917b6428e91e2a2d58287cd04\ntimeCreated: 1649584579"
  },
  {
    "path": "Editor/Graph/Nodes/Boolean/UnaryBooleanNode.cs",
    "content": "using UnityEditor.Experimental.GraphView;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public abstract class UnaryBooleanNode : AbstractNode {\n        protected abstract string Title { get; }\n        protected abstract BooleanOperation Operation { get; }\n\n        public override void InitializeNode(EdgeConnectorListener edgeConnectorListener) {\n            base.InitializeNode(edgeConnectorListener);\n            Initialize(Title, EditorView.DefaultNodePosition);\n            this.AddStyleSheet(\"Styles/Node/BooleanNode\");\n            AddToClassList(Operation.ToString());\n\n            DlogPort @in = DlogPort.Create(\"IN\", Orientation.Horizontal, Direction.Input, Port.Capacity.Single, PortType.Boolean, true, edgeConnectorListener, true);\n            DlogPort @out = DlogPort.Create(\"OUT\", Orientation.Horizontal, Direction.Output, Port.Capacity.Single, PortType.Boolean, true, edgeConnectorListener, true);\n\n            AddPort(@in, false);\n            AddPort(@out, false);\n\n            VisualElement booleanMain = UIElementsFactory.VisualElement<VisualElement>(\"boolean-main\", null);\n            VisualElement booleanInput = UIElementsFactory.VisualElement<VisualElement>(\"boolean-input\", new[] {\"boolean-column\"});\n            VisualElement booleanOutput = UIElementsFactory.VisualElement<VisualElement>(\"boolean-output\", new[] {\"boolean-column\"});\n\n            booleanMain.Add(booleanInput);\n            booleanMain.Add(UIElementsFactory.TextElement<Label>(\"boolean-operation\", Operation.ToString(), new[] {\"boolean-column\"}));\n            booleanMain.Add(booleanOutput);\n            booleanInput.Add(@in);\n            booleanOutput.Add(@out);\n\n            titleContainer.Clear();\n            titleContainer.Add(booleanMain);\n            Refresh();\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/Boolean/UnaryBooleanNode.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 92835ae44e17474d9f9464a90008dfb0\ntimeCreated: 1649583997"
  },
  {
    "path": "Editor/Graph/Nodes/Boolean.meta",
    "content": "fileFormatVersion: 2\nguid: 8f497a2553e74f8abd283933c4697b1f\ntimeCreated: 1649583978"
  },
  {
    "path": "Editor/Graph/Nodes/NodeColors.cs",
    "content": "using UnityEngine;\n\nnamespace DialogueGraph {\n    public static class NodeColors {\n        public static Color CombinerColor = new Color(0.19f, 0.65f, 0.71f);\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/NodeColors.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 5738c2748b044563868f33194c81519f\ntimeCreated: 1605351105"
  },
  {
    "path": "Editor/Graph/Nodes/NpcNode.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\nusing UnityEngine.UIElements;\n\n#pragma warning disable 618\n\nnamespace DialogueGraph {\n    public class LineDataNpc {\n        public string Line;\n        public string PortGuidA;\n        public string PortGuidB;\n        public string PortGuidC;\n    }\n\n    [Title(\"NPC\")]\n    public class NpcNode : AbstractNode {\n        public List<LineDataNpc> Lines = new List<LineDataNpc>();\n        private VisualElement lineLabel;\n\n        public override void InitializeNode(EdgeConnectorListener edgeConnectorListener) {\n            base.InitializeNode(edgeConnectorListener);\n            Initialize(\"NPC\", EditorView.DefaultNodePosition);\n\n            var button = new Button(() => AddConversationPort(true)) {text = \"Create Dialogue Line\"};\n            extensionContainer.Add(button);\n\n            var titleLabel = this.Q<Label>(\"title-label\");\n            var titleElement = this.Q(\"title\");\n            var titleC = UIElementsFactory.VisualElement<VisualElement>(\"title-container\", null);\n            titleLabel.RemoveFromHierarchy();\n            titleC.Add(titleLabel);\n            titleElement.Insert(0, titleC);\n\n            lineLabel = new Label {name = \"lineTitle\", text = \"Lines\"};\n            outputContainer.Add(lineLabel);\n            var titlePortContainer = UIElementsFactory.VisualElement<VisualElement>(\"npc-title-port-container\", null);\n\n            var branchPort = DlogPort.Create(\"Branch\", Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, PortType.Branch, true, edgeConnectorListener);\n            var actorPort = DlogPort.Create(\"Actor\", Orientation.Horizontal, Direction.Input, Port.Capacity.Single, PortType.Actor, true, edgeConnectorListener);\n            titlePortContainer.Add(branchPort);\n            titlePortContainer.Add(actorPort);\n            titleC.Insert(0, titlePortContainer);\n            AddPort(branchPort, false);\n            AddPort(actorPort, false);\n            Refresh();\n        }\n\n        public override void SetNodeData(string jsonData) {\n            if (string.IsNullOrEmpty(jsonData)) return;\n            base.SetNodeData(jsonData);\n            var data = JObject.Parse(jsonData);\n            var lines = JsonConvert.DeserializeObject<List<LineDataNpc>>(data.Value<string>(\"lines\"));\n            Lines.Clear();\n            Lines.AddRange(lines);\n            for (int i = 0; i < Lines.Count; i++) {\n                AddConversationPort(false, i);\n            }\n        }\n\n        public override string GetNodeData() {\n            var root = new JObject();\n            root[\"lines\"] = new JValue(JsonConvert.SerializeObject(Lines));\n            root.Merge(JObject.Parse(base.GetNodeData()));\n            return root.ToString(Formatting.None);\n        }\n\n        private void AddConversationPort(bool create, int index = -1) {\n            lineLabel.AddToClassList(\"visible\");\n            var conversationContainer = new VisualElement {name = \"conversation-container\"};\n\n            if (create) {\n                Owner.EditorView.DlogObject.RegisterCompleteObjectUndo(\"Created Dialogue Line\");\n                index = Lines.Count;\n                Lines.Add(new LineDataNpc {Line = \"\"});\n            }\n\n            var message = UIElementsFactory.TextField(\"conversation-item\", \"Line\", new[] {\"message\"}, null, null, true);\n            if (!create) {\n                message.SetValueWithoutNotify(Lines[index].Line);\n            }\n\n            var branchPort = DlogPort.Create(\"Branch\", Orientation.Horizontal, Direction.Output, Port.Capacity.Single, PortType.Branch, true, EdgeConnectorListener);\n            branchPort.name = \"conversation-item\";\n            branchPort.AddToClassList(\"branch-port\");\n            var triggerPort = DlogPort.Create(\"Trigger\", Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, PortType.Trigger, false, EdgeConnectorListener);\n            triggerPort.name = \"conversation-item\";\n            triggerPort.AddToClassList(\"trigger-port\");\n            var checkPort = DlogPort.Create(\"Check\", Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, PortType.Check , false,EdgeConnectorListener);\n            checkPort.name = \"conversation-item\";\n            checkPort.AddToClassList(\"check-port\");\n\n            var flexBreak = UIElementsFactory.FlexBreaker();\n            if (create) {\n                Lines[index].PortGuidA = branchPort.viewDataKey;\n                Lines[index].PortGuidB = triggerPort.viewDataKey;\n                Lines[index].PortGuidC = checkPort.viewDataKey;\n            } else {\n                branchPort.viewDataKey = Lines[index].PortGuidA;\n                triggerPort.viewDataKey = Lines[index].PortGuidB;\n                checkPort.viewDataKey = Lines[index].PortGuidC;\n            }\n\n            message.RegisterCallback<FocusOutEvent>(evt => {\n                var lineIndex = Lines.FindIndex(data => data.PortGuidA == branchPort.viewDataKey);\n                if (message.value != Lines[lineIndex].Line) {\n                    Owner.EditorView.DlogObject.RegisterCompleteObjectUndo(\"Changed Dialogue Line\");\n                    Lines[lineIndex].Line = message.value;\n                }\n            });\n            var removeButton = UIElementsFactory.Button(\"x\", \"conversation-item\", \"Remove line\", new[] {\"remove-button\"}, () => { RemoveLine(Lines.FindIndex(data => data.PortGuidA == branchPort.viewDataKey)); });\n\n            conversationContainer.Add(message);\n            conversationContainer.Add(branchPort);\n            conversationContainer.Add(flexBreak);\n            conversationContainer.Add(checkPort);\n            conversationContainer.Add(removeButton);\n            conversationContainer.Add(triggerPort);\n\n            var separator = new VisualElement {name = \"divider\"};\n            separator.AddToClassList(\"horizontal\");\n            separator.AddToClassList(\"horizontal-divider\");\n            outputContainer.Add(separator);\n\n            outputContainer.Add(conversationContainer);\n            Ports.Add(branchPort);\n            Ports.Add(triggerPort);\n            Ports.Add(checkPort);\n            if (create) {\n                Owner.PortData.Add(branchPort.viewDataKey);\n                Owner.PortData.Add(triggerPort.viewDataKey);\n                Owner.PortData.Add(checkPort.viewDataKey);\n                Owner.GuidPortDictionary.Add(branchPort.viewDataKey, branchPort);\n                Owner.GuidPortDictionary.Add(triggerPort.viewDataKey, triggerPort);\n                Owner.GuidPortDictionary.Add(checkPort.viewDataKey, checkPort);\n            }\n\n            Refresh();\n        }\n\n        private void RemoveLine(int index) {\n            if (Lines.Count == 1)\n                lineLabel.RemoveFromClassList(\"visible\");\n            \n            var container = outputContainer.Children().Where(element => element.name == \"conversation-container\").ToList()[index];\n            var separator = outputContainer.Children().Where(element => element.name == \"divider\" && element.ClassListContains(\"horizontal-divider\")).ToList()[index];\n            outputContainer.Remove(separator);\n\n            Owner.EditorView.DlogObject.RegisterCompleteObjectUndo(\"Removed Line\");\n            var edgesToRemove = Owner.EditorView.DlogObject.DlogGraph.Edges.Where(edge => edge.InputPort == Lines[index].PortGuidA || edge.OutputPort == Lines[index].PortGuidA).ToList();\n            edgesToRemove.AddRange(Owner.EditorView.DlogObject.DlogGraph.Edges.Where(edge => edge.InputPort == Lines[index].PortGuidB || edge.OutputPort == Lines[index].PortGuidB));\n            edgesToRemove.AddRange(Owner.EditorView.DlogObject.DlogGraph.Edges.Where(edge => edge.InputPort == Lines[index].PortGuidC || edge.OutputPort == Lines[index].PortGuidC));\n            Owner.EditorView.DlogObject.DlogGraph.RemoveElements(new List<SerializedNode>(), edgesToRemove);\n            Owner.PortData.Remove(Lines[index].PortGuidA);\n            Owner.PortData.Remove(Lines[index].PortGuidB);\n            Owner.PortData.Remove(Lines[index].PortGuidC);\n            var portA = Owner.GuidPortDictionary[Lines[index].PortGuidA];\n            var portB = Owner.GuidPortDictionary[Lines[index].PortGuidB];\n            var portC = Owner.GuidPortDictionary[Lines[index].PortGuidC];\n            Owner.GuidPortDictionary.Remove(Lines[index].PortGuidA);\n            Owner.GuidPortDictionary.Remove(Lines[index].PortGuidB);\n            Owner.GuidPortDictionary.Remove(Lines[index].PortGuidC);\n            Ports.Remove(portA);\n            Ports.Remove(portB);\n            Ports.Remove(portC);\n            Lines.RemoveAt(index);\n            outputContainer.Remove(container);\n            Refresh();\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/NpcNode.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: b568e3d4a5e943318ef80702f8618ac4\ntimeCreated: 1602757776"
  },
  {
    "path": "Editor/Graph/Nodes/Port/DlogPort.cs",
    "content": "using System;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public class DlogPort : Port {\n        public PortType Type { get; private set; }\n\n        private DlogPort(Orientation portOrientation, Direction portDirection, Capacity portCapacity) : base(portOrientation, portDirection, portCapacity, typeof(object)) { }\n\n        public static DlogPort Create(string name, Orientation portOrientation, Direction portDirection, Capacity portCapacity, PortType type, bool required, EdgeConnectorListener edgeConnectorListener, bool hideLabel = false) {\n            var port = new DlogPort(portOrientation, portDirection, portCapacity);\n            if (edgeConnectorListener != null) {\n                port.m_EdgeConnector = new EdgeConnector<Edge>(edgeConnectorListener);\n                port.AddManipulator(port.m_EdgeConnector);\n            }\n            \n            port.AddStyleSheet(\"Styles/Node/Port\");\n            if (!required) {\n                port.AddToClassList(\"optional\");\n            }\n            \n            port.Type = type;\n            port.portColor = PortHelper.PortColor(port);\n            port.viewDataKey = Guid.NewGuid().ToString();\n            port.portName = name;\n\n            if (hideLabel) {\n                var label = port.Q<Label>();\n                var fs = label.style.fontSize;\n                fs.value = -1;\n                label.style.fontSize = fs;\n                var color = label.style.color;\n                color.value = Color.clear;\n                label.style.color = color;\n            }\n            \n            \n            port.InjectCustomStyle();\n            \n            return port;\n        }\n    }\n}\n"
  },
  {
    "path": "Editor/Graph/Nodes/Port/DlogPort.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 0e8d2ea4b7c44d64abb892732dda440d\ntimeCreated: 1601566487"
  },
  {
    "path": "Editor/Graph/Nodes/Port/PortHelper.cs",
    "content": "using System;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public static class PortHelper {\n        public static bool IsCompatibleWith(this DlogPort port, DlogPort other) {\n            if (other.Type == PortType.Fake || port.Type == PortType.Fake) return true;\n            switch (port.Type) {\n                case PortType.Check:\n                    return other.Type == PortType.Check || other.Type == PortType.Boolean;\n                case PortType.Trigger:\n                    return other.Type == PortType.Trigger;\n                case PortType.Actor:\n                    return other.Type == PortType.Actor;\n                case PortType.Branch:\n                    return other.Type == PortType.Branch;\n                case PortType.Boolean:\n                    return other.Type == PortType.Check || other.Type == PortType.Boolean;\n                default:\n                    throw new ArgumentOutOfRangeException();\n            }\n        }\n\n        public static Color PortColor(DlogPort port) {\n            switch (port.Type) {\n                case PortType.Check:\n                    if (port.direction == Direction.Input)\n                        return new Color(0.2f, 0.73f, 1f);\n                    return new Color(0.5f, 0.98f, 1f);\n                case PortType.Trigger:\n                    if (port.direction == Direction.Input)\n                        return new Color(1f, 0.15f, 0.26f);\n                    return new Color(0.84f, 0.26f, 0.16f);\n                case PortType.Actor:\n                    if (port.direction == Direction.Input)\n                        return new Color(0.55f, 1f, 0.3f);\n                    return new Color(0.75f, 1f, 0.36f);\n                case PortType.Branch:\n                    if (port.direction == Direction.Input)\n                        return new Color(0.9f, 1f, 0.99f);\n                    return new Color(0.91f, 0.93f, 1f);\n                case PortType.Boolean:\n                    if (port.direction == Direction.Input)\n                        return new Color(0.45f, 0.25f, 1f);\n                    return new Color(0.45f, 0.25f, 1f);\n                case PortType.Fake:\n                    return Color.clear;\n                default:\n                    throw new ArgumentOutOfRangeException(nameof(port), port, \"Undefined color for port type.\");\n            }\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/Port/PortHelper.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 12906347bd6648799640a8de67e215e2\ntimeCreated: 1602761086"
  },
  {
    "path": "Editor/Graph/Nodes/Port/PortType.cs",
    "content": "using System;\n\nnamespace DialogueGraph {\n    public enum PortType {\n        Check,\n        Trigger,\n        Actor,\n        Branch,\n        Boolean,\n        Fake\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/Port/PortType.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 103e6d5a4c304e70b966ab3606a720da\ntimeCreated: 1602760423"
  },
  {
    "path": "Editor/Graph/Nodes/Port.meta",
    "content": "﻿fileFormatVersion: 2\nguid: c72845a71ace4f8d9317f5fe221cccdf\ntimeCreated: 1602761062"
  },
  {
    "path": "Editor/Graph/Nodes/PropertyNode.cs",
    "content": "using System;\nusing System.Linq;\nusing DialogueGraph.Runtime;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor.Experimental.GraphView;\n\nnamespace DialogueGraph {\n    public class PropertyNode : AbstractNode {\n        private string propertyGuid;\n        private string currentType;\n        private EdgeConnectorListener edgeConnectorListener;\n\n        public string PropertyGuid {\n            get => propertyGuid;\n            set {\n                if (propertyGuid == value) return;\n                propertyGuid = value;\n                var property = Owner.EditorView.DlogObject.DlogGraph.Properties.FirstOrDefault(prop => prop.GUID == value);\n                if (property == null) return;\n                if(!string.IsNullOrEmpty(currentType))\n                    RemoveFromClassList(currentType);\n                currentType = property.Type.ToString();\n                AddToClassList(currentType);\n                CreatePorts(property);\n            }\n        }\n\n        public override void InitializeNode(EdgeConnectorListener edgeConnectorListener) {\n            Initialize(\"\", EditorView.DefaultNodePosition);\n            this.edgeConnectorListener = edgeConnectorListener;\n            Refresh();\n        }\n\n\n        public override string GetNodeData() {\n            var root = new JObject();\n            root[\"propertyGuid\"] = propertyGuid;\n            root.Merge(JObject.Parse(base.GetNodeData()));\n            return root.ToString(Formatting.None);\n        }\n\n        public override void SetNodeData(string jsonData) {\n            if(string.IsNullOrEmpty(jsonData)) return;\n            base.SetNodeData(jsonData);\n            var root = JObject.Parse(jsonData);\n            PropertyGuid = root.Value<string>(\"propertyGuid\");\n        }\n\n        private void CreatePorts(AbstractProperty property) {\n            Port createdPort;\n            switch (property.Type) {\n                case PropertyType.Trigger:\n                    createdPort = DlogPort.Create(\"\", Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, PortType.Trigger, false,edgeConnectorListener);\n                    break;\n                case PropertyType.Check:\n                    createdPort = DlogPort.Create(\"\", Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, PortType.Check, false, edgeConnectorListener);\n                    break;\n                case PropertyType.Actor:\n                    createdPort = DlogPort.Create(\"\", Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, PortType.Actor, false, edgeConnectorListener);\n                    break;\n                default:\n                    throw new ArgumentOutOfRangeException();\n            }\n            AddPort(createdPort, false);\n            if(createdPort.direction == Direction.Output)\n                titleContainer.Add(createdPort);\n            else {\n                titleContainer.Insert(0, createdPort);\n                titleContainer.AddToClassList(\"property-port-input\");\n            }\n            Update(property);\n            Refresh();\n        }\n\n        public void Update(AbstractProperty property) {\n            title = property.DisplayName;\n            Refresh();\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/PropertyNode.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 1216d6e8ec004cadaf5f4ea56001aabb\ntimeCreated: 1602589699"
  },
  {
    "path": "Editor/Graph/Nodes/SelfNode.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine.UIElements;\n\n#pragma warning disable 618\n\nnamespace DialogueGraph {\n    public class LineDataSelf {\n        public string Line;\n        public string PortGuidA;\n        public string PortGuidB;\n    }\n\n    [Title(\"Self\")]\n    public class SelfNode : AbstractNode {\n        public List<LineDataSelf> Lines = new List<LineDataSelf>();\n\n        private VisualElement lineLabel;\n\n        public override void InitializeNode(EdgeConnectorListener edgeConnectorListener) {\n            base.InitializeNode(edgeConnectorListener);\n            Initialize(\"Self\", EditorView.DefaultNodePosition);\n\n            lineLabel = new Label {name = \"lineTitle\", text = \"Lines\"};\n            outputContainer.Add(lineLabel);\n\n            var button = new Button(() => AddConversationPort(true)) {text = \"Create Dialogue Line\"};\n            extensionContainer.Add(button);\n            var titleLabel = this.Q<Label>(\"title-label\");\n            var titleElement = this.Q(\"title\");\n            var titleC = UIElementsFactory.VisualElement<VisualElement>(\"title-container\", null);\n            titleLabel.RemoveFromHierarchy();\n            titleC.Add(titleLabel);\n            titleElement.Insert(0, titleC);\n\n            var branchPort = DlogPort.Create(\"Branch\", Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, PortType.Branch, true, edgeConnectorListener);\n            branchPort.AddToClassList(\"square-circle\");\n            titleC.Insert(0, branchPort);\n            AddPort(branchPort, false);\n            Refresh();\n        }\n\n        public override void SetNodeData(string jsonData) {\n            if (string.IsNullOrEmpty(jsonData)) return;\n            base.SetNodeData(jsonData);\n            var data = JObject.Parse(jsonData);\n            var lines = JsonConvert.DeserializeObject<List<LineDataSelf>>(data.Value<string>(\"lines\"));\n            Lines.Clear();\n            Lines.AddRange(lines);\n            for (var i = 0; i < Lines.Count; i++)\n                AddConversationPort(false, i);\n        }\n\n        public override string GetNodeData() {\n            var root = new JObject();\n            root[\"lines\"] = new JValue(JsonConvert.SerializeObject(Lines));\n            root.Merge(JObject.Parse(base.GetNodeData()));\n            return root.ToString(Formatting.None);\n        }\n\n        private void AddConversationPort(bool create, int index = -1) {\n            var conversationContainer = new VisualElement {name = \"conversation-container\"};\n            lineLabel.AddToClassList(\"visible\");\n\n            if (create) {\n                Owner.EditorView.DlogObject.RegisterCompleteObjectUndo(\"Created Dialogue Line\");\n                index = Lines.Count;\n                Lines.Add(new LineDataSelf {Line = \"\"});\n            }\n\n            var message = UIElementsFactory.TextField(\"conversation-item\", \"Line\", new[] {\"message\"}, null, null, true);\n            if (!create)\n                message.SetValueWithoutNotify(Lines[index].Line);\n\n            var branchPort = DlogPort.Create(\"Branch\", Orientation.Horizontal, Direction.Output, Port.Capacity.Single, PortType.Branch, true, EdgeConnectorListener);\n            branchPort.name = \"conversation-item\";\n            branchPort.AddToClassList(\"branch-port\");\n            var triggerPort = DlogPort.Create(\"Trigger\", Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, PortType.Trigger, false, EdgeConnectorListener);\n            triggerPort.name = \"conversation-item\";\n            triggerPort.AddToClassList(\"trigger-port\");\n\n            var flexBreak = UIElementsFactory.FlexBreaker();\n            if (create) {\n                Lines[index].PortGuidA = branchPort.viewDataKey;\n                Lines[index].PortGuidB = triggerPort.viewDataKey;\n            } else {\n                branchPort.viewDataKey = Lines[index].PortGuidA;\n                triggerPort.viewDataKey = Lines[index].PortGuidB;\n            }\n\n            message.RegisterCallback<FocusOutEvent>(evt => {\n                var lineIndex = Lines.FindIndex(data => data.PortGuidA == branchPort.viewDataKey);\n                if (message.value != Lines[lineIndex].Line) {\n                    Owner.EditorView.DlogObject.RegisterCompleteObjectUndo(\"Changed Dialogue Line\");\n                    Lines[lineIndex].Line = message.value;\n                }\n            });\n            var removeButton = UIElementsFactory.Button(\"x\", \"conversation-item\", \"Remove line\", new[] {\"remove-button\"}, () => { RemoveLine(Lines.FindIndex(data => data.PortGuidA == branchPort.viewDataKey)); });\n\n            conversationContainer.Add(message);\n            conversationContainer.Add(branchPort);\n            conversationContainer.Add(flexBreak);\n            conversationContainer.Add(removeButton);\n            conversationContainer.Add(triggerPort);\n\n            var separator = new VisualElement {name = \"divider\"};\n            separator.AddToClassList(\"horizontal\");\n            separator.AddToClassList(\"horizontal-divider\");\n            outputContainer.Add(separator);\n\n            outputContainer.Add(conversationContainer);\n            Ports.Add(branchPort);\n            Ports.Add(triggerPort);\n            if (create) {\n                Owner.PortData.Add(branchPort.viewDataKey);\n                Owner.PortData.Add(triggerPort.viewDataKey);\n                Owner.GuidPortDictionary.Add(branchPort.viewDataKey, branchPort);\n                Owner.GuidPortDictionary.Add(triggerPort.viewDataKey, triggerPort);\n            }\n\n            Refresh();\n        }\n\n        private void RemoveLine(int index) {\n            if (Lines.Count == 1)\n                lineLabel.RemoveFromClassList(\"visible\");\n            var container = outputContainer.Children().Where(element => element.name == \"conversation-container\").ToList()[index];\n            var separator = outputContainer.Children().Where(element => element.name == \"divider\" && element.ClassListContains(\"horizontal-divider\")).ToList()[index];\n            outputContainer.Remove(separator);\n\n            Owner.EditorView.DlogObject.RegisterCompleteObjectUndo(\"Removed Line\");\n            var edgesToRemove = Owner.EditorView.DlogObject.DlogGraph.Edges.Where(edge => edge.InputPort == Lines[index].PortGuidA || edge.OutputPort == Lines[index].PortGuidA).ToList();\n            edgesToRemove.AddRange(Owner.EditorView.DlogObject.DlogGraph.Edges.Where(edge => edge.InputPort == Lines[index].PortGuidB || edge.OutputPort == Lines[index].PortGuidB));\n            Owner.EditorView.DlogObject.DlogGraph.RemoveElements(new List<SerializedNode>(), edgesToRemove);\n            Owner.PortData.Remove(Lines[index].PortGuidA);\n            Owner.PortData.Remove(Lines[index].PortGuidB);\n            var portA = Owner.GuidPortDictionary[Lines[index].PortGuidA];\n            var portB = Owner.GuidPortDictionary[Lines[index].PortGuidB];\n            Owner.GuidPortDictionary.Remove(Lines[index].PortGuidA);\n            Owner.GuidPortDictionary.Remove(Lines[index].PortGuidB);\n            Ports.Remove(portA);\n            Ports.Remove(portB);\n            Lines.RemoveAt(index);\n            outputContainer.Remove(container);\n            Refresh();\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Nodes/SelfNode.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 86aadea30b7e406383c74d6a4f1323bb\ntimeCreated: 1602664809"
  },
  {
    "path": "Editor/Graph/Nodes.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 6aacdf43d48142e2991d013ac6530c86\ntimeCreated: 1601474215"
  },
  {
    "path": "Editor/Graph/Views/Blackboard/BlackboardPropertyView.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing DialogueGraph.Runtime;\nusing UnityEditor;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public class BlackboardPropertyView : VisualElement {\n        private readonly BlackboardField field;\n        private readonly EditorView editorView;\n        private AbstractProperty property;\n\n        private TextField referenceNameField;\n        public List<VisualElement> Rows { get; }\n\n        public int UndoGroup { get; private set; } = -1;\n\n        private static Type contextualMenuManipulator = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).FirstOrDefault(t => t.FullName == \"UnityEngine.UIElements.ContextualMenuManipulator\");\n        private IManipulator resetReferenceMenu;\n\n        public EventCallback<KeyDownEvent> KeyDownCallback { get; }\n\n        public EventCallback<FocusOutEvent> FocusOutCallback { get; }\n\n        public BlackboardPropertyView(BlackboardField field, EditorView editorView, AbstractProperty property) {\n            this.AddStyleSheet(\"Styles/PropertyView/Blackboard\");\n            this.field = field;\n            this.editorView = editorView;\n            this.property = property;\n            Rows = new List<VisualElement>();\n\n            KeyDownCallback = evt => {\n                // Record Undo for input field edit\n                if (UndoGroup == -1) {\n                    UndoGroup = Undo.GetCurrentGroup();\n                    editorView.DlogObject.RegisterCompleteObjectUndo(\"Change property value\");\n                }\n\n                // Handle escaping input field edit\n                if (evt.keyCode == KeyCode.Escape && UndoGroup > -1) {\n                    Undo.RevertAllDownToGroup(UndoGroup);\n                    UndoGroup = -1;\n                    evt.StopPropagation();\n                }\n\n                // Dont record Undo again until input field is unfocused\n                UndoGroup++;\n                MarkDirtyRepaint();\n            };\n\n            FocusOutCallback = evt => UndoGroup = -1;\n\n            BuildFields(property);\n            AddToClassList(\"blackboardPropertyView\");\n        }\n\n        private void BuildFields(AbstractProperty property) {\n            referenceNameField = new TextField(512, false, false, ' ') {isDelayed = true, value = property.ReferenceName};\n            referenceNameField.AddStyleSheet(\"Styles/PropertyView/ReferenceNameField\");\n            referenceNameField.RegisterValueChangedCallback(evt => {\n                editorView.DlogObject.RegisterCompleteObjectUndo(\"Change Reference Name\");\n                editorView.DlogObject.DlogGraph.SanitizePropertyReference(property, evt.newValue);\n                referenceNameField.value = property.ReferenceName;\n                if (string.IsNullOrEmpty(property.OverrideReferenceName))\n                    referenceNameField.RemoveFromClassList(\"modified\");\n                else\n                    referenceNameField.AddToClassList(\"modified\");\n\n                Rebuild();\n                UpdateReferenceNameResetMenu();\n            });\n            if (!string.IsNullOrEmpty(property.OverrideReferenceName))\n                referenceNameField.AddToClassList(\"modified\");\n\n            AddRow(\"Reference Name\", referenceNameField);\n        }\n\n        private void UpdateReferenceNameResetMenu() {\n            if (string.IsNullOrEmpty(property.OverrideReferenceName)) {\n                this.RemoveManipulator(resetReferenceMenu);\n                resetReferenceMenu = null;\n            } else {\n                resetReferenceMenu = (IManipulator) Activator.CreateInstance(contextualMenuManipulator, (Action<ContextualMenuPopulateEvent>) BuildContextualMenu);\n                this.AddManipulator(resetReferenceMenu);\n            }\n        }\n\n        private void BuildContextualMenu(ContextualMenuPopulateEvent evt) {\n            evt.menu.AppendAction(\"Reset Reference\", e => {\n                property.OverrideReferenceName = null;\n                referenceNameField.value = property.ReferenceName;\n                referenceNameField.RemoveFromClassList(\"modified\");\n            }, DropdownMenuAction.AlwaysEnabled);\n        }\n\n        public VisualElement AddRow(string labelText, VisualElement control, bool enabled = true) {\n            var rowView = CreateRow(labelText, control, enabled);\n            Add(rowView);\n            Rows.Add(rowView);\n            return rowView;\n        }\n\n        public void Rebuild() {\n            Rows.Where(t => t.parent == this).ToList().ForEach(Remove);\n            BuildFields(property);\n        }\n\n        private VisualElement CreateRow(string labelText, VisualElement control, bool enabled) {\n            var rowView = new VisualElement();\n            rowView.AddToClassList(\"rowView\");\n            if (!string.IsNullOrEmpty(labelText)) {\n                var label = new Label(labelText);\n                label.SetEnabled(enabled);\n                label.AddToClassList(\"rowViewLabel\");\n                rowView.Add(label);\n            }\n\n            control.AddToClassList(\"rowViewControl\");\n            control.SetEnabled(enabled);\n\n            rowView.Add(control);\n            return rowView;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Views/Blackboard/BlackboardPropertyView.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 10eb046d63d54e71b2a354f974cbc412\ntimeCreated: 1602594572"
  },
  {
    "path": "Editor/Graph/Views/Blackboard/BlackboardProvider.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\nusing DialogueGraph.Runtime;\nusing UnityEditor;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\nusing UnityEngine.UIElements;\nusing Node = UnityEditor.Experimental.GraphView.Node;\n\nnamespace DialogueGraph {\n    public class BlackboardProvider {\n        private static readonly Texture2D exposedIcon = Resources.Load<Texture2D>(\"GraphView/Nodes/BlackboardFieldExposed\");\n        public Blackboard Blackboard { get; private set; }\n        private readonly EditorView editorView;\n        private readonly Dictionary<string, BlackboardRow> inputRows;\n        private readonly BlackboardSection checkSection;\n        private readonly BlackboardSection triggerSection;\n        private readonly BlackboardSection actorSection;\n        private List<Node> selectedNodes = new List<Node>();\n\n        public Dictionary<string, bool> ExpandedInputs { get; } = new Dictionary<string, bool>();\n\n        public string AssetName {\n            get => Blackboard.title;\n            set => Blackboard.title = value;\n        }\n\n        public BlackboardProvider(EditorView editorView) {\n            this.editorView = editorView;\n            inputRows = new Dictionary<string, BlackboardRow>();\n            Blackboard = new Blackboard {\n                scrollable = true,\n                title = \"Properties\",\n                subTitle = \"Dialogue Graph\",\n                editTextRequested = EditTextRequested,\n                addItemRequested = AddItemRequested,\n                moveItemRequested = MoveItemRequested\n            };\n\n            checkSection = new BlackboardSection {title = \"Checks\"};\n            Blackboard.Add(checkSection);\n            triggerSection = new BlackboardSection {title = \"Triggers\"};\n            Blackboard.Add(triggerSection);\n            actorSection = new BlackboardSection {title = \"Actors\"};\n            Blackboard.Add(actorSection);\n        }\n\n        private void EditTextRequested(Blackboard blackboard, VisualElement visualElement, string newText) {\n            var field = (BlackboardField) visualElement;\n            var property = (AbstractProperty) field.userData;\n            if (!string.IsNullOrEmpty(newText) && newText != property.DisplayName) {\n                editorView.DlogObject.RegisterCompleteObjectUndo(\"Edit Property Name\");\n                property.DisplayName = newText;\n                editorView.DlogObject.DlogGraph.SanitizePropertyName(property);\n                field.text = property.DisplayName;\n                var modifiedNodes = editorView.DlogObject.DlogGraph.Nodes.Where(node => node.Node is PropertyNode propertyNode && propertyNode.PropertyGuid == property.GUID).Select(node => node.Node as PropertyNode);\n                foreach (var modifiedNode in modifiedNodes) {\n                    modifiedNode?.Update(property);\n                }\n            }\n        }\n\n        private void MoveItemRequested(Blackboard blackboard, int newIndex, VisualElement visualElement) {\n            if (!(visualElement.userData is AbstractProperty property))\n                return;\n\n            editorView.DlogObject.RegisterCompleteObjectUndo(\"Move Property\");\n            editorView.DlogObject.DlogGraph.MoveProperty(property, newIndex);\n        }\n\n        private void AddItemRequested(Blackboard blackboard) {\n            var menu = new GenericMenu();\n            menu.AddItem(new GUIContent($\"Check\"), false, () => AddInputRow(new CheckProperty(), true));\n            menu.AddItem(new GUIContent($\"Trigger\"), false, () => AddInputRow(new TriggerProperty(), true));\n            menu.AddItem(new GUIContent($\"Actor\"), false, () => AddInputRow(new ActorProperty(), true));\n            menu.ShowAsContext();\n        }\n\n        public void AddInputRow(AbstractProperty property, bool create = false, int index = -1) {\n            if (inputRows.ContainsKey(property.GUID))\n                return;\n\n            var section = property.Type == PropertyType.Actor ? actorSection : property.Type == PropertyType.Check ? checkSection : triggerSection;\n\n            if (create) {\n                editorView.DlogObject.DlogGraph.SanitizePropertyName(property);\n            }\n\n            var field = new BlackboardField(exposedIcon, property.DisplayName, property.Type.ToString()) {userData = property};\n            var row = new BlackboardRow(field, new BlackboardPropertyView(field, editorView, property)) {userData = property};\n            if (index < 0)\n                index = inputRows.Count;\n            if (index == inputRows.Count)\n                section.Add(row);\n            else\n                section.Insert(index, row);\n\n            var pill = row.Q<Pill>();\n            pill.RegisterCallback<MouseEnterEvent>(evt => OnMouseHover(evt, property));\n            pill.RegisterCallback<MouseLeaveEvent>(evt => OnMouseHover(evt, property));\n            pill.RegisterCallback<DragUpdatedEvent>(OnDragUpdatedEvent);\n\n            var expandButton = row.Q<Button>(\"expandButton\");\n            expandButton.RegisterCallback<MouseDownEvent>(evt => OnExpanded(evt, property), TrickleDown.TrickleDown);\n            inputRows[property.GUID] = row;\n            \n            if (!create)\n                return;\n            \n            row.expanded = true;\n            ExpandedInputs[property.GUID] = true;\n            editorView.DlogObject.RegisterCompleteObjectUndo(\"Create Property\");\n            editorView.DlogObject.DlogGraph.AddProperty(property);\n            field.OpenTextEditor();\n        }\n\n        private void OnExpanded(MouseDownEvent evt, AbstractProperty input) {\n            ExpandedInputs[input.GUID] = !inputRows[input.GUID].expanded;\n        }\n\n        private void OnMouseHover(EventBase evt, AbstractProperty input) {\n            if (evt.eventTypeId == MouseEnterEvent.TypeId()) {\n                foreach (var node in editorView.GraphView.nodes.ToList()) {\n                    if (node.viewDataKey == input.GUID) {\n                        selectedNodes.Add(node);\n                        node.AddToClassList(\"hovered\");\n                    }\n                }\n            } else if (evt.eventTypeId == MouseLeaveEvent.TypeId() && selectedNodes.Any()) {\n                foreach (var node in selectedNodes) {\n                    node.RemoveFromClassList(\"hovered\");\n                }\n\n                selectedNodes.Clear();\n            }\n        }\n\n        private void OnDragUpdatedEvent(DragUpdatedEvent evt) {\n            if (selectedNodes.Any()) {\n                foreach (var node in selectedNodes) {\n                    node.RemoveFromClassList(\"hovered\");\n                }\n\n                selectedNodes.Clear();\n            }\n        }\n\n        public void HandleChanges() {\n            foreach (var inputGuid in editorView.DlogObject.DlogGraph.RemovedProperties) {\n                if (!inputRows.TryGetValue(inputGuid.GUID, out var row))\n                    continue;\n\n                row.RemoveFromHierarchy();\n                inputRows.Remove(inputGuid.GUID);\n            }\n\n            foreach (var input in editorView.DlogObject.DlogGraph.AddedProperties)\n                AddInputRow(input, index: editorView.DlogObject.DlogGraph.Properties.IndexOf(input));\n\n            if (editorView.DlogObject.DlogGraph.MovedProperties.Any()) {\n                foreach (var row in inputRows.Values)\n                    row.RemoveFromHierarchy();\n\n                foreach (var property in editorView.DlogObject.DlogGraph.Properties)\n                    (property.Type == PropertyType.Actor ? actorSection : property.Type == PropertyType.Check ? checkSection : triggerSection).Add(inputRows[property.GUID]);\n            }\n\n            ExpandedInputs.Clear();\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Views/Blackboard/BlackboardProvider.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 181433fccd214f9390d7f42778f4d9aa\ntimeCreated: 1601568462"
  },
  {
    "path": "Editor/Graph/Views/Blackboard.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 2acfa4296e274da2b3b7d0cec23ea30f\ntimeCreated: 1602594556"
  },
  {
    "path": "Editor/Graph/Views/DlogEditorWindow.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Linq;\nusing UnityEditor;\nusing UnityEditor.UIElements;\nusing UnityEngine;\nusing UnityEngine.UIElements;\nusing Object = UnityEngine.Object;\n\nnamespace DialogueGraph {\n    public class DlogEditorWindow : EditorWindow {\n        private EditorView editorView;\n\n        private bool deleted;\n        private bool skipOnDestroyCheck;\n\n        public string SelectedAssetGuid { get; set; }\n\n        public DlogGraphObject GraphObject { get; private set; }\n\n        public DlogWindowEvents Events { get; private set; }\n\n        public bool IsDirty {\n            get {\n                if (deleted) return false;\n                if (GraphObject == null) return false;\n                var current = JsonUtility.ToJson(GraphObject.DlogGraph, true);\n                var saved = File.ReadAllText(AssetDatabase.GUIDToAssetPath(SelectedAssetGuid));\n                return !string.Equals(current, saved, StringComparison.Ordinal);\n            }\n        }\n\n        public void BuildWindow() {\n            rootVisualElement.Clear();\n            Events = new DlogWindowEvents {SaveRequested = SaveAsset, SaveAsRequested = SaveAs, ShowInProjectRequested = ShowInProject};\n\n            editorView = new EditorView(this) {\n                name = \"Dlog Graph\",\n                IsBlackboardVisible = GraphObject.IsBlackboardVisible\n            };\n            rootVisualElement.Add(editorView);\n            Refresh();\n        }\n\n        private void Update() {\n            if (focusedWindow == this && deleted) {\n                DisplayDeletedFromDiskDialog();\n            }\n\n            if (GraphObject == null && SelectedAssetGuid != null) {\n                var assetGuid = SelectedAssetGuid;\n                SelectedAssetGuid = null;\n                var newObject = DialogueGraphUtility.LoadGraphAtGuid(assetGuid);\n                SetDlogObject(newObject);\n                Refresh();\n            }\n\n            if (GraphObject == null) {\n                Close();\n                return;\n            }\n\n            if (editorView == null && GraphObject != null) {\n                BuildWindow();\n            }\n\n            if (editorView == null) {\n                Close();\n            }\n\n            var wasUndoRedoPerformed = GraphObject.WasUndoRedoPerformed;\n            if (wasUndoRedoPerformed) {\n                editorView.HandleChanges();\n                GraphObject.DlogGraph.ClearChanges();\n                GraphObject.HandleUndoRedo();\n            }\n\n            if (GraphObject.IsDirty || wasUndoRedoPerformed) {\n                UpdateTitle();\n                GraphObject.IsDirty = false;\n            }\n\n            editorView.HandleChanges();\n            GraphObject.DlogGraph.ClearChanges();\n        }\n\n        private void DisplayDeletedFromDiskDialog() {\n            bool shouldClose = true; // Close unless if the same file was replaced\n\n            if (EditorUtility.DisplayDialog(\"Dialogue Graph Missing\", $\"{AssetDatabase.GUIDToAssetPath(SelectedAssetGuid)} has been deleted or moved outside of Unity.\\n\\nWould you like to save your Graph Asset?\", \"Save As\", \"Close Window\")) {\n                shouldClose = !SaveAs();\n            }\n\n            if (shouldClose)\n                Close();\n            else\n                deleted = false; // Was restored\n        }\n\n        public void SetDlogObject(DlogGraphObject dlogObject) {\n            SelectedAssetGuid = dlogObject.AssetGuid;\n            GraphObject = dlogObject;\n        }\n\n        public void Refresh() {\n            UpdateTitle();\n\n            if (editorView == null) {\n                editorView = rootVisualElement.Q<EditorView>();\n            }\n\n            if (editorView == null) {\n                BuildWindow();\n            }\n\n            editorView.BuildGraph();\n        }\n\n        public void GraphDeleted() {\n            deleted = true;\n        }\n\n        private void UpdateTitle() {\n            var asset = AssetDatabase.LoadAssetAtPath<Object>(AssetDatabase.GUIDToAssetPath(SelectedAssetGuid));\n            titleContent.text = asset.name.Split('/').Last() + (IsDirty ? \"*\" : \"\");\n        }\n\n        private void OnEnable() {\n            this.SetAntiAliasing(4);\n        }\n\n        private void OnDestroy() {\n            if (!skipOnDestroyCheck && IsDirty && EditorUtility.DisplayDialog(\"Dialogue Graph has been modified\", \"Do you want to save the changes you made in the Dialogue Graph?\\nYour changes will be lost if you don't save them.\", \"Save\", \"Don't Save\")) {\n                SaveAsset();\n            }\n        }\n\n        #region Window Events\n        private void SaveAsset() {\n            GraphObject.DlogGraph.DialogueGraphVersion = DialogueGraphUtility.LatestVersion;\n            DialogueGraphUtility.SaveGraph(GraphObject);\n            UpdateTitle();\n        }\n\n        private bool SaveAs() {\n            if (!string.IsNullOrEmpty(SelectedAssetGuid) && GraphObject != null) {\n                var assetPath = AssetDatabase.GUIDToAssetPath(SelectedAssetGuid);\n                if (string.IsNullOrEmpty(assetPath) || GraphObject == null)\n                    return false;\n\n                var directoryPath = Path.GetDirectoryName(assetPath);\n                var savePath = EditorUtility.SaveFilePanelInProject(\"Save As...\", Path.GetFileNameWithoutExtension(assetPath), DlogGraphImporter.Extension, \"\", directoryPath);\n                savePath = savePath.Replace(Application.dataPath, \"Assets\");\n                if (savePath != directoryPath) {\n                    if (!string.IsNullOrEmpty(savePath)) {\n                        if (DialogueGraphUtility.CreateFile(savePath, GraphObject)) {\n                            GraphObject.RecalculateAssetGuid(savePath);\n                            DlogGraphImporterEditor.OpenEditorWindow(savePath);\n                        }\n                    }\n\n                    GraphObject.IsDirty = false;\n                    return false;\n                }\n\n                SaveAsset();\n                GraphObject.IsDirty = false;\n                return true;\n            }\n\n            return false;\n        }\n\n        private void ShowInProject() {\n            if (string.IsNullOrEmpty(SelectedAssetGuid)) return;\n\n            var path = AssetDatabase.GUIDToAssetPath(SelectedAssetGuid);\n            var asset = AssetDatabase.LoadAssetAtPath<Object>(path);\n            EditorGUIUtility.PingObject(asset);\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "Editor/Graph/Views/DlogEditorWindow.cs.meta",
    "content": "fileFormatVersion: 2\nguid: e93a505429977a248b411e4eff69e2ee\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Graph/Views/DlogGraphView.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing UnityEditor;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEngine;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public class DlogGraphView : GraphView {\n        public EditorView EditorView { get; }\n\n        public DlogGraphData DlogGraph => EditorView.DlogObject.DlogGraph;\n\n        public DlogGraphView(EditorView editorView) {\n            EditorView = editorView;\n            RegisterCallback<DragUpdatedEvent>(OnDragUpdated);\n            RegisterCallback<DragPerformEvent>(OnDragPerformed);\n            serializeGraphElements = SerializeGraphElementsImpl;\n            unserializeAndPaste = UnserializeAndPasteImpl;\n            deleteSelection = DeleteSelectionImpl;\n        }\n\n        protected override bool canCopySelection => selection.OfType<AbstractNode>().Any() || selection.OfType<Group>().Any() || selection.OfType<BlackboardField>().Any();\n\n        private void UnserializeAndPasteImpl(string operation, string data) {\n            EditorView.DlogObject.RegisterCompleteObjectUndo(operation);\n            var copyPasteData = CopyPasteData.FromJson(data);\n            this.InsertCopyPasteData(copyPasteData);\n        }\n\n        private string SerializeGraphElementsImpl(IEnumerable<GraphElement> elements) {\n            var elementsList = elements.ToList();\n            var nodes = elementsList.OfType<AbstractNode>().Select(x => x.Owner);\n            var edges = elementsList.OfType<Edge>().Select(x => x.userData).OfType<SerializedEdge>();\n            var properties = selection.OfType<BlackboardField>().Select(x => x.userData as AbstractProperty);\n\n            // Collect the property nodes and get the corresponding properties\n            var propertyNodeGuids = nodes.OfType<PropertyNode>().Select(x => x.PropertyGuid);\n            var metaProperties = EditorView.DlogObject.DlogGraph.Properties.Where(x => propertyNodeGuids.Contains(x.GUID));\n\n            var copyPasteData = new CopyPasteData(EditorView, nodes, edges, properties, metaProperties);\n            return JsonUtility.ToJson(copyPasteData, true);\n        }\n\n        public override void BuildContextualMenu(ContextualMenuPopulateEvent evt) {\n            base.BuildContextualMenu(evt);\n            evt.menu.AppendSeparator();\n            if (evt.target is Node || evt.target is StickyNote) {\n                // TODO: GROUP\n                evt.menu.AppendAction(\"Group Selection %g\", _ => { }, actionStatusCallback => DropdownMenuAction.Status.Disabled);\n\n                // TODO: UNGROUP\n                evt.menu.AppendAction(\"Ungroup Selection %u\", _ => { }, actionStatusCallback => DropdownMenuAction.Status.Disabled);\n            }\n\n            if (evt.target is BlackboardField) {\n                evt.menu.AppendAction(\"Delete\", _ => { DeleteSelectionImpl(\"Delete\", AskUser.DontAskUser); }, actionStatusCallback => canDeleteSelection ? DropdownMenuAction.Status.Normal : DropdownMenuAction.Status.Disabled);\n            }\n        }\n\n        public override List<Port> GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter) {\n            var compatiblePorts = new List<Port>();\n            ports.ForEach(port => {\n                if (startPort != port /*&& startPort.node != port.node*/ && port.direction != startPort.direction && (startPort as DlogPort).IsCompatibleWith(port as DlogPort)) {\n                    compatiblePorts.Add(port);\n                }\n            });\n            return compatiblePorts;\n        }\n\n        private void DeleteSelectionImpl(string operation, AskUser askUser) {\n            var nodesToDelete = selection.OfType<AbstractNode>().Select(node => node.Owner);\n            EditorView.DlogObject.RegisterCompleteObjectUndo(operation);\n            EditorView.DlogObject.DlogGraph.RemoveElements(nodesToDelete.ToList(),\n                selection.OfType<Edge>().Select(e => e.userData).OfType<SerializedEdge>().ToList());\n            \n            \n            foreach (var selectable in selection) {\n                if (!(selectable is BlackboardField field) || field.userData == null)\n                    continue;\n                var property = (AbstractProperty) field.userData;\n                EditorView.DlogObject.DlogGraph.RemoveProperty(property);\n            }\n            \n            selection.Clear();\n        }\n\n        #region Drag & Drop\n        private void OnDragUpdated(DragUpdatedEvent evt) {\n            var selection = DragAndDrop.GetGenericData(\"DragSelection\") as List<ISelectable>;\n            var dragging = false;\n            if (selection != null)\n                if (selection.OfType<BlackboardField>().Any())\n                    dragging = true;\n\n            if (dragging) {\n                DragAndDrop.visualMode = DragAndDropVisualMode.Generic;\n            }\n        }\n\n        private void OnDragPerformed(DragPerformEvent evt) {\n            Vector2 localPos = (evt.currentTarget as VisualElement).ChangeCoordinatesTo(this.contentViewContainer, evt.localMousePosition);\n\n            var selection = DragAndDrop.GetGenericData(\"DragSelection\") as List<ISelectable>;\n            if (selection != null) {\n                // Blackboard\n                if (selection.OfType<BlackboardField>().Any()) {\n                    var fields = selection.OfType<BlackboardField>();\n                    foreach (var field in fields) {\n                        CreateNode(field, localPos);\n                    }\n                }\n            }\n        }\n\n        private void CreateNode(object obj, Vector2 nodePosition) {\n            if (obj is BlackboardField blackboardField) {\n                EditorView.DlogObject.RegisterCompleteObjectUndo(\"Drag Blackboard Field\");\n                var property = blackboardField.userData as AbstractProperty;\n                var node = new SerializedNode(typeof(PropertyNode), new Rect(nodePosition, EditorView.DefaultNodeSize));\n                EditorView.DlogObject.DlogGraph.AddNode(node);\n                node.BuildNode(EditorView, EditorView.EdgeConnectorListener, false);\n                var propertyNode = node.Node as PropertyNode;\n                propertyNode.PropertyGuid = property.GUID;\n                node.BuildPortData();\n            }\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "Editor/Graph/Views/DlogGraphView.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 3a9050fcf358d544498b82a8536f4c82\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Graph/Views/DlogWindowEvents.cs",
    "content": "using System;\n\nnamespace DialogueGraph {\n    public class DlogWindowEvents {\n        public Action SaveRequested;\n        public Func<bool> SaveAsRequested;\n        public Action ShowInProjectRequested;\n    }\n}"
  },
  {
    "path": "Editor/Graph/Views/DlogWindowEvents.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 27bb48f0da2c4f3da96d42285852c486\ntimeCreated: 1601297810"
  },
  {
    "path": "Editor/Graph/Views/EdgeConnectorListener.cs",
    "content": "using System.Collections.Generic;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEditor.Searcher;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    public class EdgeConnectorListener : IEdgeConnectorListener {\n        private EditorView editorView;\n        private SearchWindowProvider searchWindowProvider;\n        private GraphViewChange graphViewChange;\n        private List<Edge> edgesToCreate;\n        private List<GraphElement> edgesToDelete;\n\n        public EdgeConnectorListener(EditorView editorView, SearchWindowProvider searchWindowProvider) {\n            this.editorView = editorView;\n            this.searchWindowProvider = searchWindowProvider;\n            edgesToCreate = new List<Edge>();\n            edgesToDelete = new List<GraphElement>();\n            graphViewChange.edgesToCreate = edgesToCreate;\n        }\n\n        public void OnDropOutsidePort(Edge edge, Vector2 position) {\n            var port = edge.output?.edgeConnector.edgeDragHelper.draggedPort ?? edge.input?.edgeConnector.edgeDragHelper.draggedPort;\n            searchWindowProvider.ConnectedPort = port;\n            searchWindowProvider.RegenerateEntries = true;\n            SearcherWindow.Show(editorView.EditorWindow, searchWindowProvider.LoadSearchWindow(), item => searchWindowProvider.OnSelectEntry(item, position), position, null);\n            searchWindowProvider.RegenerateEntries = true;\n        }\n\n        public void OnDrop(GraphView graphView, Edge edge) {\n            if(editorView.DlogObject.DlogGraph.HasEdge(edge)) return;\n            editorView.DlogObject.RegisterCompleteObjectUndo(\"Connect edge\");\n            editorView.DlogObject.DlogGraph.AddEdge(edge);\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Views/EdgeConnectorListener.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 46ff9171b1404674a3d78ef287c8bd46\ntimeCreated: 1601564609"
  },
  {
    "path": "Editor/Graph/Views/EditorView.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing UnityEditor;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEditor.Searcher;\nusing UnityEngine;\nusing UnityEngine.UIElements;\nusing Object = UnityEngine.Object;\n\nnamespace DialogueGraph {\n    public class EditorView : VisualElement, IDisposable {\n        public static readonly Vector2 DefaultNodeSize = new Vector2(200, 150);\n        public static readonly Rect DefaultNodePosition = new Rect(Vector2.zero, DefaultNodeSize);\n\n        private readonly BlackboardProvider blackboardProvider;\n        private SearchWindowProvider searchWindowProvider;\n\n        public bool IsBlackboardVisible {\n            get => blackboardProvider.Blackboard.style.display == DisplayStyle.Flex;\n            set => blackboardProvider.Blackboard.style.display = value ? DisplayStyle.Flex : DisplayStyle.None;\n        }\n\n        public DlogEditorWindow EditorWindow { get; }\n\n        public DlogGraphObject DlogObject => EditorWindow.GraphObject;\n\n        public DlogGraphView GraphView { get; }\n\n        public EdgeConnectorListener EdgeConnectorListener { get; }\n\n        public EditorView(DlogEditorWindow editorWindow) {\n            EditorWindow = editorWindow;\n            this.AddStyleSheet(\"Styles/Graph\");\n            \n            \n            var toolbar = new IMGUIContainer(() => {\n                GUILayout.BeginHorizontal(EditorStyles.toolbar);\n                if (GUILayout.Button(\"Save Graph\", EditorStyles.toolbarButton)) {\n                    EditorWindow.Events.SaveRequested?.Invoke();\n                }\n                GUILayout.Space(6);\n                if (GUILayout.Button(\"Save As...\", EditorStyles.toolbarButton)) {\n                    EditorWindow.Events.SaveAsRequested?.Invoke();\n                }\n                GUILayout.Space(6);\n                if (GUILayout.Button(\"Show In Project\", EditorStyles.toolbarButton)) {\n                    EditorWindow.Events.ShowInProjectRequested?.Invoke();\n                }\n\n                GUILayout.FlexibleSpace();\n                IsBlackboardVisible = GUILayout.Toggle(IsBlackboardVisible, \"Blackboard\", EditorStyles.toolbarButton);\n                editorWindow.GraphObject.IsBlackboardVisible = IsBlackboardVisible;\n\n                GUILayout.EndHorizontal();\n            });\n            \n            Add(toolbar);\n            var content = new VisualElement {name=\"content\"};\n            {\n                GraphView = new DlogGraphView(this);\n                GraphView.SetupZoom(0.05f, 8f);\n                GraphView.AddManipulator(new ContentDragger());\n                GraphView.AddManipulator(new SelectionDragger());\n                GraphView.AddManipulator(new RectangleSelector());\n                GraphView.AddManipulator(new ClickSelector());\n                GraphView.RegisterCallback<KeyDownEvent>(OnKeyDown);\n                content.Add(GraphView);\n\n                var grid = new GridBackground();\n                GraphView.Insert(0, grid);\n                grid.StretchToParentSize();\n\n                blackboardProvider = new BlackboardProvider(this);\n                GraphView.Add(blackboardProvider.Blackboard);\n\n                GraphView.graphViewChanged += OnGraphViewChanged;\n            }\n            \n            searchWindowProvider = ScriptableObject.CreateInstance<SearchWindowProvider>();\n            searchWindowProvider.Initialize(EditorWindow, this);\n\n            GraphView.nodeCreationRequest = ctx => {\n                searchWindowProvider.ConnectedPort = null;\n                SearcherWindow.Show(editorWindow, searchWindowProvider.LoadSearchWindow(),\n                    item => searchWindowProvider.OnSelectEntry(item, ctx.screenMousePosition - editorWindow.position.position),\n                    ctx.screenMousePosition - editorWindow.position.position, null);\n            };\n            EdgeConnectorListener = new EdgeConnectorListener(this, searchWindowProvider);\n            \n            Add(content);\n        }\n\n        private GraphViewChange OnGraphViewChanged(GraphViewChange graphViewChange) {\n            if (graphViewChange.movedElements != null) {\n                EditorWindow.GraphObject.RegisterCompleteObjectUndo(\"Moved elements\");\n                foreach (var node in graphViewChange.movedElements.OfType<AbstractNode>()) {\n                    var rect = node.parent.ChangeCoordinatesTo(GraphView.contentViewContainer, node.GetPosition());\n                    node.Owner.DrawState.Position = rect;\n                }\n            }\n\n            if (graphViewChange.edgesToCreate != null) {\n                EditorWindow.GraphObject.RegisterCompleteObjectUndo(\"Created edges\");\n                foreach (var edge in graphViewChange.edgesToCreate) {\n                    DlogObject.DlogGraph.AddEdge(edge);\n                }\n                graphViewChange.edgesToCreate.Clear();\n            }\n\n            if (graphViewChange.elementsToRemove != null) {\n                EditorWindow.GraphObject.RegisterCompleteObjectUndo(\"Removed elements\");\n                foreach (var node in graphViewChange.elementsToRemove.OfType<AbstractNode>()) {\n                    DlogObject.DlogGraph.RemoveNode(node.Owner);\n                }\n\n                foreach (var edge in graphViewChange.elementsToRemove.OfType<Edge>()) {\n                    DlogObject.DlogGraph.RemoveEdge((SerializedEdge)edge.userData);\n                }\n\n                foreach (var property in graphViewChange.elementsToRemove.OfType<BlackboardField>()) {\n                    DlogObject.DlogGraph.RemoveProperty(property.userData as AbstractProperty);\n                }\n            }\n\n            return graphViewChange;\n        }\n\n        private void OnKeyDown(KeyDownEvent evt) {\n            if (evt.actionKey && evt.keyCode == KeyCode.G) {\n                if (GraphView.selection.OfType<GraphElement>().Any()) {\n                    // TODO: GROUP\n                }\n            }\n\n            if (evt.actionKey && evt.keyCode == KeyCode.U) {\n                if (GraphView.selection.OfType<GraphElement>().Any()) {\n                    // TODO: UNGROUP\n                }\n            }\n        }\n\n        public void BuildGraph() {\n            // Remove existing elements\n            GraphView.graphElements.ToList().OfType<Node>().ToList().ForEach(GraphView.RemoveElement);\n            GraphView.graphElements.ToList().OfType<Edge>().ToList().ForEach(GraphView.RemoveElement);\n            GraphView.graphElements.ToList().OfType<Group>().ToList().ForEach(GraphView.RemoveElement);\n            GraphView.graphElements.ToList().OfType<StickyNote>().ToList().ForEach(GraphView.RemoveElement);\n            GraphView.graphElements.ToList().OfType<BlackboardRow>().ToList().ForEach(GraphView.RemoveElement);\n\n            // Create & add graph elements\n            DlogObject.DlogGraph.Nodes.ForEach(node => AddNode(node));\n            DlogObject.DlogGraph.Edges.ForEach(AddEdge);\n            DlogObject.DlogGraph.Properties.ForEach(AddProperty);\n        }\n\n        public void HandleChanges() {\n\n            if(DlogObject.DlogGraph.AddedProperties.Any() || DlogObject.DlogGraph.RemovedProperties.Any())\n                searchWindowProvider.RegenerateEntries = true;\n            blackboardProvider.HandleChanges();\n            \n            foreach (var removedNode in DlogObject.DlogGraph.RemovedNodes) {\n                RemoveNode(removedNode);\n            }\n            foreach (var removedEdge in DlogObject.DlogGraph.RemovedEdges) {\n                RemoveEdge(removedEdge);\n            }\n\n            foreach (var addedNode in DlogObject.DlogGraph.AddedNodes) {\n                AddNode(addedNode);\n            }\n            foreach (var addedEdge in DlogObject.DlogGraph.AddedEdges) {\n                AddEdge(addedEdge);\n            }\n            \n            foreach (var queuedNode in DlogObject.DlogGraph.NodeSelectionQueue) {\n                GraphView.AddToSelection(queuedNode.Node);\n            }\n            foreach (var queuedEdge in DlogObject.DlogGraph.EdgeSelectionQueue) {\n                GraphView.AddToSelection(queuedEdge.Edge);\n            }\n        }\n\n        public void AddNode(SerializedNode nodeToAdd) {\n            nodeToAdd.BuildNode(this, EdgeConnectorListener);\n            GraphView.AddElement(nodeToAdd.Node);\n        }\n\n        public void RemoveNode(SerializedNode nodeToRemove) {\n            if(nodeToRemove.Node != null)\n                GraphView.RemoveElement(nodeToRemove.Node);\n            else {\n                var view = GraphView.GetNodeByGuid(nodeToRemove.GUID);\n                if(view != null)\n                    GraphView.RemoveElement(view);\n            }\n        }\n\n        public void AddEdge(SerializedEdge edgeToAdd) {\n            edgeToAdd.BuildEdge(this);\n            GraphView.AddElement(edgeToAdd.Edge);\n        }\n\n        public void RemoveEdge(SerializedEdge edgeToRemove) {\n            if (edgeToRemove.Edge != null) {\n                edgeToRemove.Edge.input?.Disconnect(edgeToRemove.Edge);\n                edgeToRemove.Edge.output?.Disconnect(edgeToRemove.Edge);\n                GraphView.RemoveElement(edgeToRemove.Edge);\n            }\n        }\n\n        public void AddProperty(AbstractProperty property) {\n            blackboardProvider.AddInputRow(property);\n        }\n\n        public void Dispose() {\n            if (searchWindowProvider != null) {\n                Object.DestroyImmediate(searchWindowProvider);\n                searchWindowProvider = null;\n            }\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Views/EditorView.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 572759720403428aa5086f2808ffea59\ntimeCreated: 1601626257"
  },
  {
    "path": "Editor/Graph/Views/SearchWindow/SearchWindowAdapter.cs",
    "content": "using System.Collections.Generic;\nusing UnityEditor.Searcher;\nusing UnityEngine;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public class SearchWindowAdapter : SearcherAdapter {\n        public override bool HasDetailsPanel => false;\n\n        public SearchWindowAdapter(string title) : base(title) {\n        }\n    }\n\n    internal class SearchNodeItem : SearcherItem {\n        public SearchWindowProvider.NodeEntry NodeEntry;\n        public SearchNodeItem(string name, SearchWindowProvider.NodeEntry nodeEntry, string help = \"\", List<SearchNodeItem> children = null) : base(name) {\n            NodeEntry = nodeEntry;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Views/SearchWindow/SearchWindowAdapter.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 564509ea00d04e5d874a991b5ddf92f8\ntimeCreated: 1601478183"
  },
  {
    "path": "Editor/Graph/Views/SearchWindow/SearchWindowProvider.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing UnityEditor;\nusing UnityEditor.Experimental.GraphView;\nusing UnityEditor.Searcher;\nusing UnityEngine;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public class SearchWindowProvider : ScriptableObject {\n        private DlogEditorWindow editorWindow;\n        private EditorView editorView;\n        private Texture2D icon;\n        public List<NodeEntry> CurrentNodeEntries;\n        public Port ConnectedPort;\n        public bool RegenerateEntries { get; set; }\n\n        public void Initialize(DlogEditorWindow editorWindow, EditorView editorView) {\n            this.editorWindow = editorWindow;\n            this.editorView = editorView;\n\n            GenerateNodeEntries();\n            icon = new Texture2D(1, 1);\n            icon.SetPixel(0, 0, new Color(0, 0, 0, 0));\n            icon.Apply();\n        }\n\n        private void OnDestroy() {\n            if (icon != null) {\n                DestroyImmediate(icon);\n                icon = null;\n            }\n        }\n\n        public void GenerateNodeEntries() {\n            // First build up temporary data structure containing group & title as an array of strings (the last one is the actual title) and associated node type.\n            var nodeEntries = new List<NodeEntry>();\n            foreach (var type in TypeCache.GetTypesDerivedFrom<AbstractNode>()) {\n                if (!type.IsClass || type.IsAbstract)\n                    continue;\n\n                if (type.GetCustomAttributes(typeof(TitleAttribute), false) is TitleAttribute[] attrs && attrs.Length > 0) {\n                    foreach (var attr in attrs) {\n                        AddEntries(type, attr.Title, nodeEntries);\n                    }\n                }\n            }\n\n            foreach (var property in editorView.DlogObject.DlogGraph.Properties) {\n                var node = new SerializedNode(typeof(PropertyNode), new Rect(Vector2.zero, EditorView.DefaultNodeSize));\n                node.BuildNode(editorView, editorView.EdgeConnectorListener, false);\n                var propertyNode = node.Node as PropertyNode;\n                propertyNode.PropertyGuid = property.GUID;\n                node.BuildPortData();\n                AddEntries(node, new[] {\"Properties\", $\"{property.Type}: {property.DisplayName}\"}, nodeEntries);\n            }\n\n            nodeEntries.Sort((entry1, entry2) => {\n                for (var i = 0; i < entry1.Title.Length; i++) {\n                    if (i >= entry2.Title.Length)\n                        return 1;\n                    var value = string.Compare(entry1.Title[i], entry2.Title[i], StringComparison.Ordinal);\n                    if (value == 0)\n                        continue;\n\n                    // Make sure that leaves go before nodes\n                    if (entry1.Title.Length != entry2.Title.Length && (i == entry1.Title.Length - 1 || i == entry2.Title.Length - 1)) {\n                        //once nodes are sorted, sort slot entries by slot order instead of alphebetically\n                        var alphaOrder = entry1.Title.Length < entry2.Title.Length ? -1 : 1;\n                        var slotOrder = entry1.CompatiblePortIndex.CompareTo(entry2.CompatiblePortIndex);\n                        return alphaOrder.CompareTo(slotOrder);\n                    }\n\n                    return value;\n                }\n\n                return 0;\n            });\n\n            CurrentNodeEntries = nodeEntries;\n        }\n\n        private void AddEntries(SerializedNode node, string[] title, List<NodeEntry> nodeEntries) {\n            if (ConnectedPort == null) {\n                nodeEntries.Add(new NodeEntry(node, title, -1, null));\n                return;\n            }\n\n            var portIndices = new List<int>();\n            for (var i = 0; i < node.Node.Ports.Count; i++) {\n                if ((ConnectedPort as DlogPort).IsCompatibleWith(node.Node.Ports[i] as DlogPort) && ConnectedPort.direction != node.Node.Ports[i].direction) {\n                    portIndices.Add(i);\n                }\n            }\n\n            foreach (var portIndex in portIndices) {\n                var newTitle = new string[title.Length];\n                for (int i = 0; i < title.Length - 1; i++)\n                    newTitle[i] = title[i];\n\n                newTitle[title.Length - 1] = title[title.Length - 1];\n                if (!string.IsNullOrEmpty(node.Node.Ports[portIndex].portName))\n                    newTitle[title.Length - 1] += $\" ({node.Node.Ports[portIndex].portName})\";\n\n                nodeEntries.Add(new NodeEntry(node, newTitle, portIndex, node.Node.Ports[portIndex].capacity));\n            }\n        }\n\n        private void AddEntries(Type nodeType, string[] title, List<NodeEntry> nodeEntries) {\n            if (ConnectedPort == null) {\n                nodeEntries.Add(new NodeEntry(nodeType, title, -1, null));\n                return;\n            }\n\n            var node = (AbstractNode) Activator.CreateInstance(nodeType);\n            node.InitializeNode(null);\n            var portIndices = new List<int>();\n            for (var i = 0; i < node.Ports.Count; i++) {\n                if ((ConnectedPort as DlogPort).IsCompatibleWith(node.Ports[i] as DlogPort) && ConnectedPort.direction != node.Ports[i].direction) {\n                    portIndices.Add(i);\n                }\n            }\n\n            foreach (var portIndex in portIndices) {\n                var newTitle = new string[title.Length];\n                for (int i = 0; i < title.Length - 1; i++)\n                    newTitle[i] = title[i];\n                newTitle[title.Length - 1] = title[title.Length - 1] + $\" ({node.Ports[portIndex].portName})\";\n\n                nodeEntries.Add(new NodeEntry(nodeType, newTitle, portIndex, node.Ports[portIndex].capacity));\n            }\n        }\n\n        public Searcher LoadSearchWindow() {\n            if (RegenerateEntries) {\n                GenerateNodeEntries();\n                RegenerateEntries = false;\n            }\n\n            //create empty root for searcher tree\n            var root = new List<SearcherItem>();\n            var dummyEntry = new NodeEntry();\n\n            foreach (var nodeEntry in CurrentNodeEntries) {\n                SearcherItem parent = null;\n                for (int i = 0; i < nodeEntry.Title.Length; i++) {\n                    var pathEntry = nodeEntry.Title[i];\n                    var children = parent != null ? parent.Children : root;\n                    var item = children.Find(x => x.Name == pathEntry);\n\n                    if (item == null) {\n                        //if we don't have slot entries and are at a leaf, add userdata to the entry\n                        if (i == nodeEntry.Title.Length - 1)\n                            item = new SearchNodeItem(pathEntry, nodeEntry);\n\n                        //if we aren't a leaf, don't add user data\n                        else\n                            item = new SearchNodeItem(pathEntry, dummyEntry);\n\n                        if (parent != null) {\n                            parent.AddChild(item);\n                        } else {\n                            children.Add(item);\n                        }\n                    }\n\n                    parent = item;\n\n                    if (parent.Depth == 0 && !root.Contains(parent))\n                        root.Add(parent);\n                }\n            }\n\n            var nodeDatabase = SearcherDatabase.Create(root, string.Empty, false);\n\n            return new Searcher(nodeDatabase, new SearchWindowAdapter(\"Create Node\"));\n        }\n\n        public bool OnSelectEntry(SearcherItem selectedEntry, Vector2 mousePosition) {\n            if (selectedEntry == null || ((selectedEntry as SearchNodeItem).NodeEntry.Type == null && (selectedEntry as SearchNodeItem).NodeEntry.Node == null)) {\n                return false;\n            }\n\n            var nodeEntry = (selectedEntry as SearchNodeItem).NodeEntry;\n            var windowMousePosition = editorWindow.rootVisualElement.ChangeCoordinatesTo(editorWindow.rootVisualElement.parent, mousePosition);\n            var graphMousePosition = editorView.GraphView.contentViewContainer.WorldToLocal(windowMousePosition);\n\n            SerializedNode node;\n            if (nodeEntry.Node != null) {\n                node = nodeEntry.Node;\n                node.DrawState.Position.position = graphMousePosition;\n            } else {\n                var nodeType = nodeEntry.Type;\n                node = new SerializedNode(nodeType, new Rect(graphMousePosition, EditorView.DefaultNodeSize));\n            }\n\n            editorView.DlogObject.RegisterCompleteObjectUndo(\"Add \" + node.Type);\n            editorView.DlogObject.DlogGraph.AddNode(node);\n\n            if (ConnectedPort != null) {\n                if (nodeEntry.Node == null)\n                    node.BuildNode(editorView, null);\n                var edge = new SerializedEdge {\n                    Output = ConnectedPort.node.viewDataKey,\n                    Input = node.GUID,\n                    OutputPort = ConnectedPort.viewDataKey,\n                    InputPort = node.PortData[nodeEntry.CompatiblePortIndex],\n                    OutputCapacity =  ConnectedPort.capacity,\n                    InputCapacity = nodeEntry.Capacity.Value\n                };\n                editorView.DlogObject.DlogGraph.AddEdge(edge);\n            }\n\n            return true;\n        }\n\n        public struct NodeEntry : IEquatable<NodeEntry> {\n            public readonly Type Type;\n            public readonly string[] Title;\n            public readonly int CompatiblePortIndex;\n            public SerializedNode Node;\n            public Port.Capacity? Capacity;\n\n            public NodeEntry(Type type, string[] title, int compatiblePortIndex, Port.Capacity? capacity) {\n                Type = type;\n                Title = title;\n                CompatiblePortIndex = compatiblePortIndex;\n                Capacity = capacity;\n                Node = null;\n            }\n\n            public NodeEntry(SerializedNode node, string[] title, int compatiblePortIndex, Port.Capacity? capacity) {\n                Node = node;\n                Title = title;\n                CompatiblePortIndex = compatiblePortIndex;\n                Type = Type.GetType(node.Type);\n                Capacity = capacity;\n            }\n\n            public bool Equals(NodeEntry other) {\n                return Equals(Title, other.Title) && Type == other.Type;\n            }\n\n            public override bool Equals(object obj) {\n                return obj is NodeEntry other && Equals(other);\n            }\n\n            public override int GetHashCode() {\n                unchecked {\n                    return ((Title != null ? Title.GetHashCode() : 0) * 397) ^ (Type != null ? Type.GetHashCode() : 0);\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Editor/Graph/Views/SearchWindow/SearchWindowProvider.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: d2d7d0597fd64ac089539a71b4d5702d\ntimeCreated: 1601476987"
  },
  {
    "path": "Editor/Graph/Views/SearchWindow.meta",
    "content": "﻿fileFormatVersion: 2\nguid: ab683c8c51924f138863ce1098ecffbe\ntimeCreated: 1605080656"
  },
  {
    "path": "Editor/Graph/Views.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 21cf724c72aa400a856f5d764b87963b\ntimeCreated: 1601551864"
  },
  {
    "path": "Editor/Graph.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 55415ce1507e4265ab94f5c6cd942057\ntimeCreated: 1601473790"
  },
  {
    "path": "Editor/Importers/DlogGraphAssetPostProcessor.cs",
    "content": "using System;\nusing System.Linq;\nusing UnityEditor;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    public class DlogGraphAssetPostprocessor : AssetPostprocessor {\n        private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) {\n            var anyRemovedAssets = deletedAssets.Any(path => path.EndsWith(DlogGraphImporter.Extension, StringComparison.InvariantCultureIgnoreCase));\n            if (anyRemovedAssets)\n                DisplayDeletionDialog(deletedAssets);\n        }\n\n        private static void DisplayDeletionDialog(string[] deletedAssets) {\n            var windows = Resources.FindObjectsOfTypeAll<DlogEditorWindow>();\n            foreach (var window in windows) {\n                foreach (var asset in deletedAssets) {\n                    if (window.SelectedAssetGuid == AssetDatabase.AssetPathToGUID(asset)) {\n                        window.GraphDeleted();\n                    }\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Editor/Importers/DlogGraphAssetPostProcessor.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: f1ac861000a84b9fa1022dc691fb39ec\ntimeCreated: 1601487407"
  },
  {
    "path": "Editor/Importers/DlogGraphImporter.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing DialogueGraph.Runtime;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor;\nusing UnityEditor.AssetImporters;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    [ScriptedImporter(0, Extension, 3)]\n    public class DlogGraphImporter : ScriptedImporter {\n        public const string Extension = \"dlog\";\n\n        public override void OnImportAsset(AssetImportContext ctx) {\n            try {\n                var dlogObject = DialogueGraphUtility.LoadGraphAtPath(ctx.assetPath);\n                var icon = Resources.Load<Texture2D>(ResourcesUtility.IconBig);\n                var runtimeIcon = Resources.Load<Texture2D>(ResourcesUtility.RuntimeIconBig);\n\n                if (string.IsNullOrEmpty(dlogObject.AssetGuid) || dlogObject.AssetGuid != AssetDatabase.AssetPathToGUID(ctx.assetPath)) {\n                    dlogObject.RecalculateAssetGuid(ctx.assetPath);\n                    DialogueGraphUtility.SaveGraph(dlogObject, false);\n                }\n\n                ctx.AddObjectToAsset(\"EditorGraph\", dlogObject, icon);\n                dlogObject.hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector | HideFlags.NotEditable;\n\n                var runtimeObject = ScriptableObject.CreateInstance<DlogObject>();\n                var filePath = ctx.assetPath;\n                var assetNameSubStartIndex = filePath.LastIndexOf('/') + 1;\n                var assetNameSubEndIndex = filePath.LastIndexOf('.');\n                var assetName = filePath.Substring(assetNameSubStartIndex, assetNameSubEndIndex - assetNameSubStartIndex);\n                runtimeObject.name = assetName + \" (Runtime)\";\n\n                // Add properties\n                runtimeObject.Properties = new List<Property>();\n                runtimeObject.Properties.AddRange(dlogObject.DlogGraph.Properties.Select(\n                                                      property =>\n                                                          new Property {\n                                                              Type = property.Type, DisplayName = property.DisplayName, ReferenceName = property.ReferenceName, Guid = property.GUID\n                                                          }\n                                                  ));\n\n                // Add nodes\n                runtimeObject.Nodes = new List<Node>();\n                foreach (var node in dlogObject.DlogGraph.Nodes) {\n                    var nodeData = JObject.Parse(node.NodeData);\n\n                    var runtimeNode = new Node();\n                    runtimeNode.Guid = node.GUID;\n                    switch (node.Type) {\n                        case \"DialogueGraph.SelfNode\":\n                            runtimeNode.Type = NodeType.SELF;\n                            break;\n                        case \"DialogueGraph.NpcNode\":\n                            runtimeNode.Type = NodeType.NPC;\n                            break;\n                        case \"DialogueGraph.PropertyNode\":\n                            runtimeNode.Type = NodeType.PROP;\n                            runtimeNode.Temp_PropertyNodeGuid = nodeData.Value<string>(\"propertyGuid\");\n                            break;\n                        case \"DialogueGraph.NotBooleanNode\":\n                            runtimeNode.Type = NodeType.BOOLEAN_NOT;\n                            break;\n                        case \"DialogueGraph.AndBooleanNode\":\n                            runtimeNode.Type = NodeType.BOOLEAN_AND;\n                            break;\n                        case \"DialogueGraph.OrBooleanNode\":\n                            runtimeNode.Type = NodeType.BOOLEAN_OR;\n                            break;\n                        case \"DialogueGraph.XorBooleanNode\":\n                            runtimeNode.Type = NodeType.BOOLEAN_XOR;\n                            break;\n                        case \"DialogueGraph.NandBooleanNode\":\n                            runtimeNode.Type = NodeType.BOOLEAN_NAND;\n                            break;\n                        case \"DialogueGraph.NorBooleanNode\":\n                            runtimeNode.Type = NodeType.BOOLEAN_NOR;\n                            break;\n                        case \"DialogueGraph.XnorBooleanNode\":\n                            runtimeNode.Type = NodeType.BOOLEAN_XNOR;\n                            break;\n                        default:\n                            throw new NotSupportedException($\"Invalid node type {node.Type}.\");\n                    }\n\n                    // Get lines\n                    if (runtimeNode.Type == NodeType.SELF) {\n                        runtimeNode.Lines = new List<ConversationLine>();\n                        var lines = JsonConvert.DeserializeObject<List<LineDataSelf>>(nodeData.Value<string>(\"lines\"));\n                        foreach (var line in lines) {\n                            var runtimeLine = new ConversationLine {Message = line.Line, Next = line.PortGuidA, TriggerPort = line.PortGuidB, CheckPort = Guid.Empty.ToString()};\n                            runtimeNode.Lines.Add(runtimeLine);\n                        }\n                    } else if (runtimeNode.Type == NodeType.NPC) {\n                        runtimeNode.Lines = new List<ConversationLine>();\n                        var lines = JsonConvert.DeserializeObject<List<LineDataNpc>>(nodeData.Value<string>(\"lines\"));\n                        foreach (var line in lines) {\n                            var runtimeLine = new ConversationLine {Message = line.Line, Next = line.PortGuidA, TriggerPort = line.PortGuidB, CheckPort = line.PortGuidC};\n                            runtimeNode.Lines.Add(runtimeLine);\n                        }\n                    }\n\n                    runtimeObject.Nodes.Add(runtimeNode);\n                }\n\n                // Add edges\n                runtimeObject.Edges = new List<Edge>();\n                runtimeObject.Edges.AddRange(dlogObject.DlogGraph.Edges.Select(\n                                                 edge =>\n                                                     new Edge {\n                                                         FromNode = edge.Output, FromPort = edge.OutputPort, ToNode = edge.Input, ToPort = edge.InputPort\n                                                     }\n                                             ));\n                runtimeObject.BuildGraph();\n\n                ctx.AddObjectToAsset(\"MainAsset\", runtimeObject, runtimeIcon);\n                ctx.SetMainObject(runtimeObject);\n                AssetDatabase.Refresh();\n                EditorUtility.SetDirty(runtimeObject);\n            } catch (Exception) {\n                if (DialogueGraphUtility.VersionMismatch(ctx.assetPath)) {\n                    ImportInvalidVersion(ctx);\n                    return;\n                }\n\n                throw;\n            }\n        }\n\n        private void ImportInvalidVersion(AssetImportContext ctx) {\n            var icon = Resources.Load<Texture2D>(ResourcesUtility.IconError);\n            VersionMismatchObject versionMismatchObject = ScriptableObject.CreateInstance<VersionMismatchObject>();\n            ctx.AddObjectToAsset(\"MainAsset\", versionMismatchObject, icon);\n            ctx.SetMainObject(versionMismatchObject);\n        }\n    }\n}"
  },
  {
    "path": "Editor/Importers/DlogGraphImporter.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: ce3d5155149c4d55879633c98686ac8a\ntimeCreated: 1601288320"
  },
  {
    "path": "Editor/Importers/DlogGraphImporterEditor.cs",
    "content": "using System.IO;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor;\nusing UnityEditor.AssetImporters;\nusing UnityEditor.Callbacks;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    [CustomEditor(typeof(DlogGraphImporter))]\n    public class DlogGraphImporterEditor : ScriptedImporterEditor {\n        protected override bool needsApplyRevert => false;\n\n        private static GUIStyle titleStyle;\n        private static GUIStyle wrapLabelStyle;\n\n        public override void OnInspectorGUI() {\n            var importer = target as DlogGraphImporter;\n\n            if (assetTarget is VersionMismatchObject) {\n                if (titleStyle == null) {\n                    titleStyle = new GUIStyle(EditorStyles.label) {\n                        fontSize = 20,\n                        fontStyle = FontStyle.Bold,\n                    };\n                }\n\n                if (wrapLabelStyle == null) {\n                    wrapLabelStyle = new GUIStyle(EditorStyles.label) {\n                        wordWrap = true,\n                    };\n                }\n                GUILayout.Label(\"Version Mismatch\", titleStyle);\n                GUILayout.Label(\"Unable to load graph due to version mismatch. Before using you must convert the graph to the latest version.\", wrapLabelStyle);\n                GUILayout.Space(8.0f);\n\n                Color oldColor = GUI.backgroundColor;\n                GUI.backgroundColor = Color.red;\n\n                if (GUILayout.Button(\"Convert Graph\", GUILayout.Height(28.0f))) {\n                    JObject jsonObject = DialogueGraphUtility.LoadJObjectAtPath(importer.assetPath);\n                    if (jsonObject != null) {\n                        SemVer fileVersion = (SemVer)jsonObject.Value<string>(\"DialogueGraphVersion\");\n                        JObject converted = DialogueGraphUtility.VersionConvert(fileVersion, jsonObject);\n                        DlogGraphObject dlogObject = DialogueGraphUtility.FromJObject(converted);\n                        DialogueGraphUtility.SaveGraph(dlogObject);\n                    }\n                }\n\n                GUI.backgroundColor = oldColor;\n\n                return;\n            }\n\n            if (GUILayout.Button(\"Open Dialogue Graph Editor\")) {\n                OpenEditorWindow(importer.assetPath);\n            }\n\n            ApplyRevertGUI();\n        }\n\n        public static bool OpenEditorWindow(string assetPath) {\n            var extension = Path.GetExtension(assetPath);\n            if (string.IsNullOrEmpty(extension))\n                return false;\n\n            extension = extension.Substring(1).ToLowerInvariant();\n            if (extension != DlogGraphImporter.Extension)\n                return false;\n\n            JObject jsonObject = DialogueGraphUtility.LoadJObjectAtPath(assetPath);\n            if (jsonObject == null)\n                return false;\n\n            SemVer fileVersion = (SemVer)jsonObject.Value<string>(\"DialogueGraphVersion\");\n            var comparison = fileVersion.CompareTo(DialogueGraphUtility.LatestVersion);\n            if (comparison >= 0) {\n                DlogGraphObject dlogObject = DialogueGraphUtility.FromJObject(jsonObject);\n                OpenEditorWindow(dlogObject, assetPath);\n                return true;\n            }\n\n            if (EditorUtility.DisplayDialog(\"Version mismatch\", \"The graph you are trying to load was saved with an older version of Dialogue Graph.\\nIf you \" +\n                                                                \"proceed with loading it will be converted to the current version. (A backup will be created)\\n\\nDo you wish \" +\n                                                                \"to continue?\", \"Yes\", \"No\")) {\n                JObject converted = DialogueGraphUtility.VersionConvert(fileVersion, jsonObject);\n                DlogGraphObject dlogObject = DialogueGraphUtility.FromJObject(converted);\n                DialogueGraphUtility.SaveGraph(dlogObject);\n                OpenEditorWindow(dlogObject, assetPath);\n                return true;\n            }\n\n            return false;\n        }\n\n        private static void OpenEditorWindow(DlogGraphObject dlogObject, string assetPath) {\n            var guid = AssetDatabase.AssetPathToGUID(assetPath);\n            if (string.IsNullOrEmpty(dlogObject.AssetGuid)) {\n                dlogObject.RecalculateAssetGuid(assetPath);\n                DialogueGraphUtility.SaveGraph(dlogObject, false);\n            }\n\n            foreach (var activeWindow in Resources.FindObjectsOfTypeAll<DlogEditorWindow>()) {\n                if (activeWindow.SelectedAssetGuid != guid)\n                    continue;\n\n                // TODO: Ask user if they want to replace the current window (maybe ask to save before opening with cancel button)\n                activeWindow.SetDlogObject(dlogObject);\n                activeWindow.BuildWindow();\n                activeWindow.Focus();\n                return;\n            }\n\n            var window = EditorWindow.CreateWindow<DlogEditorWindow>(typeof(DlogEditorWindow), typeof(SceneView));\n            window.titleContent = EditorGUIUtility.TrTextContentWithIcon(guid, Resources.Load<Texture2D>(ResourcesUtility.IconSmall));\n            window.SetDlogObject(dlogObject);\n            window.BuildWindow();\n            window.Focus();\n        }\n\n        [OnOpenAsset]\n        public static bool OnOpenAsset(int instanceID, int line) {\n            var path = AssetDatabase.GetAssetPath(instanceID);\n            var extension = Path.GetExtension(path);\n            if (string.IsNullOrEmpty(extension))\n                return false;\n\n            extension = extension.Substring(1).ToLowerInvariant();\n            if (extension != DlogGraphImporter.Extension)\n                return false;\n\n            OpenEditorWindow(path);\n            return true;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Importers/DlogGraphImporterEditor.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 376fda88de154fa19b3d11dd3c387968\ntimeCreated: 1601299327"
  },
  {
    "path": "Editor/Importers.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 93ed6f674e384a14b43be58fe0708068\ntimeCreated: 1601288320"
  },
  {
    "path": "Editor/Inspector/DlogObjectEditor.cs",
    "content": "using System.Linq;\nusing DialogueGraph.Runtime;\nusing UnityEditor;\nusing UnityEditor.UIElements;\nusing UnityEngine;\nusing UnityEngine.UIElements;\nusing ActorData = DialogueGraph.Runtime.ActorData;\n\nnamespace DialogueGraph {\n    [CustomEditor(typeof(Runtime.RuntimeDialogueGraph))]\n    public class DlogObjectEditor : UnityEditor.Editor {\n        private Runtime.RuntimeDialogueGraph dialogueGraph;\n        private UnityEditor.SerializedProperty dlogObjectProperty;\n        private UnityEditor.SerializedProperty dlogObjectAssetGuidProperty;\n        private VisualElement rootElement;\n\n        private DlogObject DlogObject {\n            get => (DlogObject) dlogObjectProperty.objectReferenceValue;\n            set => dlogObjectProperty.objectReferenceValue = value;\n        }\n\n        private int currentDataPropertyIndex;\n        private UnityEditor.SerializedProperty currentDataPropertyCache;\n        private UnityEditor.SerializedProperty CurrentDataProperty {\n            get {\n                var currentIndex = dialogueGraph.CurrentIndex;\n                currentDataPropertyCache = serializedObject.FindProperty($\"PersistentData.Array.data[{currentIndex}]\");\n                return currentDataPropertyCache;\n            }\n        }\n\n        public void OnEnable() {\n            dialogueGraph = (Runtime.RuntimeDialogueGraph) target;\n            rootElement = new VisualElement();\n            dlogObjectProperty = serializedObject.FindProperty(\"DlogObject\");\n            dlogObjectAssetGuidProperty = serializedObject.FindProperty(\"CurrentAssetGuid\");\n\n            var visualTree = Resources.Load<VisualTreeAsset>(\"Inspector/DlogObjectEditor\");\n            visualTree.CloneTree(rootElement);\n            rootElement.AddStyleSheet(\"Inspector/Styles/DlogObjectEditor\");\n\n            UpdatePersistentData();\n        }\n\n        public override VisualElement CreateInspectorGUI() {\n            var dlogObjectField = rootElement.Q<ObjectField>(\"dlogObjectField\");\n            var propertiesContainer = rootElement.Q<VisualElement>(\"propertiesContainer\");\n            var invalidContainer = rootElement.Q<VisualElement>(\"invalidContainer\");\n\n            var clearDataButton = rootElement.Q<Button>(\"clearData\");\n            clearDataButton.RegisterCallback<ClickEvent>(evt => {\n                dialogueGraph.ClearData();\n                UpdateInspectorProperties();\n            });\n\n            RefreshDlogObjectView(propertiesContainer, invalidContainer);\n            dlogObjectField.objectType = typeof(DlogObject);\n            dlogObjectField.BindProperty(dlogObjectProperty);\n            dlogObjectField.value = dlogObjectProperty.objectReferenceValue;\n            dlogObjectField.RegisterCallback<ChangeEvent<Object>>(evt => {\n                dlogObjectProperty.objectReferenceValue = (DlogObject) evt.newValue;\n                dlogObjectAssetGuidProperty.stringValue = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(evt.newValue));\n                RefreshDlogObjectView(propertiesContainer, invalidContainer);\n                serializedObject.ApplyModifiedProperties();\n                UpdateInspectorProperties();\n            });\n            UpdateInspectorProperties();\n            return rootElement;\n        }\n\n        private void RefreshDlogObjectView(VisualElement propertiesContainer, VisualElement invalidContainer) {\n            if (dlogObjectProperty.objectReferenceValue == null) {\n                propertiesContainer.AddToClassList(\"hidden\");\n                invalidContainer.RemoveFromClassList(\"hidden\");\n            } else {\n                propertiesContainer.RemoveFromClassList(\"hidden\");\n                invalidContainer.AddToClassList(\"hidden\");\n            }\n        }\n\n        private void UpdateInspectorProperties() {\n            if (DlogObject == null) return;\n            var currentData = dialogueGraph.CurrentData;\n            UpdatePersistentData();\n\n            var actorContainer = rootElement.Q(\"actorList\");\n            actorContainer.AddStyleSheet(\"Inspector/Styles/ActorEditor\");\n            var actorTemplate = Resources.Load<VisualTreeAsset>(\"Inspector/ActorEditor\");\n            actorContainer.Clear();\n            var actorProperties = DlogObject.Properties.Where(property => property.Type == PropertyType.Actor).ToList();\n\n            // draw actor interface\n            foreach (var actorProperty in actorProperties) {\n                var actorRoot = new VisualElement();\n                actorTemplate.CloneTree(actorRoot);\n\n                var actorTitle = actorRoot.Q<Label>(\"actorIdentifier\");\n                actorTitle.text = $\"{actorProperty.DisplayName}\";\n                var actorName = actorRoot.Q<TextField>(\"actorName\");\n                actorName.SetValueWithoutNotify(currentData.ActorData[currentData.ActorDataIndices[actorProperty.Guid]].Name);\n                actorName.RegisterValueChangedCallback(evt => { currentData.ActorData[currentData.ActorDataIndices[actorProperty.Guid]].Name = evt.newValue; });\n                actorName.RegisterCallback<FocusOutEvent>(evt => { serializedObject.ApplyModifiedProperties(); });\n\n                var customData = actorRoot.Q<ObjectField>(\"customActorData\");\n                customData.objectType = typeof(ScriptableObject);\n                customData.SetValueWithoutNotify(currentData.ActorData[currentData.ActorDataIndices[actorProperty.Guid]].CustomData);\n                customData.RegisterValueChangedCallback(evt => {\n                    currentData.ActorData[currentData.ActorDataIndices[actorProperty.Guid]].CustomData = (ScriptableObject)evt.newValue;\n                    serializedObject.ApplyModifiedProperties();\n                });\n\n                actorContainer.Add(actorRoot);\n            }\n\n            var checkContainer = rootElement.Q(\"checkList\");\n            checkContainer.AddStyleSheet(\"Inspector/Styles/CheckEditor\");\n            var checkTemplate = Resources.Load<VisualTreeAsset>(\"Inspector/CheckEditor\");\n            checkContainer.Clear();\n\n            // draw check interface\n            var checkProperties = DlogObject.Properties.Where(property => property.Type == PropertyType.Check).ToList();\n            foreach (var checkProperty in checkProperties) {\n                var checkRoot = new VisualElement();\n                checkTemplate.CloneTree(checkRoot);\n\n                var checkTitle = checkRoot.Q<Label>(\"checkIdentifier\");\n                checkTitle.text = checkProperty.DisplayName;\n\n                var index = currentData.CheckDataIndices[checkProperty.Guid];\n                var property = CurrentDataProperty?.FindPropertyRelative($\"CheckData.Array.data[{index}]\");\n                if (property != null) {\n                    var checkField = new IMGUIContainer(() => { EditorGUILayout.PropertyField(property); });\n                    checkRoot.Q(\"checkContainer\").Add(checkField);\n                }\n\n                checkContainer.Add(checkRoot);\n            }\n\n            var triggerContainer = rootElement.Q(\"triggerList\");\n            triggerContainer.AddStyleSheet(\"Inspector/Styles/TriggerEditor\");\n            var triggerTemplate = Resources.Load<VisualTreeAsset>(\"Inspector/TriggerEditor\");\n            triggerContainer.Clear();\n\n            // draw trigger interface\n            foreach (var triggerProperty in DlogObject.Properties.Where(property => property.Type == PropertyType.Trigger)) {\n                var triggerRoot = new VisualElement();\n                triggerTemplate.CloneTree(triggerRoot);\n\n                var triggerTitle = triggerRoot.Q<Label>(\"triggerIdentifier\");\n                triggerTitle.text = triggerProperty.DisplayName;\n\n                var index = currentData.TriggerDataIndices[triggerProperty.Guid];\n                var property = CurrentDataProperty?.FindPropertyRelative($\"TriggerData.Array.data[{index}]\");\n                if (property != null) {\n                    var triggerField = new IMGUIContainer(() => { EditorGUILayout.PropertyField(property); });\n                    triggerRoot.Q(\"triggerContainer\").Add(triggerField);\n                }\n\n                triggerContainer.Add(triggerRoot);\n            }\n        }\n\n        private void UpdatePersistentData() {\n            if (DlogObject == null) return;\n            var currentData = dialogueGraph.CurrentData;\n\n            // check if check data is different to persistent data\n            var checkProperties = DlogObject.Properties.Where(property => property.Type == PropertyType.Check).ToList();\n            foreach (var checkProperty in checkProperties) {\n                if (!currentData.CheckDataIndices.ContainsKey(checkProperty.Guid))\n                    currentData.AddCheckEvent(checkProperty.Guid, new CheckEvent());\n            }\n\n            /*\n         TODO: This would work if you updated the Indices dictionary after deleting\n         TODO: Right now it's kind of a memory leak, as in if you delete a property,\n         TODO: it will remain in memory forever, or until clearing the cache.\n        // Remove properties which no longer exist\n        var keysToRemove = new List<string>();\n        var checkDataKeys = currentData.CheckDataIndices.Keys;\n        foreach (var checkKey in checkDataKeys) {\n            if (!checkProperties.Exists(prop => prop.Guid == checkKey))\n                keysToRemove.Add(checkKey);\n        }\n\n        int offset = 0;\n        keysToRemove.ForEach(key => {\n            currentData.CheckData.RemoveAt(currentData.CheckDataIndices[key] - offset);\n            currentData.CheckDataIndices.Remove(key);\n            offset++;\n        });\n        */\n            // check if trigger data is different to persistent data\n            var triggerProperties = DlogObject.Properties.Where(property => property.Type == PropertyType.Trigger).ToList();\n            foreach (var triggerProperty in triggerProperties) {\n                if (!currentData.TriggerDataIndices.ContainsKey(triggerProperty.Guid))\n                    currentData.AddTriggerEvent(triggerProperty.Guid, new TriggerEvent());\n            }\n\n            /*keysToRemove.Clear();\n        var triggerDataKeys = currentData.TriggerDataIndices.Keys.ToList();\n        foreach (var triggerKey in triggerDataKeys) {\n            if (!triggerProperties.Exists(prop => prop.Guid == triggerKey))\n                keysToRemove.Add(triggerKey);\n        }\n\n        offset = 0;\n        keysToRemove.ForEach(key => {\n            currentData.TriggerData.RemoveAt(currentData.TriggerDataIndices[key] - offset);\n            currentData.TriggerDataIndices.Remove(key);\n            offset++;\n        });*/\n\n            // check if actor data is different to persistent data\n            var actorProperties = DlogObject.Properties.Where(property => property.Type == PropertyType.Actor).ToList();\n            foreach (var actorProperty in actorProperties) {\n                if (!currentData.ActorDataIndices.ContainsKey(actorProperty.Guid))\n                    currentData.AddActorData(actorProperty.Guid, new Runtime.ActorData(\"Empty name\", null, actorProperty));\n            }\n\n            /*keysToRemove.Clear();\n        var actorDataKeys = currentData.ActorDataIndices.Keys.ToList();\n        foreach (var actorKey in actorDataKeys) {\n            if (!actorProperties.Exists(prop => prop.Guid == actorKey))\n                keysToRemove.Add(actorKey);\n        }\n\n        offset = 0;\n        keysToRemove.ForEach(key => {\n            currentData.ActorData.RemoveAt(currentData.ActorDataIndices[key] - offset);\n            currentData.ActorDataIndices.Remove(key);\n            offset++;\n        });*/\n        }\n    }\n}"
  },
  {
    "path": "Editor/Inspector/DlogObjectEditor.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 73d4a966490679d48b7ce9b539d5f151\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Inspector.meta",
    "content": "fileFormatVersion: 2\nguid: 7ef214c8cb3964a45bbe69a9772af6dc\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Editor/Util/DialogueGraphUtility.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing Newtonsoft.Json.Linq;\nusing UnityEditor;\nusing UnityEngine;\nusing Debug = UnityEngine.Debug;\n\nnamespace DialogueGraph {\n    public static class DialogueGraphUtility {\n        internal static readonly SemVer LatestVersion = new SemVer(2, 0, 0);\n\n        #region IO Utilities\n        public static bool CreateFile(string path, DlogGraphObject dlogObject, bool refreshAsset = true) {\n            if (dlogObject == null || string.IsNullOrEmpty(path)) return false;\n\n            var assetGuid = AssetDatabase.AssetPathToGUID(path);\n            dlogObject.DlogGraph.AssetGuid = assetGuid;\n\n            CreateFileNoUpdate(path, dlogObject, refreshAsset);\n            return true;\n        }\n\n        public static void CreateFileNoUpdate(string path, DlogGraphObject dlogObject, bool refreshAsset = true) {\n            var jsonString = JsonUtility.ToJson(dlogObject.DlogGraph, true);\n            File.WriteAllText(path, jsonString);\n            if (refreshAsset) AssetDatabase.ImportAsset(path);\n        }\n\n        public static bool SaveGraph(DlogGraphObject dlogObject, bool refreshAsset = true) {\n            if (dlogObject == null) return false;\n            if (string.IsNullOrEmpty(dlogObject.DlogGraph.AssetGuid)) return false;\n\n            var assetPath = AssetDatabase.GUIDToAssetPath(dlogObject.DlogGraph.AssetGuid);\n            if (string.IsNullOrEmpty(assetPath)) return false;\n\n            var jsonString = JsonUtility.ToJson(dlogObject.DlogGraph, true);\n            File.WriteAllText(assetPath, jsonString);\n            if (refreshAsset) AssetDatabase.ImportAsset(assetPath, ImportAssetOptions.ForceUpdate);\n            return true;\n        }\n\n        public static DlogGraphObject LoadGraphAtPath(string assetPath) {\n            if (string.IsNullOrEmpty(assetPath)) return null;\n\n            var jsonString = File.ReadAllText(assetPath);\n            try {\n                var dlogData = JsonUtility.FromJson<DlogGraphData>(jsonString);\n                var dlogObject = ScriptableObject.CreateInstance<DlogGraphObject>();\n                dlogObject.Initialize(dlogData);\n                dlogObject.AssetGuid = dlogData.AssetGuid;\n                return dlogObject;\n            } catch (ArgumentNullException exception) {\n                Debug.LogException(exception);\n                return null;\n            }\n        }\n\n        public static DlogGraphObject LoadGraphAtGuid(string assetGuid) {\n            if (string.IsNullOrEmpty(assetGuid)) return null;\n\n            var assetPath = AssetDatabase.GUIDToAssetPath(assetGuid);\n            if (string.IsNullOrEmpty(assetPath)) return null;\n\n            return LoadGraphAtPath(assetPath);\n        }\n\n        public static JObject LoadJObjectAtPath(string assetPath) {\n            if (string.IsNullOrEmpty(assetPath)) return null;\n\n            var jsonString = File.ReadAllText(assetPath);\n            try {\n                return JObject.Parse(jsonString);\n            } catch (ArgumentNullException exception) {\n                Debug.LogException(exception);\n                return null;\n            }\n        }\n\n        public static DlogGraphObject FromJObject(JObject converted) {\n            if (converted == null) return null;\n\n            var dlogData = JsonUtility.FromJson<DlogGraphData>(converted.ToString());\n            var dlogObject = ScriptableObject.CreateInstance<DlogGraphObject>();\n            dlogObject.Initialize(dlogData);\n            dlogObject.AssetGuid = dlogData.AssetGuid;\n            return dlogObject;\n        }\n\n        #endregion\n\n        /// <summary>\n        /// Converts (back-ports or forward-ports) dlogObject from <paramref name=\"fromVersion\"/> to the current version.\n        /// </summary>\n        /// <param name=\"fromVersion\">DialogueGraph object version</param>\n        /// <param name=\"jsonObject\">JObject representation of DialogueGraph to be converted</param>\n        public static JObject VersionConvert(SemVer fromVersion, JObject jsonObject) {\n            return VersionConverter.ConvertVersion(fromVersion, LatestVersion, jsonObject);\n        }\n\n        /// <summary>\n        /// Returns <c>true</c> if the asset at <paramref name=\"assetPath\"/> has a mismatching version.\n        /// </summary>\n        public static bool VersionMismatch(string assetPath) {\n            JObject jsonObject = LoadJObjectAtPath(assetPath);\n            if (jsonObject == null) return true;\n\n            SemVer version = (SemVer)jsonObject.Value<string>(\"DialogueGraphVersion\");\n            return version != LatestVersion;\n        }\n\n        /**\n         * Found this nifty method inside the codebase of ShaderGraph while reverse engineering some functionality.\n         * I needed something like this so it didn't make sense to reinvent the wheel, so I took this and slightly modified it.\n         * The original can be found in your unity project at: {PROJECT_ROOT}/Library/PackageCache/com.unity.shadergraph@{YOUR_SHADERGRAPH_VERSION}/Editor/Data/Util/GraphUtil.cs \n         */\n        /// <summary>\n        /// Sanitizes a supplied string such that it does not collide\n        /// with any other name in a collection.\n        /// </summary>\n        /// <param name=\"existingNames\">\n        /// A collection of names that the new name should not collide with.\n        /// </param>\n        /// <param name=\"duplicateFormat\">\n        /// The format applied to the name if a duplicate exists.\n        /// This must be a format string that contains `{0}` and `{1}`\n        /// once each. An example could be `{0} ({1})`, which will append ` (n)`\n        /// to the name for the n`th duplicate.\n        /// </param>\n        /// <param name=\"name\">\n        /// The name to be sanitized.\n        /// </param>\n        /// <returns>\n        /// A name that is distinct form any name in `existingNames`.\n        /// </returns>\n        public static string SanitizeName(IEnumerable<string> existingNames, string duplicateFormat, string name) {\n            var existingNamesList = existingNames.ToList();\n            if (!existingNamesList.ToList().Contains(name))\n                return name;\n\n            var escapedDuplicateFormat = Regex.Escape(duplicateFormat);\n\n            // Escaped format will escape string interpolation, so the escape caracters must be removed for these.\n            escapedDuplicateFormat = escapedDuplicateFormat.Replace(@\"\\{0}\", @\"{0}\");\n            escapedDuplicateFormat = escapedDuplicateFormat.Replace(@\"\\{1}\", @\"{1}\");\n\n            var baseRegex = new Regex(string.Format(escapedDuplicateFormat, @\"^(.*)\", @\"(\\d+)\"));\n\n            var baseMatch = baseRegex.Match(name);\n            if (baseMatch.Success)\n                name = baseMatch.Groups[1].Value;\n\n            var baseNameExpression = string.Format(@\"^{0}\", Regex.Escape(name));\n            var regex = new Regex(string.Format(escapedDuplicateFormat, baseNameExpression, @\"(\\d+)\") + \"$\");\n\n            var existingDuplicateNumbers = existingNamesList.Select(existingName => regex.Match(existingName)).Where(m => m.Success).Select(m => int.Parse(m.Groups[1].Value)).Where(n => n > 0).Distinct().ToList();\n\n            var duplicateNumber = 1;\n            existingDuplicateNumbers.Sort();\n            if (existingDuplicateNumbers.Any() && existingDuplicateNumbers.First() == 1) {\n                duplicateNumber = existingDuplicateNumbers.Last() + 1;\n                for (var i = 1; i < existingDuplicateNumbers.Count; i++) {\n                    if (existingDuplicateNumbers[i - 1] != existingDuplicateNumbers[i] - 1) {\n                        duplicateNumber = existingDuplicateNumbers[i - 1] + 1;\n                        break;\n                    }\n                }\n            }\n\n            return string.Format(duplicateFormat, name, duplicateNumber);\n        }\n    }\n}"
  },
  {
    "path": "Editor/Util/DialogueGraphUtility.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 7a7dc044dd524739a0b0e76bd7e5d9ec\ntimeCreated: 1601294987"
  },
  {
    "path": "Editor/Util/Ref.cs",
    "content": "using System;\n\nnamespace DialogueGraph {\n    public class Ref<T> : IEquatable<T>, IEquatable<Ref<T>> where T : struct {\n        private T value;\n        private Func<T> getValue = null;\n        private Action setValue = null;\n\n        private Ref(T value) {\n            this.value = value;\n        }\n\n        private Ref() {\n            value = new T();\n        }\n\n        public ref T GetReference() {\n            if (getValue != null) {\n                var val = getValue();\n                if (!val.Equals(value)) value = val;\n            }\n            return ref value;\n        }\n\n        public T GetValue() {\n            if (getValue != null) {\n                var val = getValue();\n                if (!val.Equals(value)) value = val;\n            }\n            return value;\n        }\n\n        public void Set(T newValue) {\n            value = newValue;\n            setValue?.Invoke();\n        }\n\n        public void SetValueUnbound(T newValue) {\n            value = newValue;\n        }\n\n        public T GetValueUnbound() {\n            return value;\n        }\n\n        public void Bind(Func<T> getValue, Action setValue) {\n            this.getValue = getValue;\n            this.setValue = setValue;\n        }\n\n        public void Unbind() {\n            getValue = null;\n            setValue = null;\n        }\n\n        #region Equality Members\n        public bool Equals(T other) {\n            return value.Equals(other);\n        }\n\n        public bool Equals(Ref<T> other) {\n            if (ReferenceEquals(null, other))\n                return false;\n            if (ReferenceEquals(this, other))\n                return true;\n            return Equals(other.value);\n        }\n\n        public override bool Equals(object obj) {\n            if (ReferenceEquals(null, obj))\n                return false;\n            if (ReferenceEquals(this, obj))\n                return true;\n            if (obj.GetType() != this.GetType())\n                return false;\n            return Equals((Ref<T>) obj);\n        }\n\n        public override int GetHashCode() {\n            // ReSharper disable once NonReadonlyMemberInGetHashCode\n            return value.GetHashCode();\n        }\n\n        public static bool operator ==(Ref<T> left, Ref<T> right) {\n            return Equals(left, right);\n        }\n\n        public static bool operator !=(Ref<T> left, Ref<T> right) {\n            return !Equals(left, right);\n        }\n\n        public static bool operator ==(Ref<T> left, T right) {\n            if (ReferenceEquals(null, left))\n                return false;\n            return Equals(left.value, right);\n        }\n\n        public static bool operator !=(Ref<T> left, T right) {\n            if (ReferenceEquals(null, left))\n                return true;\n            return !Equals(left.value, right);\n        }\n        #endregion\n\n        public override string ToString() {\n            return $\"Ref<{typeof(T).Name}>[{value}]\";\n        }\n\n        public static Ref<T> MakeRef(T initialValue, Func<T> getValue, Action setValue) {\n            var reference = new Ref<T>(initialValue);\n            reference.Bind(getValue, setValue);\n            return reference;\n        }\n\n        public static Ref<T> MakeRef(T initialValue) {\n            return new Ref<T>(initialValue);\n        }\n\n        public static Ref<T> MakeRef() {\n            return new Ref<T>();\n        }\n\n        #region Operators\n        public static explicit operator Ref<T>(T value) {\n            return new Ref<T>(value);\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "Editor/Util/Ref.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: e648f829c217403ba95229c4826c5575\ntimeCreated: 1606316073"
  },
  {
    "path": "Editor/Util/ResourcesUtility.cs",
    "content": "namespace DialogueGraph {\n    public static class ResourcesUtility {\n        public const string IconBig = \"Textures/dloggraph_256\";\n        public const string IconSmall = \"Textures/dloggraph_256\";\n        public const string RuntimeIconBig = \"Textures/dloggraph_256\";\n        public const string RuntimeIconSmall = \"Textures/dloggraph_256\";\n        public const string IconError = \"Textures/dloggraph_error_256\";\n    }\n}"
  },
  {
    "path": "Editor/Util/ResourcesUtility.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 88da25b1efc040ec886d999fb3be8419\ntimeCreated: 1601305189"
  },
  {
    "path": "Editor/Util/UIElementsFactory.cs",
    "content": "using System;\nusing UnityEngine.UIElements;\n\nnamespace DialogueGraph {\n    public static class UIElementsFactory {\n        public static VisualElement FlexBreaker() {\n            return VisualElement<VisualElement>(\"\", new[] {\"flex-break\"});\n        }\n\n        public static Button Button(string buttonText, string name, string buttonTooltip, string[] classNames, Action onClick) {\n            var button = TextElement<Button>(name, buttonText, classNames);\n            if (!string.IsNullOrEmpty(buttonTooltip)) button.tooltip = buttonTooltip;\n            if (onClick != null) button.clicked += onClick;\n            return button;\n        }\n\n        public static T VisualElement<T>(string name, string[] classNames) where T : VisualElement, new() {\n            var element = new T();\n            if (!string.IsNullOrEmpty(name)) element.name = name;\n            if(classNames != null) foreach (var className in classNames) element.AddToClassList(className);\n            return element;\n        }\n\n        public static T TextElement<T>(string name, string text, string[] classNames) where T : TextElement, new() {\n            var element = new T();\n            if (!string.IsNullOrEmpty(name)) element.name = name;\n            if (!string.IsNullOrEmpty(text)) element.text = text;\n            if(classNames != null) foreach (var className in classNames) element.AddToClassList(className);\n            return element;\n        }\n\n        public static TextField TextField(string name, string label, string[] classNames, EventCallback<ChangeEvent<string>> onChanged, EventCallback<FocusOutEvent> onFocusOut, bool multiLine = false, int maxLength = -1, bool isPasswordField = false, char passwordMaskChar = ' ') {\n            var textField = VisualElement<TextField>(name, classNames);\n            if (!string.IsNullOrEmpty(label)) textField.label = label;\n            if (onChanged != null) textField.RegisterValueChangedCallback(onChanged);\n            if (onFocusOut != null) textField.RegisterCallback(onFocusOut);\n            textField.multiline = multiLine;\n            textField.isPasswordField = isPasswordField;\n            textField.maskChar = passwordMaskChar;\n            textField.maxLength = maxLength;\n            return textField;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Util/UIElementsFactory.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 5af37a7a4127452692b84c896290393c\ntimeCreated: 1602751500"
  },
  {
    "path": "Editor/Util/Versioning/Conversion/ConvertMethodAttribute.cs",
    "content": "using System;\nusing JetBrains.Annotations;\n\nnamespace DialogueGraph {\n    [AttributeUsage(AttributeTargets.Method, Inherited = false), MeansImplicitUse]\n    public class ConvertMethodAttribute : Attribute {\n        public readonly SemVer TargetVersion;\n\n        /// <summary>\n        /// Specifies that tha attached method is a converting method (from one version of Dialogue Graph to another)\n        /// </summary>\n        /// <param name=\"targetVersion\">The target version the method converts to.</param>\n        public ConvertMethodAttribute(string targetVersion) {\n            TargetVersion = (SemVer)targetVersion;\n        }\n    }\n}"
  },
  {
    "path": "Editor/Util/Versioning/Conversion/ConvertMethodAttribute.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: f2622420eb2242bf9412f6b96cfeca0b\ntimeCreated: 1606485813"
  },
  {
    "path": "Editor/Util/Versioning/Conversion/VersionConverter.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Text.RegularExpressions;\nusing Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    public static class VersionConverter {\n        private static readonly SemVer v111 = (SemVer) \"1.1.1\";\n        private static readonly SemVer v112 = (SemVer) \"1.1.2\";\n        private static readonly SemVer v200 = (SemVer) \"2.0.0\";\n\n        private static readonly SemVer[] sortedVersions = {v111, v112, v200};\n\n        private static bool builtMethodCache;\n        private static Dictionary<SemVer, Func<JObject, JObject>> upgradeMethodCache;\n\n        private static SemVer GetNextVersion(SemVer from) {\n            for (int i = 1; i < sortedVersions.Length; i++) {\n                int comparePrev = from.CompareTo(sortedVersions[i - 1]);\n                int compareNext = from.CompareTo(sortedVersions[i]);\n                if (comparePrev >= 0 && compareNext < 0) return sortedVersions[i];\n            }\n\n            return SemVer.Invalid;\n        }\n\n        public static JObject ConvertVersion(SemVer from, SemVer to, JObject jsonDlogObject) {\n            while (true) {\n                if (from == to) return jsonDlogObject;\n                SemVer next = GetNextVersion(from);\n                if (next == SemVer.Invalid) {\n                    Debug.Log($\"Could not find upgrading method [{from} -> {to}]\");\n                    return jsonDlogObject;\n                }\n\n                jsonDlogObject = UpgradeTo(next, jsonDlogObject);\n                from = next;\n            }\n        }\n\n        [ConvertMethod(\"1.1.2\")]\n        private static JObject U_112(JObject dlogObject) {\n            dlogObject[\"DialogueGraphVersion\"] = v112.ToString();\n            return dlogObject;\n        }\n\n        private static readonly Regex u200TypeRegex = new Regex(@\"(?<quote>\\\\\"\"|\"\")Dlog\\.(.*?)(\\k<quote>)\", RegexOptions.Compiled);\n        [ConvertMethod(\"2.0.0\")]\n        private static JObject U_200(JObject dlogObject) {\n            // Change namespaces\n            string json = dlogObject.ToString(Formatting.None);\n            json = u200TypeRegex.Replace(json, \"${quote}DialogueGraph.$1${quote}\");\n\n            dlogObject = JObject.Parse(json);\n\n            // Replace all CheckCombinerNode with either AndBooleanNode or OrBooleanNode\n            JArray nodes = dlogObject[\"nodes\"] as JArray;\n            foreach (JToken nodeToken in nodes) {\n                // \"Type\": \"DialogueGraph.CheckCombinerNode\"\n                if (nodeToken.Value<string>(\"Type\") != \"DialogueGraph.CheckCombinerNode\") continue;\n\n                JObject nodeData = JObject.Parse(nodeToken.Value<string>(\"NodeData\"));\n                if (nodeData.Value<string>(\"operation\") == \"true\") {\n                    nodeToken[\"Type\"] = \"DialogueGraph.OrBooleanNode\";\n                } else {\n                    nodeToken[\"Type\"] = \"DialogueGraph.AndBooleanNode\";\n                }\n                nodeToken[\"NodeData\"] = \"{}\";\n            }\n\n            dlogObject[\"DialogueGraphVersion\"] = v200.ToString();\n            return dlogObject;\n        }\n\n        private static JObject UpgradeTo(SemVer version, JObject dlogGraphObject) {\n            if (!builtMethodCache) {\n                BuildMethodCache();\n            }\n            if(upgradeMethodCache.ContainsKey(version))\n                return upgradeMethodCache[version](dlogGraphObject);\n\n            Debug.LogWarning($\"Upgrade conversion with [target={version}] is not supported.\");\n            return dlogGraphObject;\n        }\n\n\n        private static void BuildMethodCache() {\n            Debug.Log(\"Building cache\");\n            builtMethodCache = true;\n            upgradeMethodCache = new Dictionary<SemVer, Func<JObject, JObject>>();\n\n            MethodInfo[] methods = typeof(VersionConverter).GetMethods(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);\n            foreach (MethodInfo method in methods) {\n                ConvertMethodAttribute attribute = method.GetCustomAttribute<ConvertMethodAttribute>(false);\n                if (attribute == null) continue;\n\n                Func<JObject, JObject> methodCall = method.CreateDelegate(typeof(Func<JObject, JObject>)) as Func<JObject, JObject>;\n                upgradeMethodCache.Add(attribute.TargetVersion, methodCall);\n            }\n        }\n    }\n}"
  },
  {
    "path": "Editor/Util/Versioning/Conversion/VersionConverter.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 1ef41f3bff6a4a5a83e68257e061444d\ntimeCreated: 1606481644"
  },
  {
    "path": "Editor/Util/Versioning/Conversion.meta",
    "content": "﻿fileFormatVersion: 2\nguid: c13a35f5c76d4a138eba82586a4166e9\ntimeCreated: 1606485778"
  },
  {
    "path": "Editor/Util/Versioning/SemVer.cs",
    "content": "using System;\nusing UnityEngine;\n\nnamespace DialogueGraph {\n    [Serializable]\n    public struct SemVer : IEquatable<SemVer>, IComparable<SemVer> {\n        public static readonly SemVer Invalid = new SemVer {MAJOR = -1, MINOR = -1, PATCH = -1};\n\n        // ReSharper disable once InconsistentNaming\n        public int MAJOR;\n\n        // ReSharper disable once InconsistentNaming\n        public int MINOR;\n\n        // ReSharper disable once InconsistentNaming\n        public int PATCH;\n\n        public SemVer(string versionString) {\n            if (!IsValid(versionString, out var major, out var minor, out var patch)) {\n                Debug.LogError($\"Could not parse SemVer string {versionString} into format MAJOR.MINOR.PATCH.\");\n                this = Invalid;\n                return;\n            }\n\n            MAJOR = major;\n            MINOR = minor;\n            PATCH = patch;\n        }\n\n        public SemVer(int major, int minor, int patch) {\n            MAJOR = major;\n            MINOR = minor;\n            PATCH = patch;\n        }\n\n        public override string ToString() {\n            return $\"{MAJOR}.{MINOR}.{PATCH}\";\n        }\n\n        public static implicit operator string(SemVer semVer) {\n            return semVer.ToString();\n        }\n\n        public static explicit operator SemVer(string versionString) {\n            return FromVersionString(versionString);\n        }\n\n        public static SemVer FromVersionString(string versionString) {\n            return new SemVer(versionString);\n        }\n\n        public static bool IsValid(string versionString, out int major, out int minor, out int patch) {\n            var split = versionString.Split('.');\n            if (split.Length != 3) {\n                major = -1;\n                minor = -1;\n                patch = -1;\n                return false;\n            }\n\n            var majorWorks = int.TryParse(split[0], out var majorParsed) && majorParsed >= 0;\n            var minorWorks = int.TryParse(split[1], out var minorParsed) && minorParsed >= 0;\n            var patchWorks = int.TryParse(split[2], out var patchParsed) && patchParsed >= 0;\n            major = majorParsed;\n            minor = minorParsed;\n            patch = patchParsed;\n            return majorWorks && minorWorks && patchWorks;\n        }\n\n        public static bool IsValid(string versionString) => IsValid(versionString, out _, out _, out _);\n\n        public bool Equals(SemVer other) {\n            return MAJOR == other.MAJOR && MINOR == other.MINOR && PATCH == other.PATCH;\n        }\n\n        public override bool Equals(object obj) {\n            return obj is SemVer other && Equals(other);\n        }\n\n        public override int GetHashCode() {\n            unchecked {\n                var hashCode = MAJOR;\n                hashCode = (hashCode * 397) ^ MINOR;\n                hashCode = (hashCode * 397) ^ PATCH;\n                return hashCode;\n            }\n        }\n\n        public static bool operator ==(SemVer left, SemVer right) {\n            return left.Equals(right);\n        }\n\n        public static bool operator !=(SemVer left, SemVer right) {\n            return !left.Equals(right);\n        }\n\n        public int CompareTo(SemVer other) {\n            var majorComparison = MAJOR.CompareTo(other.MAJOR);\n            if (majorComparison != 0)\n                return majorComparison;\n            var minorComparison = MINOR.CompareTo(other.MINOR);\n            if (minorComparison != 0)\n                return minorComparison;\n            return PATCH.CompareTo(other.PATCH);\n        }\n    }\n}"
  },
  {
    "path": "Editor/Util/Versioning/SemVer.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: d73d5b8f3978436b871a55d1bd70d10c\ntimeCreated: 1606315024"
  },
  {
    "path": "Editor/Util/Versioning.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 82187cbe07de4496b8cd43b24a1df4cb\ntimeCreated: 1606317692"
  },
  {
    "path": "Editor/Util.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 5a865807f1d847bfa857c83d03aa8ad7\ntimeCreated: 1601294980"
  },
  {
    "path": "Editor.meta",
    "content": "fileFormatVersion: 2\nguid: aca13eb6206522d4093f809cf3789469\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Github~/CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at teodor.vecerdi@gmail.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "Github~/CONTRIBUTING.md",
    "content": "# Contributing to DialogueGraph\n\nFirst and foremost, thank you! We appreciate that you want to contribute to DialogueGraph, your time is valuable, and your contributions mean a lot to us.\n\n\n## Important!\n\nBy contributing to this project, you:\n\n* Agree that you have authored 100% of the content\n* Agree that you have the necessary rights to the content\n* Agree that you have received the necessary permissions from your employer to make the contributions (if applicable)\n* Agree that the content you contribute may be provided under the Project license(s)\n* Agree that, if you did not author 100% of the content, the appropriate licenses and copyrights have been added along with any other necessary attribution.\n\n\n## Getting started\n\n**What does \"contributing\" mean?**\n\nCreating an issue is the simplest form of contributing to a project. But there are many ways to contribute, including the following:\n\n- Updating or correcting documentation\n- Feature requests\n- Bug reports\n\nIf you'd like to learn more about contributing in general, the [Guide to Idiomatic Contributing](https://github.com/jonschlinkert/idiomatic-contributing) has a lot of useful information.\n\n**Showing support for DialogueGraph**\n\nPlease keep in mind that open source software is built by people like you, who spend their free time creating things the rest the community can use.\n\nDon't have time to contribute? No worries, here are some other ways to show your support for DialogueGraph:\n\n- star the [project](https://github.com/TeodorVecerdi/DialogueGraph)\n- tweet your support for DialogueGraph\n\n\n## Issues\n\nPlease only create issues for bug reports or feature requests. Issues discussing any other topics may be closed by the project's maintainers without further explanation.\n\nDo not create issues about bumping dependencies unless a bug has been identified and you can demonstrate that it effects this library.\n\n**Help us to help you**\n\nRemember that we’re here to help, but not to make guesses about what you need help with:\n\n- Whatever bug or issue you're experiencing, assume that it will not be as obvious to the maintainers as it is to you.\n- Spell it out completely. Keep in mind that maintainers need to think about _all potential use cases_ of a library. It's important that you explain how you're using a library so that maintainers can make that connection and solve the issue.\n\n_It can't be understated how frustrating and draining it can be to maintainers to have to ask clarifying questions on the most basic things, before it's even possible to start debugging. Please try to make the best use of everyone's time involved, including yourself, by providing this information up front._\n\n### Before creating an issue\n\nPlease try to determine if the issue is caused by an underlying library, and if so, create the issue there. Sometimes this is difficult to know. We only ask that you attempt to give a reasonable attempt to find out. Oftentimes the readme will have advice about where to go to create issues.\n\nTry to follow these guidelines:\n\n- **Avoid creating issues for implementation help** - It's much better for discoverability, SEO, and semantics - to keep the issue tracker focused on bugs and feature requests - to ask implementation-related questions on [stackoverflow.com][so]\n- **Investigate the issue** - Search for exising issues (open or closed) that address the issue, and might have even resolved it already.\n- **Check the readme** - oftentimes you will find notes about creating issues, and where to go depending on the type of issue.\n- Create the issue in the appropriate repository.\n\n### Creating an issue\n\nPlease be as descriptive as possible when creating an issue. Give us the information we need to successfully answer your question or address your issue by answering the following in your issue (or just using the issue template):\n\n- **description**: (required) What is the bug you're experiencing? How are you using this library/app?\n- **OS**: (required) what operating system are you on?\n- **DialogueGraph version**: (required) please note the version of DialogueGraph are you using\n- **Unity version**: (required) please note the version of Unity are you using\n- **error messages**: (required) please paste any error messages into the issue, or a [gist](https://gist.github.com/)\n- **extensions, plugins, helpers, etc** (if applicable): please list any extensions you're using\n\n\n### Closing issues\n\nThe original poster or the maintainers of DialogueGraph may close an issue at any time. Typically, but not exclusively, issues are closed when:\n- The issue is resolved\n- The project's maintainers have determined the issue is out of scope\n- An issue is clearly a duplicate of another issue, in which case the duplicate issue will be linked.\n- A discussion has clearly run its course\n\n\n## Next steps\n\n**Tips for creating idiomatic issues**\n\nSpending just a little extra time to review best practices and brush up on your contributing skills will, at minimum, make your issue easier to read, easier to resolve, and more likely to be found by others who have the same or similar issue in the future. At best, it will open up doors and potential career opportunities by helping you be at your best.\n\nThe following resources were hand-picked to help you be the most effective contributor you can be:\n\n- The [Guide to Idiomatic Contributing](https://github.com/jonschlinkert/idiomatic-contributing) is a great place for newcomers to start, but there is also information for experienced contributors there.\n- Take some time to learn basic markdown. We can't stress this enough. Don't start pasting code into GitHub issues before you've taken a moment to review this [markdown cheatsheet](https://gist.github.com/jonschlinkert/5854601)\n- The GitHub guide to [basic markdown](https://help.github.com/articles/markdown-basics/) is another great markdown resource.\n- Learn about [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown/). And if you want to really go above and beyond, read [mastering markdown](https://guides.github.com/features/mastering-markdown/).\n\nAt the very least, please try to:\n\n- Use backticks to wrap code. This ensures that it retains its formatting and isn't modified when it's rendered by GitHub, and makes the code more readable to others\n- When applicable, use syntax highlighting by adding the correct language name after the first \"code fence\"\nExample:\n> \\```c#  \n>     your code here  \n> \\```\n\n\n[so]: http://stackoverflow.com/questions\n"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2020 Teodor Vecerdi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "LICENSE.md.meta",
    "content": "fileFormatVersion: 2\nguid: 343a6fbf469a693458de3526bd08c60a\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "README.md",
    "content": "# Dialogue Graph\n<!--OpenUPM--><a href=\"https://openupm.com/packages/com.github.teodorvecerdi.dialoguegraph/\"><img alt src=\"https://img.shields.io/npm/v/com.github.teodorvecerdi.dialoguegraph?label=openupm&amp;registry_uri=https://package.openupm.com\" /></a>\n<!--Stars--><a href=\"https://github.com/TeodorVecerdi/DialogueGraph/stargazers\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/TeodorVecerdi/DialogueGraph?color=FFD700\"></a>\n<!--Contributors--><a href=\"https://github.com/TeodorVecerdi/DialogueGraph/graphs/contributors\"><img alt=\"GitHub contributors\" src=\"https://img.shields.io/github/contributors-anon/TeodorVecerdi/DialogueGraph?color=009a00\"></a>\n\n\n<b>Dialogue Graph</b> is an open-source editor tool for the [Unity](https://unity.com/) game engine used to create branching conversation trees in an easy and straightforward way by connecting nodes, and setting up conditions and triggers for the different conversation branches. An obvious use case for this tool is to create conversations with NPCs, although the versatility of this tool allows for any kind of project that requires branching behaviour based on checks and triggers.\n\nDialogue Graph is compatible with the following Unity versions:\n- 2020.3 LTS\n- 2021.2\n\nOther versions of Unity may work as well, but are not tested.\n\n![Nodes](Github~/resources/DialogueGraph_demo_graph.png)  \n\n# Installing Dialogue Graph\n## 1. using OpenUPM\n**Requires [<img src=\"Github~/resources/openupm-icon-64.png\" height=\"24px\" align=\"center\"/> OpenUPM-CLI][openupm-cli]**  \nRun the following on the command line in your unity project's folder:\n\n```sh\nopenupm add com.github.teodorvecerdi.dialoguegraph\n```\n\n## 2. using Git\nTo install Dialogue Graph in your project use the Unity Package Manager.  \nTo open the Unity Package Manager, inside unity, go to `Window > Package Manager` and to install Dialogue Graph click the `+` icon in the upper left corner of the window, then click on `Add package from git URL...` and paste in `https://github.com/TeodorVecerdi/DialogueGraph.git`\n\n\n# Using Dialogue Graph (WIP)\n## Editor\nTo start using Dialogue Graph, create a Dialogue Graph in your assets folder by going to `Assets > Create > Dialogue Graph > Empty Dialogue Graph`.  \nDialogue Graph currently contains four different types of nodes: **NPC**, **Self**, **Property**, and **Boolean**.\n\n### NPC and Self Nodes\n#### General\nTODO\n#### Dialogue Lines\nThe NPC and Self nodes represent the dialogue lines said by either an NPC or the player. After creating one of these two nodes you can add dialogue lines by clicking the `Create Dialogue Line` button on each respective node.  \nEach dialogue line entry comes with additional ports. **Branch** and **Trigger** ports are available to both node types and the **Check** port is available only to NPC nodes.  \nThe **Branch** port connects to the next node in the conversation tree. This connection is used by the runtime engine to progress the conversation once an option (dialogue line) was chosen. Unless you want the conversation to end with that line you should connect the Branch port to another node.  \nThe **Trigger** port connects to one or more Trigger property nodes and is optional (more on that in the [**Property Nodes** section](#property-nodes)).  \nThe **Check** port connects to one or more Check property or Boolean nodes and is optional (more on that in the [**Property Nodes** section](#property-nodes)).\n\n#### Actor Port\nNPC nodes also contain an **Actor** port to which you should connect your Actor Property node (more on that in the [**Property Nodes** section](#property-nodes)). Actor property nodes not only let you differentiate between which character performs the dialogue lines but also allows you to attach any custom data to the actor through scriptable objects.\n\n### Property Nodes\nTODO\n\n### Boolean Nodes\nDialogueGraph contains several nodes that can be used to combine multiple **Check** nodes into one: \n- **NOT Node**: Negates the result of the **Check** port.\n- **AND Node**: Returns true if both **Check** ports are true.\n- **OR Node**: Returns true if either **Check** port is true.\n- **XOR Node**: Returns true if exactly one **Check** port is true.\n- **NAND Node**: Returns true if both **Check** ports are false.\n- **NOR Node**: Returns true if either **Check** port is false.\n- **XNOR Node**: Returns true if exactly one **Check** port is false.\n\nYou can combine multiple boolean nodes together to create more complex conditions.  \nIf a boolean node has a missing connection, then that connection is assumed to be false.\n\n![Boolean Nodes](Github~/resources/DialogueGraph_BooleanNodes.png)\n![All Boolean Nodes](Github~/resources/DialogueGraph_AllBooleanNodes.png)\n\n### Images\nThe following images use the Sample Project included with the package. You can install the Sample Project by going to the package manager, selecting Dialogue Graph, and clicking the `Import` button under Samples.  \nNodes:  \n![Nodes](Github~/resources/DialogueGraph_demo_graph.png)  \n\nProperties: (you can open the properties window by clicking the \"Blackboard\" button in the toolbar at the top of the Dialogue Graph window)  \n![Properties](Github~/resources/DialogueGraph_demo_properties.png)  \n\n## Runtime\n### Images\nNote: The following images use the Sample Project included with the package. You can install the Sample Project by going to the package manager, selecting Dialogue Graph, and clicking the `Import` button under Samples.  \n#### Attaching functions to properties\nAttaching functions to properties is almost identical to the way you would do it with the Unity UI system (Buttons, TextFields, etc). Attach a script to the object field and then choose the method you want to use.  \n\n![Attaching functions to properties](Github~/resources/DialogueGraph_demo_functions.gif)  \n#### Dialogue Graph in action\nCheck the included samples for the API usage.  \n\n![Dialogue Graph in action](Github~/resources/DialogueGraph_demo_sample.gif)  \n\n# Contributing\nIf you would like to contribute to this project feel free to submit a **pull request**, and take a look at the \n[Contributing document](https://github.com/TeodorVecerdi/DialogueGraph/blob/master/Github~/CONTRIBUTING.md \"CONTRIBUTING.md\") provided to get a better insight into what **contributing** means, and the [Code of Conduct](https://github.com/TeodorVecerdi/DialogueGraph/blob/master/Github~/CODE_OF_CONDUCT.md).\n\n# Versioning\nWe use [SemVer](http://semver.org/) for versioning. For the versions available check the [tags on this repository](https://github.com/TeodorVecerdi/DialogueGraph/tags).\n\n# License\nThis project is licensed under the MIT License. See [LICENSE](https://github.com/TeodorVecerdi/DialogueGraph/blob/master/LICENSE) for more details.\n\n[openupm-cli]: https://openupm.com/docs/getting-started.html#installing-openupm-cli\n"
  },
  {
    "path": "README.md.meta",
    "content": "fileFormatVersion: 2\nguid: 4f8ca7a64146b1442be43e037a67e778\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Inspector/ActorEditor.uxml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<engine:UXML\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xmlns:engine=\"UnityEngine.UIElements\"\n        xmlns:editor=\"UnityEditor.UIElements\"\n        xsi:noNamespaceSchemaLocation=\"../../../../UIElementsSchema/UIElements.xsd\"\n>\n    <engine:VisualElement class=\"actor-container\">\n        <engine:Label name=\"actorIdentifier\" class=\"actor-title\"/>\n        <engine:TextField label=\"Name\" name=\"actorName\" class=\"actor-name\"/>\n        <editor:ObjectField name=\"customActorData\" label=\"Custom Data\"/>\n    </engine:VisualElement>\n\n\n</engine:UXML>"
  },
  {
    "path": "Resources/Inspector/ActorEditor.uxml.meta",
    "content": "﻿fileFormatVersion: 2\nguid: e3dc224962364528a151499f82d24abf\ntimeCreated: 1603703586"
  },
  {
    "path": "Resources/Inspector/CheckEditor.uxml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<engine:UXML\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xmlns:engine=\"UnityEngine.UIElements\"\n        xmlns:editor=\"UnityEditor.UIElements\"\n        xsi:noNamespaceSchemaLocation=\"../../../../UIElementsSchema/UIElements.xsd\"\n>\n    <engine:VisualElement name=\"checkContainer\" class=\"check-container\">\n        <engine:Label name=\"checkIdentifier\" class=\"check-title\"/>\n    </engine:VisualElement>\n\n\n</engine:UXML>"
  },
  {
    "path": "Resources/Inspector/CheckEditor.uxml.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 4d96915c1ad84ce3bc8f9770f5153485\ntimeCreated: 1603705529"
  },
  {
    "path": "Resources/Inspector/DlogObjectEditor.uxml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<UXML\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xmlns=\"UnityEngine.UIElements\"\n        xmlns:editor=\"UnityEditor.UIElements\"\n        xsi:noNamespaceSchemaLocation=\"../../../../UIElementsSchema/UIElements.xsd\"\n>\n    <VisualElement class=\"container\">\n        <Label text=\"Dialogue Graph\" class=\"heading\"/>\n        <editor:ObjectField name=\"dlogObjectField\" label=\"Dialogue Graph Object\" allow-scene-objects=\"false\"/>\n        <Button name=\"clearData\" text=\"Clear data cache\" tooltip=\"Warning! This will clear all assigned properties from every DialogueGraph Object\"/>\n        <VisualElement name=\"propertiesContainer\">\n            <Foldout class=\"container-inner\" text=\"Checks\">\n                <VisualElement name=\"checkList\"/>\n            </Foldout>\n            <Foldout class=\"container-inner\" text=\"Triggers\">\n                <VisualElement name=\"triggerList\"/>\n            </Foldout>\n            <Foldout class=\"container-inner\" text=\"Actors\">\n                <VisualElement name=\"actorList\"/>\n            </Foldout>\n        </VisualElement>\n        <Label name=\"invalidContainer\"\n               text=\"Please assign a valid Dialogue Object\"\n               class=\"error-text hidden\"/>\n    </VisualElement>\n\n\n</UXML>"
  },
  {
    "path": "Resources/Inspector/DlogObjectEditor.uxml.meta",
    "content": "fileFormatVersion: 2\nguid: cc78fdd42080cd14f85af71ac9003dd4\nScriptedImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 2\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n  script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}\n"
  },
  {
    "path": "Resources/Inspector/Styles/ActorEditor.uss",
    "content": ".actor-container {\n    background-color: #3b3b3b;\n    margin: 5px;\n    margin-left: -25px;\n    padding: 5px;\n    border-width: 1px;\n    border-radius: 5px;\n    border-color: #282828;\n}\n\n.actor-title {\n    margin: 5px 0 10px;\n    font-size: 16px;\n    -unity-font-style: bold;\n    -unity-text-align: middle-left;\n}\n\n.actor-name {\n    \n}"
  },
  {
    "path": "Resources/Inspector/Styles/ActorEditor.uss.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 2807a92595d34d228fe9aad795c613f3\ntimeCreated: 1603703586"
  },
  {
    "path": "Resources/Inspector/Styles/CheckEditor.uss",
    "content": ".check-container {\n    background-color: #3b3b3b;\n    margin: 5px;\n    margin-left: -25px;\n    padding: 5px;\n    border-width: 1px;\n    border-radius: 5px;\n    border-color: #282828;\n}\n\n.check-title {\n    margin: 5px 0 10px;\n    font-size: 16px;\n    -unity-font-style: bold;\n    -unity-text-align: middle-left;\n}\n"
  },
  {
    "path": "Resources/Inspector/Styles/CheckEditor.uss.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 60b499fdae6e43ab9240cd7a914f9efb\ntimeCreated: 1603705529"
  },
  {
    "path": "Resources/Inspector/Styles/DlogObjectEditor.uss",
    "content": ".container {\n    background-color: #222222;\n    margin: 5px 10px 5px 0;\n    padding: 5px;\n    border-width: 3px;\n    border-radius: 10px;\n    border-color: #181818;\n}\n\n#propertiesContainer {\n    margin-top: 8px;\n}\n\n.container-inner {\n    background-color: #393939;\n    margin: 5px 0;\n    padding: 5px;\n    padding-left: 20px;\n    border-width: 1px;\n    border-radius: 5px;\n    border-color: #282828;\n}\n.container-inner Toggle Label {\n    font-size: 20px;\n    flex-grow: 1;\n    margin-left: -10px;\n    -unity-font-style: bold;\n    -unity-text-align: middle-center;\n}\n.container-inner Toggle VisualElement#unity-checkmark {\n    align-self: center;\n}\n.heading{\n    margin: 5px 0 10px;\n    font-size: 20px;\n    -unity-font-style: bold;\n    -unity-text-align: middle-center;\n}\n\n.error-text {\n    margin: 10px 0;\n    font-size: 14px;\n    -unity-font-style: bold;\n    -unity-text-align: middle-center;\n    white-space: normal;\n    color: #E71F00;\n}\n\n.hidden {\n    display: none;\n}\n\n#clearData {\n    padding: 6px 0;\n    margin: 12px 0 4px 0;\n    color: #ffffff;\n}"
  },
  {
    "path": "Resources/Inspector/Styles/DlogObjectEditor.uss.meta",
    "content": "fileFormatVersion: 2\nguid: 5c6c3742d93046943a6040e04d1b0424\nScriptedImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 2\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n  script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}\n  disableValidation: 0\n"
  },
  {
    "path": "Resources/Inspector/Styles/TriggerEditor.uss",
    "content": ".trigger-container {\n    background-color: #3b3b3b;\n    margin: 5px;\n    margin-left: -25px;\n    padding: 5px;\n    border-width: 1px;\n    border-radius: 5px;\n    border-color: #282828;\n}\n\n.trigger-title {\n    margin: 5px 0 10px;\n    font-size: 16px;\n    -unity-font-style: bold;\n    -unity-text-align: middle-left;\n}\n"
  },
  {
    "path": "Resources/Inspector/Styles/TriggerEditor.uss.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 0e06085925734968ae24bf42932ad179\ntimeCreated: 1603705571"
  },
  {
    "path": "Resources/Inspector/Styles.meta",
    "content": "﻿fileFormatVersion: 2\nguid: fd3a39cf9a0c44188e1ce61d00508862\ntimeCreated: 1603705966"
  },
  {
    "path": "Resources/Inspector/TriggerEditor.uxml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<engine:UXML\n        xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n        xmlns:engine=\"UnityEngine.UIElements\"\n        xmlns:editor=\"UnityEditor.UIElements\"\n        xsi:noNamespaceSchemaLocation=\"../../../../UIElementsSchema/UIElements.xsd\"\n>\n    <engine:VisualElement name=\"triggerContainer\" class=\"trigger-container\">\n        <engine:Label name=\"triggerIdentifier\" class=\"trigger-title\"/>\n    </engine:VisualElement>\n\n\n</engine:UXML>"
  },
  {
    "path": "Resources/Inspector/TriggerEditor.uxml.meta",
    "content": "﻿fileFormatVersion: 2\nguid: d8aeea66075a45f7a38c9852736c4f77\ntimeCreated: 1603705571"
  },
  {
    "path": "Resources/Inspector.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 87b2bd76864b4a678398fb93aa264fc8\ntimeCreated: 1603703549"
  },
  {
    "path": "Resources/Styles/Graph.uss",
    "content": "﻿BlackboardRow.hovered #pill #selection-border {\n    background-color: rgba(68, 192, 255, 0.4);\n    border-color: #44C0FF;\n    border-width: 2px;\n    left: 1px;\n    right: 1px;\n    top: 1px;\n    bottom: 1px;\n}\n\nEditorView {\n    flex-direction: column;\n    flex: 1;\n}\n\nEditorView > #content {\n    flex-direction: row;\n    flex: 1;\n}\n\nEditorView > #content > DlogGraphView {\n    flex: 1;\n}\n\nEditorView > #content > DlogGraphView > GridBackground {\n    --grid-background-color: #282828;\n    --line-color: rgba(55, 55, 55, 0.2);\n    --thick-line-color: rgba(20, 20, 20, 0.4);\n    --spacing: 20;\n}"
  },
  {
    "path": "Resources/Styles/Graph.uss.meta",
    "content": "fileFormatVersion: 2\nguid: 060cede1a4d3f3c4aabfba9959daa453\nScriptedImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 2\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n  script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}\n  disableValidation: 0\n"
  },
  {
    "path": "Resources/Styles/Node/BooleanNode.uss",
    "content": "#boolean-main {\n    display: flex;\n    flex-direction: row;\n    align-content: center;\n    -unity-background-image-tint-color: rgba(114, 64, 253, 0.7);\n    -unity-background-scale-mode: scale-to-fit;\n    min-width: 0;\n    width: 64px;\n}\n\n#contents {\n    display: none;\n}\n\n.node.NOT  #boolean-main { background-image: resource(\"Textures/boolean/NOT\");  }\n.node.AND  #boolean-main { background-image: resource(\"Textures/boolean/AND\");  }\n.node.OR   #boolean-main { background-image: resource(\"Textures/boolean/OR\");   }\n.node.XOR  #boolean-main { background-image: resource(\"Textures/boolean/XOR\");  }\n.node.NAND #boolean-main { background-image: resource(\"Textures/boolean/NAND\"); }\n.node.NOR  #boolean-main { background-image: resource(\"Textures/boolean/NOR\");  }\n.node.XNOR #boolean-main { background-image: resource(\"Textures/boolean/XNOR\"); }\n\n#boolean-main .boolean-column {\n    flex: 1 0;\n    align-self: center;\n}\n\n#boolean-main #boolean-input.boolean-column {\n    margin-left: 3px;\n}\n\n#boolean-main #boolean-output.boolean-column {\n    margin-right: 3px;\n}\n\n#boolean-main #boolean-operation.boolean-column {\n    flex: 1 0;\n    -unity-text-align: middle-center;\n    -unity-font-style: bold;\n    font-size: 12px;\n    color: white;\n    width: 32px;\n    padding: 0 0px;\n}\n\n#title {\n    border-radius: 5px;\n}\n\n.node {\n    --boolean-selection: #7340ff;\n    --boolean-node: #452aa7;\n}\n\n.node #title {\n    background-color: var(--boolean-node);\n}\n.node:checked #selection-border, .node:hover #selection-border, .node:checked:hover #selection-border  {\n    border-color: var(--boolean-selection);\n}"
  },
  {
    "path": "Resources/Styles/Node/BooleanNode.uss.meta",
    "content": "fileFormatVersion: 2\nguid: 7031cb1d9ff34f9484733e7b0bc5fef8\ntimeCreated: 1649584718"
  },
  {
    "path": "Resources/Styles/Node/CombinerNode.uss",
    "content": "#combiner-main {\n    display: flex;\n    flex-direction: row;\n    align-content: center;\n    -unity-background-image-tint-color: rgba(114, 64, 253, 0.7);\n    -unity-background-scale-mode: scale-to-fit;\n    min-width: 0;\n    width: 64px;\n}\n\n#contents {\n    display: none;\n}\n\n#combiner-main.AND {\n    background-image: resource(\"Textures/checkCombinerBackgroundAnd\");\n}\n\n#combiner-main.OR {\n    background-image: resource(\"Textures/checkCombinerBackgroundOr\");\n}\n\n#combiner-main .combiner-column {\n    flex: 1 0;\n    align-self: center;\n}\n\n#combiner-main #combiner-input.combiner-column {\n    margin-left: 3px;\n}\n\n#combiner-main #combiner-output.combiner-column {\n    margin-right: 3px;\n}\n\n#combiner-main #combiner-operation.combiner-column {\n    flex: 1 0;\n    -unity-text-align: middle-center;\n    -unity-font-style: bold;\n    font-size: 12px;\n    color: white;\n    width: 32px;\n    padding: 0 0px;\n}\n\n#title {\n    border-radius: 5px;\n}\n\n.node {\n    --combiner-selection: #7340ff;\n    --combiner-node: #452aa7;\n}\n\nCheckCombinerNode #title {\n    background-color: var(--combiner-node);\n}\nCheckCombinerNode:checked #selection-border, CheckCombinerNode:hover #selection-border, CheckCombinerNode:checked:hover #selection-border  {\n    border-color: var(--combiner-selection);\n}"
  },
  {
    "path": "Resources/Styles/Node/CombinerNode.uss.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 0d36a0af619a4a149de941ea755803fd\ntimeCreated: 1605349106"
  },
  {
    "path": "Resources/Styles/Node/Node.uss",
    "content": "/**\n * @section Conversation Line\n */\n#conversation-container {\n    display: flex;\n    flex-wrap: wrap;\n    flex-direction: row;\n    padding-left: 8px;\n    align-content: center;\n}\n\n#conversation-container #conversation-item {\n    flex: 1 0;\n}\n\n#conversation-container #conversation-item.message {\n    flex-basis: auto;\n    white-space: normal;\n}\n\n#conversation-item.message Label {\n    min-width: auto;\n    align-self: center;\n}\n\n#conversation-item.message TextInput {\n    margin-left: 8px;\n    min-width: 150px;\n    max-width: 200px;\n}\n\n#conversation-container #conversation-item.branch-port {\n    flex-basis: auto;\n    align-self: center;\n}\n\n#conversation-container #conversation-item.trigger-port {\n    flex-basis: 90%;\n}\n\nNpcNode #conversation-container #conversation-item.trigger-port {\n    flex-basis: 75%;\n}\n#conversation-container #conversation-item.check-port {\n    flex-basis: auto;\n    padding-left: 0;\n}\n\n#conversation-container #conversation-item.remove-button {\n    flex-basis: 5%;\n    min-width: 0;\n}\n\n.node.collapsed #conversation-container #conversation-item.remove-button {\n    display: none;\n}\n\n#lineTitle {\n    display: none;\n    align-self: center;\n    padding-bottom: 8px;\n    -unity-font-style: bold;\n    -unity-text-align: upper-left;\n}\n#lineTitle.visible {\n    display: flex;\n}\n\n/*\n * @section General Node\n */\n\n#node-border {\n    overflow: visible;\n    border-width: 0;\n}\n#selection-border {\n    margin: 2px;\n    border-radius: 6px;\n    border-width: 1px;\n    border-color: #191919;\n}\n\n.node:checked #selection-border, .node:hover:checked #selection-border {\n    border-width: 3px;\n    margin: 1px;\n}\n\n#title {\n    border-top-left-radius: 5px;\n    border-top-right-radius: 5px;\n}\nPropertyNode #title, #collapsible-area {\n    border-bottom-left-radius: 5px;\n    border-bottom-right-radius: 5px;\n}\n\n#title-container {\n    display: flex;\n    flex-direction: row;\n    flex-wrap: nowrap;\n    align-items: center;\n}\n\n#npc-title-port-container {\n    display: flex;\n    flex-direction: column;\n    flex-wrap: nowrap;\n    align-items: flex-start;\n}\n\n#npc-title-port-container DlogPort {\n    height: 24px;\n}\n\nNpcNode #title {\n    height: auto;\n}\n\n#title-label {\n    -unity-font-style: bold;\n    color: #e2e2e2;\n    margin-left: 16px;\n}\n\nPropertyNode #title-label {\n    margin-left: 6px;\n    /*margin-right: -4px;*/\n}\n\nPropertyNode #collapse-button {\n    display: none;\n}\n\nPropertyNode #title {\n    align-items: center;\n}\n\nPropertyNode #title.property-port-input #title-label {\n    margin-left: 0px;\n    margin-right: 6px;\n}\n\n/*\n * @section Misc\n */\n.flex-break {\n    height: 0;\n    flex-basis: 100%;\n}\n\n#divider.horizontal-divider {\n    margin-bottom: 6px;\n    margin-top: 4px;\n}\n\n/*\n * @section Specific node styling\n */\n.node {\n    --self-selection: #10f52f;\n    --self-node: #229f31;\n    --self-collapse: #058311;\n    \n    --npc-selection: #3094f1;\n    --npc-node: #0d68b7;\n    --npc-collapse: rgba(10, 87, 155, 255);\n\n    --check-selection: #7ff8fd;\n    --check-node: #2a98a7;\n    --check-collapse: rgba(27, 107, 122, 255);\n    \n    --trigger-selection: #d5293d;\n    --trigger-node: #8d131a;\n    --trigger-collapse: rgba(107, 10, 16, 255);\n    \n    --actor-selection: #befd5c;\n    --actor-node: #71a713;\n    --actor-collapse: rgba(71, 102, 10, 255);\n    \n    --extension-padding: 4px 4px;\n}\n\n.node #collapsible-area {\n    background-color: #212121;\n}\n.node #extension {\n    padding: var(--extension-padding);\n}\n\nSelfNode #title {\n    background-color: var(--self-node);\n}\nSelfNode:checked #selection-border, SelfNode:hover #selection-border, SelfNode:checked:hover #selection-border  {\n    border-color: var(--self-selection);\n}\nSelfNode:hover #collapse-button:hover > #icon {\n    background-color: var(--self-collapse);\n}\n\nNpcNode #title, NpcNode #collapsible-area {\n    background-color: var(--npc-node);\n}\n\nNpcNode:checked #selection-border, NpcNode:hover #selection-border, NpcNode:checked:hover #selection-border  {\n    border-color: var(--npc-selection);\n}\nNpcNode:hover #collapse-button:hover > #icon {\n    background-color: var(--npc-collapse);\n}\nPropertyNode.Check #title {\n    background-color: var(--check-node);\n}\nPropertyNode.Check:checked #selection-border, PropertyNode.Check:hover #selection-border, PropertyNode.Check:checked:hover #selection-border  {\n    border-color: var(--check-selection);\n}\n\nPropertyNode.Trigger #title {\n    background-color: var(--trigger-node);\n}\nPropertyNode.Trigger:checked #selection-border, PropertyNode.Trigger:hover #selection-border, PropertyNode.Trigger:checked:hover #selection-border   {\n    border-color: var(--trigger-selection);\n}\n\nPropertyNode.Actor #title {\n    background-color: var(--actor-node);\n}\nPropertyNode.Actor:checked #selection-border, PropertyNode.Actor:hover #selection-border, PropertyNode.Actor:checked:hover #selection-border {\n    border-color: var(--actor-selection);\n}"
  },
  {
    "path": "Resources/Styles/Node/Node.uss.meta",
    "content": "﻿fileFormatVersion: 2\nguid: ed57dcb33edc4260816b9abdfe6c069e\ntimeCreated: 1602666163"
  },
  {
    "path": "Resources/Styles/Node/Port.uss",
    "content": ".optional #connector {\n    border-radius: 2px;\n}\n\n.optional #connector #cap {\n    border-radius: 1px;\n}\n#connector #cap {\n    border-width: 1px;\n    margin: -1px;\n}\nDlogPort.input {\n    margin-left: -12px;\n}\n\nDlogPort.check-port {\n    margin-left: -16px;\n}\n\nDlogPort.output {\n    margin-right: -12px;\n}"
  },
  {
    "path": "Resources/Styles/Node/Port.uss.meta",
    "content": "﻿fileFormatVersion: 2\nguid: ee8ee6bb36ee46d3aae463d78c6def9a\ntimeCreated: 1603100724"
  },
  {
    "path": "Resources/Styles/Node.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 12803ba540bf438193aca84a6241bf65\ntimeCreated: 1603100698"
  },
  {
    "path": "Resources/Styles/PropertyView/Blackboard.uss",
    "content": ".blackboardPropertyView * {\n    font-size: 11px;\n}\n\n.blackboardPropertyView > .rowView {\n    flex-direction: row;\n    padding: 2px 2px 2px 10px;\n}\n\n.blackboardPropertyView > .rowView > .rowViewLabel {\n    min-width: 50px;\n}\n\n.blackboardPropertyView > .rowView > .rowViewControl {\n    flex: 1;\n}\n\n.blackboardPropertyView > .unity-imgui-container {\n    margin: 4px 4px 4px 16px;\n} "
  },
  {
    "path": "Resources/Styles/PropertyView/Blackboard.uss.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 409fce4360c44750a48b43afce2aba00\ntimeCreated: 1602595816"
  },
  {
    "path": "Resources/Styles/PropertyView/ReferenceNameField.uss",
    "content": "TextField.modified {\n    -unity-font-style: bold;\n}"
  },
  {
    "path": "Resources/Styles/PropertyView/ReferenceNameField.uss.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 6bd953b64344481799733c9bb968bd54\ntimeCreated: 1602595511"
  },
  {
    "path": "Resources/Styles/PropertyView.meta",
    "content": "﻿fileFormatVersion: 2\nguid: ca03c1c1972a40f2a82718a67ce3f04a\ntimeCreated: 1602595469"
  },
  {
    "path": "Resources/Styles.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 6c89d47bb2eb449c94882737ee7eb001\ntimeCreated: 1602595410"
  },
  {
    "path": "Resources/Textures/boolean/AND.png.meta",
    "content": "fileFormatVersion: 2\nguid: 1e7f29a3772407f40986bb02e3aed942\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/boolean/NAND.png.meta",
    "content": "fileFormatVersion: 2\nguid: 33a67847867b5224786f74bea21fcdc0\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/boolean/NOR.png.meta",
    "content": "fileFormatVersion: 2\nguid: 389d50dd4f3ad8b46b93350a26f5466e\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/boolean/NOT.png.meta",
    "content": "fileFormatVersion: 2\nguid: 164974e3e36ba754da1396ed481a55ff\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/boolean/OR.png.meta",
    "content": "fileFormatVersion: 2\nguid: d8317a8812789ba4786c9f4f0a7289d1\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/boolean/XNOR.png.meta",
    "content": "fileFormatVersion: 2\nguid: e9c4c5754005f2643b9622ce96ec691d\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/boolean/XOR.png.meta",
    "content": "fileFormatVersion: 2\nguid: 6f52438f5357f5d428f43922acf358c3\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/boolean.meta",
    "content": "fileFormatVersion: 2\nguid: c8cbe137e91e42c4fbe2406be2bed02e\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/checkCombinerBackgroundAnd.png.meta",
    "content": "fileFormatVersion: 2\nguid: 8bdedca6d5208204f8a9b8ece936a3e4\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 4096\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 4096\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: WebGL\n    maxTextureSize: 4096\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 4096\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/checkCombinerBackgroundOr.png.meta",
    "content": "fileFormatVersion: 2\nguid: 522a0d49ef4a9844f81456b2e5bef056\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 1\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/dloggraph_256.png.meta",
    "content": "fileFormatVersion: 2\nguid: b7bedd588747a674db8de4b63f3015a7\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: -1\n    aniso: 2\n    mipBias: -100\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/dloggraph_error_256.psd.meta",
    "content": "fileFormatVersion: 2\nguid: c03e8c72a7fa3aa499b9c7e7f79a0d4f\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  ignoreMasterTextureLimit: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 1\n    aniso: 2\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  flipbookRows: 1\n  flipbookColumns: 1\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Server\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n    nameFileIdTable: {}\n  spritePackingTag: \n  pSDRemoveMatte: 1\n  pSDShowRemoveMatteOption: 1\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures/dloggraph_runtime_256.png.meta",
    "content": "fileFormatVersion: 2\nguid: 4e0491b0c74c2fd46900f1f97598264d\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: -1\n    aniso: 2\n    mipBias: -100\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 1\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 0\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 100\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 0\n  textureShape: 1\n  singleChannelComponent: 0\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline: []\n    physicsShape: []\n    bones: []\n    spriteID: \n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources/Textures.meta",
    "content": "fileFormatVersion: 2\nguid: d106c90abd3dbbe4584197a66eb23151\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Resources.meta",
    "content": "fileFormatVersion: 2\nguid: f00a44575d3b12a41b56aa91be30fb81\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/Data/ActorData.cs",
    "content": "using System;\nusing UnityEngine;\n\nnamespace DialogueGraph.Runtime {\n    [Serializable]\n    public class ActorData {\n        public string Name;\n        public ScriptableObject CustomData;\n        public Property Property;\n\n        public ActorData(string name, ScriptableObject customData, Property property) {\n            Name = name;\n            CustomData = customData;\n            Property = property;\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Data/ActorData.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 6fe27ada8fab4783ba1d6ca728360a1f\ntimeCreated: 1603704055"
  },
  {
    "path": "Runtime/Data/BooleanOperation.cs",
    "content": "namespace DialogueGraph {\n    public enum BooleanOperation {\n        // Unary\n        NOT,\n\n        // Binary\n        AND,\n        OR,\n        XOR,\n        NAND,\n        NOR,\n        XNOR,\n    }\n}"
  },
  {
    "path": "Runtime/Data/BooleanOperation.cs.meta",
    "content": "fileFormatVersion: 2\nguid: 8fa8640c35844f2f97b6f10cc671c8d8\ntimeCreated: 1649584458"
  },
  {
    "path": "Runtime/Data/CheckTree.cs",
    "content": "using System;\nusing UnityEngine;\n\nnamespace DialogueGraph.Runtime {\n    [Serializable]\n    public class CheckTree : ISerializationCallbackReceiver {\n        public enum Kind {\n            Property,\n            Unary,\n            Binary\n        }\n\n        public Kind NodeKind;\n        public BooleanOperation BooleanOperation;\n\n        // For NodeKind == Property, also if this is null and NodeKind == Property, then the property is assumed to be false\n        public string PropertyGuid;\n\n        // ForNodeKind == Unary and Binary\n        [NonSerialized] public CheckTree SubtreeA;\n\n        // For NodeKind == Binary\n        [NonSerialized] public CheckTree SubtreeB;\n\n        [SerializeField] private string m_SerializedSubtreeA;\n        [SerializeField] private string m_SerializedSubtreeB;\n\n        public static CheckTree Property(string propertyGuid) {\n            return new CheckTree {\n                NodeKind = Kind.Property,\n                PropertyGuid = propertyGuid\n            };\n        }\n\n        public static CheckTree Unary(BooleanOperation operation, CheckTree subtree) {\n            return new CheckTree {\n                NodeKind = Kind.Unary,\n                BooleanOperation = operation,\n                SubtreeA = subtree\n            };\n        }\n\n        public static CheckTree Binary(BooleanOperation operation, CheckTree subtreeA, CheckTree subtreeB) {\n            return new CheckTree {\n                NodeKind = Kind.Binary,\n                BooleanOperation = operation,\n                SubtreeA = subtreeA,\n                SubtreeB = subtreeB\n            };\n        }\n\n        public void OnBeforeSerialize() {\n            switch (NodeKind) {\n                case Kind.Property:\n                    m_SerializedSubtreeA = null;\n                    m_SerializedSubtreeB = null;\n                    break;\n                case Kind.Unary:\n                    m_SerializedSubtreeA = SubtreeA != null ? JsonUtility.ToJson(SubtreeA) : \"\";\n                    m_SerializedSubtreeB = null;\n                    break;\n                case Kind.Binary:\n                    m_SerializedSubtreeA = SubtreeA != null ? JsonUtility.ToJson(SubtreeA) : \"\";\n                    m_SerializedSubtreeB = SubtreeB != null ? JsonUtility.ToJson(SubtreeB) : \"\";\n                    break;\n            }\n        }\n\n        public void OnAfterDeserialize() {\n            switch (NodeKind) {\n                case Kind.Property:\n                    m_SerializedSubtreeA = null;\n                    m_SerializedSubtreeB = null;\n                    break;\n                case Kind.Unary:\n                    SubtreeA = m_SerializedSubtreeA != \"\" ? JsonUtility.FromJson<CheckTree>(m_SerializedSubtreeA) : null;\n                    m_SerializedSubtreeB = null;\n                    break;\n                case Kind.Binary:\n                    SubtreeA = m_SerializedSubtreeA != \"\" ? JsonUtility.FromJson<CheckTree>(m_SerializedSubtreeA) : null;\n                    SubtreeB = m_SerializedSubtreeB != \"\" ? JsonUtility.FromJson<CheckTree>(m_SerializedSubtreeB) : null;\n                    break;\n            }\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Data/CheckTree.cs.meta",
    "content": "fileFormatVersion: 2\nguid: c77290811aed4df9b8dd951012624262\ntimeCreated: 1649586584"
  },
  {
    "path": "Runtime/Data/ConversationLine.cs",
    "content": "using System;\nusing System.Collections.Generic;\n\nnamespace DialogueGraph.Runtime {\n    [Serializable]\n    public class ConversationLine {\n        public string Message;\n        public string Next;\n        public string TriggerPort;\n        public string CheckPort;\n        public List<string> Triggers;\n        public List<string> Checks;\n        public List<CheckTree> CheckTrees;\n    }\n}"
  },
  {
    "path": "Runtime/Data/ConversationLine.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: ea8481d7d46244e2a13cabed9f981b69\ntimeCreated: 1603620926"
  },
  {
    "path": "Runtime/Data/DlogObject.cs",
    "content": "using System;\nusing UnityEngine;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace DialogueGraph.Runtime {\n    public class DlogObject : ScriptableObject {\n        // Graph data\n        [SerializeField] public List<Node> Nodes;\n        [SerializeField] public List<Edge> Edges;\n        [SerializeField] public List<Property> Properties;\n        [SerializeField] public string StartNode;\n\n        public NodeDictionary NodeDictionary;\n        public PropertyDictionary PropertyDictionary;\n\n        public void BuildGraph() {\n            PropertyDictionary = new PropertyDictionary();\n            foreach (var property in Properties) {\n                PropertyDictionary.Add(property.Guid, property);\n            }\n\n            NodeDictionary = new NodeDictionary();\n            foreach (var node in Nodes) {\n                NodeDictionary.Add(node.Guid, node);\n            }\n\n            // Link node lines with actual properties, find previous node and actor node where necessary\n            var propertyNodes = Nodes.Where(node => node.Type == NodeType.PROP).ToDictionary(node => node.Guid, node => node);\n\n            // convert each conversation line reference from port to property lists using edge list\n            foreach (var node in Nodes) {\n                if (node.Type != NodeType.SELF && node.Type != NodeType.NPC) continue;\n                foreach (var line in node.Lines) {\n                    line.Checks = new List<string>();\n                    line.CheckTrees = new List<CheckTree>();\n                    line.Triggers = new List<string>();\n                    string setNext = null;\n                    foreach (var edge in Edges) {\n                        // Find triggers\n                        if (line.TriggerPort == edge.FromPort) {\n                            var nodeGuid = edge.ToNode;\n                            line.Triggers.Add(propertyNodes[nodeGuid].Temp_PropertyNodeGuid);\n                        }\n\n                        // Find checks, only for NPC nodes\n                        if (node.Type == NodeType.NPC && line.CheckPort == edge.ToPort) {\n                            if (NodeDictionary[edge.FromNode].Type == NodeType.PROP) {\n                                var nodeGuid = edge.FromNode;\n                                line.Checks.Add(propertyNodes[nodeGuid].Temp_PropertyNodeGuid);\n                            }\n\n                            line.CheckTrees.Add(ParseCheckTree(edge, propertyNodes));\n                        }\n\n                        // Find next node\n                        if (edge.FromNode == node.Guid && line.Next == edge.FromPort)\n                            setNext = edge.ToNode;\n                    }\n\n                    line.Next = setNext;\n                }\n\n                foreach (var edge in Edges) {\n                    // Find actor node\n                    if (edge.ToNode == node.Guid && node.Type == NodeType.NPC && propertyNodes.ContainsKey(edge.FromNode) && PropertyDictionary[propertyNodes[edge.FromNode].Temp_PropertyNodeGuid].Type == PropertyType.Actor)\n                        node.ActorGuid = propertyNodes[edge.FromNode].Temp_PropertyNodeGuid;\n\n                    // Find previous node\n                    if (edge.ToNode == node.Guid && (NodeDictionary[edge.FromNode].Type == NodeType.NPC || NodeDictionary[edge.FromNode].Type == NodeType.SELF))\n                        node.Previous = edge.FromNode;\n                }\n            }\n\n            // Remove property nodes from Nodes and NodeDictionary\n            var copyOfNodes = Nodes.ToList();\n            copyOfNodes.ForEach(node => {\n                if (node.Type == NodeType.NPC || node.Type == NodeType.SELF) return;\n                NodeDictionary.Remove(node.Guid);\n                Nodes.Remove(node);\n            });\n\n            // Find start node\n            foreach (var node in Nodes) {\n                if (!string.IsNullOrEmpty(node.Previous))\n                    continue;\n\n                if (!string.IsNullOrEmpty(StartNode) && StartNode != node.Guid) {\n                    Debug.LogWarning(\"Multiple nodes without a previous node detected! Defaulting to the first one found to be the start node.\");\n                    continue;\n                }\n\n                StartNode = node.Guid;\n            }\n        }\n\n        private CheckTree ParseCheckTree(Edge edge, Dictionary<string, Node> propertyNodes) {\n            if (edge == null) {\n                Debug.LogError(\"ParseCheckTree: Edge is null!\");\n                return null;\n            }\n\n            Node node = NodeDictionary[edge.FromNode];\n            if (node.Type < NodeType.BOOLEAN_START || node.Type > NodeType.BOOLEAN_END) {\n                string propertyGuid = propertyNodes.ContainsKey(edge.FromNode) ? propertyNodes[edge.FromNode].Temp_PropertyNodeGuid : null;\n                return CheckTree.Property(propertyGuid);\n            }\n\n            BooleanOperation operation = (BooleanOperation)Enum.Parse(typeof(BooleanOperation), node.Type.ToString().Replace(\"BOOLEAN_\", \"\"));\n            if (node.Type == NodeType.BOOLEAN_NOT) {\n                Edge notEdge = Edges.FirstOrDefault(e => e.ToNode == node.Guid);\n                return CheckTree.Unary(operation, ParseCheckTree(notEdge, propertyNodes));\n            }\n\n            List<Edge> edges = Edges.Where(e => e.ToNode == node.Guid).ToList();\n            Edge edgeA = edges[0];\n            Edge edgeB = edges[1];\n            return CheckTree.Binary(operation, ParseCheckTree(edgeA, propertyNodes), ParseCheckTree(edgeB, propertyNodes));\n        }\n    }\n}"
  },
  {
    "path": "Runtime/Data/DlogObject.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: f76b58038417453d950110957befa752\ntimeCreated: 1603619274"
  },
  {
    "path": "Runtime/Data/Edge.cs",
    "content": "using System;\n\nnamespace DialogueGraph.Runtime {\n    [Serializable]\n    public class Edge {\n        public string FromNode;\n        public string FromPort;\n        public string ToNode;\n        public string ToPort;\n    }\n}"
  },
  {
    "path": "Runtime/Data/Edge.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: d6665cf8370548428114252096b3fcc2\ntimeCreated: 1603620572"
  },
  {
    "path": "Runtime/Data/Node.cs",
    "content": "using System;\nusing System.Collections.Generic;\n\nnamespace DialogueGraph.Runtime {\n    [Serializable]\n    public class Node {\n        public NodeType Type;\n        public string Guid;\n\n        public string ActorGuid;\n\n        /// <summary>\n        /// Since multiple nodes can be a previous node to a certain node, we are only\n        /// using this property to find out where the graph begins. We don't care if a\n        /// node has multiple previous nodes because you never need to backtrack in the\n        /// graph. You will only walk forwards in the graph.\n        /// </summary>\n        public string Previous;\n        public List<ConversationLine> Lines;\n        public string Temp_PropertyNodeGuid;\n    }\n\n    public enum NodeType {\n        NPC,\n        SELF,\n        PROP,\n\n        BOOLEAN_NOT,\n        BOOLEAN_AND,\n        BOOLEAN_OR,\n        BOOLEAN_XOR,\n        BOOLEAN_NAND,\n        BOOLEAN_NOR,\n        BOOLEAN_XNOR,\n\n        BOOLEAN_START = BOOLEAN_NOT,\n        BOOLEAN_END = BOOLEAN_XNOR,\n    }\n}"
  },
  {
    "path": "Runtime/Data/Node.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 41de68f3599a45bfae3768ae58c5fc7e\ntimeCreated: 1603621136"
  },
  {
    "path": "Runtime/Data/Properties/Property.cs",
    "content": "using System;\n\nnamespace DialogueGraph.Runtime {\n    [Serializable]\n    public class Property {\n        public string Guid;\n        public string ReferenceName;\n        public string DisplayName;\n        public PropertyType Type;\n    }\n}"
  },
  {
    "path": "Runtime/Data/Properties/Property.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 4b76e31ff1d04c4890c9895b10f5764c\ntimeCreated: 1603620591"
  },
  {
    "path": "Runtime/Data/Properties/PropertyType.cs",
    "content": "namespace DialogueGraph.Runtime {\n    public enum PropertyType {\n        Trigger,\n        Check,\n        Actor\n    }\n}"
  },
  {
    "path": "Runtime/Data/Properties/PropertyType.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: ff46fcc0237e468aa6244181088dfe62\ntimeCreated: 1602591880"
  },
  {
    "path": "Runtime/Data/Properties.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 6e9b7f2fc8c2437fb414bb7180009724\ntimeCreated: 1603712147"
  },
  {
    "path": "Runtime/Data.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 00b7f2cfc7184d1abc825e02d35f3be7\ntimeCreated: 1603620553"
  },
  {
    "path": "Runtime/DialogueGraph.Runtime.asmdef",
    "content": "{\n    \"name\": \"DialogueGraph.Runtime\",\n    \"references\": [\n        \"GUID:11a2306c728a4b843a652ec6c2f142bc\",\n        \"GUID:a49fd1d25e23fd14e85d1cbf342bb06f\",\n        \"GUID:5debd524d9fe37b44aa7aede833a8eb7\",\n        \"GUID:479678a6fc2d434439a70c037334ff05\"\n    ],\n    \"includePlatforms\": [],\n    \"excludePlatforms\": [],\n    \"allowUnsafeCode\": false,\n    \"overrideReferences\": false,\n    \"precompiledReferences\": [],\n    \"autoReferenced\": true,\n    \"defineConstraints\": [],\n    \"versionDefines\": [],\n    \"noEngineReferences\": false\n}"
  },
  {
    "path": "Runtime/DialogueGraph.Runtime.asmdef.meta",
    "content": "fileFormatVersion: 2\nguid: d6f4b79f0a67eb24690aba82c1078929\nAssemblyDefinitionImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Runtime/DlogObjectData.cs",
    "content": "using System;\nusing System.Collections.Generic;\n\nnamespace DialogueGraph.Runtime {\n    [Serializable]\n    public class DlogObjectData {\n        public StringIntSerializableDictionary ActorDataIndices;\n        public List<ActorData> ActorData;\n        public StringIntSerializableDictionary CheckDataIndices;\n        public List<CheckEvent> CheckData;\n        public StringIntSerializableDictionary TriggerDataIndices;\n        public List<TriggerEvent> TriggerData;\n\n        public DlogObjectData() {\n            ActorDataIndices = new StringIntSerializableDictionary();\n            CheckDataIndices = new StringIntSerializableDictionary();\n            TriggerDataIndices = new StringIntSerializableDictionary();\n            ActorData = new List<ActorData>();\n            CheckData = new List<CheckEvent>();\n            TriggerData = new List<TriggerEvent>();\n        }\n\n        public void AddActorData(string guid, ActorData data) {\n            ActorDataIndices[guid] = ActorData.Count;\n            ActorData.Add(data);\n        }\n\n        public void AddCheckEvent(string guid, CheckEvent evt) {\n            CheckDataIndices[guid] = CheckData.Count;\n            CheckData.Add(evt);\n            evt.dynamic = true;\n        }\n\n        public void AddTriggerEvent(string guid, TriggerEvent evt) {\n            TriggerDataIndices[guid] = TriggerData.Count;\n            TriggerData.Add(evt);\n            evt.dynamic = true;\n        }\n    }\n}"
  },
  {
    "path": "Runtime/DlogObjectData.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 6d4eb92ba3554196bf7209bc84d96daf\ntimeCreated: 1603712864"
  },
  {
    "path": "Runtime/GenericDataTypes.cs",
    "content": "using System;\n\nnamespace DialogueGraph.Runtime {\n    // Node currentNode, int conversationLineIndex, bool returnValue;\n    [Serializable] public class CheckEvent : SerializableCallback<string, int, bool> {}\n    // Guid currentNode\n    [Serializable] public class TriggerEvent : SerializableEvent<string, int> {}\n\n    [Serializable] public class StringIntSerializableDictionary : SerializableDictionary<string, int> {}\n    [Serializable] public class NodeDictionary : SerializableDictionary<string, Node> {}\n    [Serializable] public class PropertyDictionary : SerializableDictionary<string, Property> {}\n}"
  },
  {
    "path": "Runtime/GenericDataTypes.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 744216f93a1d4f29a68bec11e8820865\ntimeCreated: 1603622398"
  },
  {
    "path": "Runtime/RuntimeDialogueGraph.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace DialogueGraph.Runtime {\n    [AddComponentMenu(\"Dialogue Graph/Dialogue Graph\")]\n    public class RuntimeDialogueGraph : MonoBehaviour {\n        public DlogObject DlogObject;\n\n        #region Inspector Data\n        public string CurrentAssetGuid;\n        public List<DlogObjectData> PersistentData = new List<DlogObjectData>();\n        public StringIntSerializableDictionary PersistentDataIndices = new StringIntSerializableDictionary();\n        public DlogObjectData CurrentData {\n            get {\n                if (string.IsNullOrEmpty(CurrentAssetGuid)) return null;\n                if (!PersistentDataIndices.ContainsKey(CurrentAssetGuid)) {\n                    PersistentDataIndices[CurrentAssetGuid] = PersistentData.Count;\n                    PersistentData.Add(new DlogObjectData());\n                }\n\n                return PersistentData[PersistentDataIndices[CurrentAssetGuid]];\n            }\n        }\n        public int CurrentIndex {\n            get {\n                if (string.IsNullOrEmpty(CurrentAssetGuid)) return -1;\n                if (!PersistentDataIndices.ContainsKey(CurrentAssetGuid)) {\n                    PersistentDataIndices[CurrentAssetGuid] = PersistentData.Count;\n                    PersistentData.Add(new DlogObjectData());\n                }\n\n                return PersistentDataIndices[CurrentAssetGuid];\n            }\n        }\n        public void ClearData() {\n            PersistentDataIndices = new StringIntSerializableDictionary();\n            PersistentData = new List<DlogObjectData>();\n        }\n        #endregion\n\n        private bool conversationDone;\n        private string currentNodeGuid;\n\n        public void ResetConversation() {\n            conversationDone = false;\n            currentNodeGuid = DlogObject.StartNode;\n        }\n\n        public void EndConversation() {\n            conversationDone = true;\n            currentNodeGuid = null;\n        }\n\n        public bool IsCurrentNpc() {\n            var currentNode = DlogObject.NodeDictionary[currentNodeGuid];\n            return currentNode.Type == NodeType.NPC;\n        }\n\n        public bool IsConversationDone() {\n            return conversationDone;\n        }\n\n        public ActorData GetCurrentActor() {\n            var currentNode = DlogObject.NodeDictionary[currentNodeGuid];\n            if (currentNode.Type != NodeType.NPC || string.IsNullOrEmpty(currentNode.ActorGuid)) return null;\n            var currentNodeActorGuid = currentNode.ActorGuid;\n            var actor = CurrentData.ActorData[CurrentData.ActorDataIndices[currentNodeActorGuid]];\n            return actor;\n        }\n\n        public List<ConversationLine> GetCurrentLines() {\n            var currentNode = DlogObject.NodeDictionary[currentNodeGuid];\n            return currentNode.Lines;\n        }\n\n        public string ProgressNpc() {\n            var lines = GetCurrentLines();\n            for (var i = 0; i < lines.Count - 1; i++) {\n                var line = lines[i];\n                var currentCheck = ExecuteChecks(line, i);\n\n\n                if (currentCheck) {\n                    Progress(line);\n                    ExecuteTriggers(line, i);\n                    return line.Message;\n                }\n            }\n\n            var lastLine = lines[lines.Count - 1];\n            Progress(lastLine);\n            ExecuteTriggers(lastLine, lines.Count-1);\n            return lastLine.Message;\n        }\n\n        public string ProgressSelf(int lineIndex) {\n            var lines = GetCurrentLines();\n            Progress(lines[lineIndex]);\n            ExecuteTriggers(lines[lineIndex], lineIndex);\n            return lines[lineIndex].Message;\n        }\n\n        private bool ExecuteChecks(ConversationLine line, int lineIndex) {\n            bool currentCheck = true;\n            foreach (CheckTree tree in line.CheckTrees) {\n                currentCheck = EvaluateCheckTree(tree, lineIndex) && currentCheck;\n            }\n\n            return currentCheck;\n        }\n\n        private void ExecuteTriggers(ConversationLine line, int lineIndex) {\n            foreach (var triggerGuid in line.Triggers) {\n               CurrentData.TriggerData[CurrentData.TriggerDataIndices[triggerGuid]].Invoke(currentNodeGuid, lineIndex);\n            }\n        }\n\n        private void Progress(ConversationLine line) {\n            if (string.IsNullOrEmpty(line.Next)) {\n                conversationDone = true;\n                currentNodeGuid = null;\n                return;\n            }\n\n            currentNodeGuid = line.Next;\n        }\n\n        private bool EvaluateCheckTree(CheckTree tree, int lineIndex) {\n            if (tree.NodeKind == CheckTree.Kind.Property) {\n                if (string.IsNullOrEmpty(tree.PropertyGuid)) return false;\n                if (!CurrentData.CheckDataIndices.ContainsKey(tree.PropertyGuid)) return false;\n                int index = CurrentData.CheckDataIndices[tree.PropertyGuid];\n                if (index < 0 || index >= CurrentData.CheckData.Count) return false;\n                return CurrentData.CheckData[index].Invoke(currentNodeGuid, lineIndex);\n            }\n\n            if (tree.NodeKind == CheckTree.Kind.Unary) {\n                bool check = EvaluateCheckTree(tree.SubtreeA, lineIndex);\n                return EvaluateUnaryOperation(tree.BooleanOperation, check);\n            }\n\n            if (tree.NodeKind == CheckTree.Kind.Binary) {\n                bool checkA = EvaluateCheckTree(tree.SubtreeA, lineIndex);\n                bool checkB = EvaluateCheckTree(tree.SubtreeB, lineIndex);\n                return EvaluateBinaryOperation(tree.BooleanOperation, checkA, checkB);\n            }\n\n            // Unreachable\n            throw new Exception(\"Unreachable\");\n        }\n\n        private static bool EvaluateUnaryOperation(BooleanOperation operation, bool value) {\n            switch (operation) {\n                case BooleanOperation.NOT: return !value;\n                default: throw new Exception(\"Unreachable\");\n            }\n        }\n\n        private static bool EvaluateBinaryOperation(BooleanOperation operation, bool valueA, bool valueB) {\n            switch (operation) {\n                case BooleanOperation.AND: return valueA && valueB;\n                case BooleanOperation.OR: return valueA || valueB;\n                case BooleanOperation.XOR: return valueA ^ valueB;\n                case BooleanOperation.NAND: return !(valueA && valueB);\n                case BooleanOperation.NOR: return !(valueA || valueB);\n                case BooleanOperation.XNOR: return !(valueA ^ valueB);\n                default: throw new Exception(\"Unreachable\");\n            }\n        }\n    }\n}"
  },
  {
    "path": "Runtime/RuntimeDialogueGraph.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 80c49c349eea4a6f9719386703f11e48\ntimeCreated: 1603622569"
  },
  {
    "path": "Runtime.meta",
    "content": "fileFormatVersion: 2\nguid: 24e48992746c4dd18363340c787fcf9d\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Example.dlog",
    "content": "{\n    \"AssetGuid\": \"eb71420dc23754148891843881b4dc58\",\n    \"IsBlackboardVisible\": false,\n    \"DialogueGraphVersion\": \"2.0.0\",\n    \"nodes\": [\n        {\n            \"GUID\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"Type\": \"DialogueGraph.NpcNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 171.00001525878907,\n                    \"y\": 255.0,\n                    \"width\": 394.0,\n                    \"height\": 300.0\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"lines\\\":\\\"[{\\\\\\\"Line\\\\\\\":\\\\\\\"Bugger off!\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"7f2254b8-3cd9-456b-881f-facc53592d25\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"6ff5c065-853f-4f60-a4f9-da4ccede893d\\\\\\\",\\\\\\\"PortGuidC\\\\\\\":\\\\\\\"f39f52fc-9fdd-4425-9fc2-bb4065553657\\\\\\\"},{\\\\\\\"Line\\\\\\\":\\\\\\\"Welcome back!\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"3704f597-12d6-40dc-9640-a0d60fe7c9f7\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"087cdc5b-cc55-494e-8216-40a8810ca362\\\\\\\",\\\\\\\"PortGuidC\\\\\\\":\\\\\\\"f66100ca-e3e8-48f3-8654-0abfa8574b28\\\\\\\"},{\\\\\\\"Line\\\\\\\":\\\\\\\"Who are you?\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"3d930cd0-e80b-440d-b610-a5a7a1230a82\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"edd14ccb-bcf9-4283-a613-b57568d7863b\\\\\\\",\\\\\\\"PortGuidC\\\\\\\":\\\\\\\"b3e88b22-18f0-4877-af05-22bbde35209e\\\\\\\"}]\\\"}\",\n            \"PortData\": [\n                \"c61ad627-28b5-480b-8e43-687b28b35a7c\",\n                \"9ceb5ac5-86f3-4bfb-9cd5-dbf896039136\",\n                \"7f2254b8-3cd9-456b-881f-facc53592d25\",\n                \"6ff5c065-853f-4f60-a4f9-da4ccede893d\",\n                \"f39f52fc-9fdd-4425-9fc2-bb4065553657\",\n                \"3704f597-12d6-40dc-9640-a0d60fe7c9f7\",\n                \"087cdc5b-cc55-494e-8216-40a8810ca362\",\n                \"f66100ca-e3e8-48f3-8654-0abfa8574b28\",\n                \"3d930cd0-e80b-440d-b610-a5a7a1230a82\",\n                \"edd14ccb-bcf9-4283-a613-b57568d7863b\",\n                \"b3e88b22-18f0-4877-af05-22bbde35209e\"\n            ]\n        },\n        {\n            \"GUID\": \"2f81bcfa-aecc-41aa-91d9-443c4df926e7\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 15.999988555908204,\n                    \"y\": 282.0,\n                    \"width\": 112.00000762939453,\n                    \"height\": 42.000003814697269\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"7d6a525b-b711-4587-899b-abe39a024b3d\\\"}\",\n            \"PortData\": [\n                \"a7bb3225-d4e2-4c9c-8687-fb704c478e19\"\n            ]\n        },\n        {\n            \"GUID\": \"d997cd5a-7120-44a6-99d8-f90c7f2ceebb\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": -69.00000762939453,\n                    \"y\": 389.0,\n                    \"width\": 107.00000762939453,\n                    \"height\": 42.000030517578128\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"0499b57d-42ae-415f-b6fe-ccde98cc2fe1\\\"}\",\n            \"PortData\": [\n                \"151b15e6-dccc-4140-a293-0cf981a5d6e7\"\n            ]\n        },\n        {\n            \"GUID\": \"9ea12800-a39a-4a23-af51-b8da8c0f3d08\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 600.0,\n                    \"y\": 478.9999694824219,\n                    \"width\": 67.0,\n                    \"height\": 42.0\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"040ac558-1527-47e7-96f5-741bd7d7a28e\\\"}\",\n            \"PortData\": [\n                \"2e3ee987-ae0e-4c51-9db8-81f081c699a0\"\n            ]\n        },\n        {\n            \"GUID\": \"5824fb09-4f78-4fbf-b470-3c0241b140b2\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": -40.0,\n                    \"y\": 347.0000305175781,\n                    \"width\": 78.0,\n                    \"height\": 41.999969482421878\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"3f457785-b316-4eae-87ee-8129b6b6ccd3\\\"}\",\n            \"PortData\": [\n                \"d2be7122-1bae-4152-aa8a-775381c30450\"\n            ]\n        },\n        {\n            \"GUID\": \"001eee13-a346-4270-a20f-d4a806b66389\",\n            \"Type\": \"DialogueGraph.NpcNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": -1001.9999389648438,\n                    \"y\": 103.0,\n                    \"width\": 393.9999694824219,\n                    \"height\": 239.99998474121095\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"lines\\\":\\\"[{\\\\\\\"Line\\\\\\\":\\\\\\\"You again?\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"8d7e16e6-5152-4f05-a21c-bf135f3ad83a\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"43e8791c-8813-430b-96e9-fa41b3b43502\\\\\\\",\\\\\\\"PortGuidC\\\\\\\":\\\\\\\"9c8cc39b-3ddf-44ec-ac56-891f59c14188\\\\\\\"},{\\\\\\\"Line\\\\\\\":\\\\\\\"Huh?\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"7d45657d-5d18-4ba9-b212-0dc82f23b5b1\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"be8a7509-fa53-41a0-9c39-210cfd51c262\\\\\\\",\\\\\\\"PortGuidC\\\\\\\":\\\\\\\"5e6d7473-1693-46e6-9d4a-23f1099c8778\\\\\\\"}]\\\"}\",\n            \"PortData\": [\n                \"0cbc16dd-91fd-4bc5-81a1-06b2d7506eee\",\n                \"90b9359c-41b0-4beb-b9e3-398261f1a807\",\n                \"8d7e16e6-5152-4f05-a21c-bf135f3ad83a\",\n                \"43e8791c-8813-430b-96e9-fa41b3b43502\",\n                \"9c8cc39b-3ddf-44ec-ac56-891f59c14188\",\n                \"7d45657d-5d18-4ba9-b212-0dc82f23b5b1\",\n                \"be8a7509-fa53-41a0-9c39-210cfd51c262\",\n                \"5e6d7473-1693-46e6-9d4a-23f1099c8778\"\n            ]\n        },\n        {\n            \"GUID\": \"e8bfabc3-8e0b-4e64-8259-fcf3f1c86cce\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": -1159.0,\n                    \"y\": 123.00000762939453,\n                    \"width\": 112.00000762939453,\n                    \"height\": 42.000003814697269\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"7d6a525b-b711-4587-899b-abe39a024b3d\\\"}\",\n            \"PortData\": [\n                \"e2163097-6cb8-416d-98c2-16b74f556fd2\"\n            ]\n        },\n        {\n            \"GUID\": \"1c559177-1a9d-469d-8c2d-662ad37b6387\",\n            \"Type\": \"DialogueGraph.SelfNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": -380.99993896484377,\n                    \"y\": 4.000016212463379,\n                    \"width\": 347.9999694824219,\n                    \"height\": 227.99998474121095\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"lines\\\":\\\"[{\\\\\\\"Line\\\\\\\":\\\\\\\"Whatever\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"50ddcfa5-8d7b-436d-9675-0a50216054b1\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"c4d4651e-6e18-48cd-b67d-67de07570da3\\\\\\\"},{\\\\\\\"Line\\\\\\\":\\\\\\\"I'm sorry!\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"6204d9ef-60f0-44ee-a9d8-1a6fdbcc1a2b\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"f778cec1-9eb4-4e2a-9c26-d6aa9e1a9efa\\\\\\\"}]\\\"}\",\n            \"PortData\": [\n                \"d719f911-4ca0-4311-8961-8ad4c5e1f5db\",\n                \"50ddcfa5-8d7b-436d-9675-0a50216054b1\",\n                \"c4d4651e-6e18-48cd-b67d-67de07570da3\",\n                \"6204d9ef-60f0-44ee-a9d8-1a6fdbcc1a2b\",\n                \"f778cec1-9eb4-4e2a-9c26-d6aa9e1a9efa\"\n            ]\n        },\n        {\n            \"GUID\": \"0cfb83ea-f5ad-4a2f-bedf-fe22b7ebafc1\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": -1161.0,\n                    \"y\": 203.99998474121095,\n                    \"width\": 73.0,\n                    \"height\": 42.0\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"3f457785-b316-4eae-87ee-8129b6b6ccd3\\\"}\",\n            \"PortData\": [\n                \"2a4a3c7e-c0b7-4516-8f39-26997badbfda\"\n            ]\n        },\n        {\n            \"GUID\": \"82d6350e-1df0-4078-b8ff-2878c7e501be\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 16.99995231628418,\n                    \"y\": 158.00003051757813,\n                    \"width\": 107.0,\n                    \"height\": 42.0\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"4cf90030-325a-4b21-bde1-66f9e82e46ab\\\"}\",\n            \"PortData\": [\n                \"2485be78-94bd-4d10-b323-1c69c6b6ee31\"\n            ]\n        },\n        {\n            \"GUID\": \"89793740-d936-4d5d-9759-90f6d66cc405\",\n            \"Type\": \"DialogueGraph.SelfNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 619.0000610351563,\n                    \"y\": -102.0000228881836,\n                    \"width\": 363.0,\n                    \"height\": 228.00001525878907\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"lines\\\":\\\"[{\\\\\\\"Line\\\\\\\":\\\\\\\"I'm <INSERT NAME HERE>.\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"b8d0b595-658c-41d5-a8e8-bf357bd6f633\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"2a7e6772-813a-450a-bee5-d6440acc3cf1\\\\\\\"},{\\\\\\\"Line\\\\\\\":\\\\\\\"None of your damn business\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"5468b759-d9b7-4042-bbc7-8d5308935b78\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"4ae4aca0-fa7a-4c2b-998a-3f588990066b\\\\\\\"}]\\\"}\",\n            \"PortData\": [\n                \"e4363284-75b4-4fe9-b593-43ddc7f55a12\",\n                \"b8d0b595-658c-41d5-a8e8-bf357bd6f633\",\n                \"2a7e6772-813a-450a-bee5-d6440acc3cf1\",\n                \"5468b759-d9b7-4042-bbc7-8d5308935b78\",\n                \"4ae4aca0-fa7a-4c2b-998a-3f588990066b\"\n            ]\n        },\n        {\n            \"GUID\": \"dad5e7fd-c153-461b-b722-22aaa319a7cc\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 1052.0,\n                    \"y\": 51.99998092651367,\n                    \"width\": 108.0,\n                    \"height\": 42.000003814697269\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"444013ed-b010-4bf5-aa9f-cc66c157bd12\\\"}\",\n            \"PortData\": [\n                \"12c9fc4c-4bd4-4c22-8cba-8bf64e05eca5\"\n            ]\n        },\n        {\n            \"GUID\": \"946bc4b7-6ed0-4771-b07a-a44463447712\",\n            \"Type\": \"DialogueGraph.NpcNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 1010.9999389648438,\n                    \"y\": 217.00001525878907,\n                    \"width\": 394.0000305175781,\n                    \"height\": 180.0\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"lines\\\":\\\"[{\\\\\\\"Line\\\\\\\":\\\\\\\"How can I help you?\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"82687682-2b99-4189-baff-b7a1ea2b0db4\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"9d592a6e-72b8-4e4c-b7b0-18ef8be1f387\\\\\\\",\\\\\\\"PortGuidC\\\\\\\":\\\\\\\"f6ef88f1-29ec-4c78-8b3a-64cf493b0684\\\\\\\"}]\\\"}\",\n            \"PortData\": [\n                \"b79a8684-db4d-4242-b747-e246119bf634\",\n                \"d43c6810-3f08-4735-9764-1cd40ca077a7\",\n                \"82687682-2b99-4189-baff-b7a1ea2b0db4\",\n                \"9d592a6e-72b8-4e4c-b7b0-18ef8be1f387\",\n                \"f6ef88f1-29ec-4c78-8b3a-64cf493b0684\"\n            ]\n        },\n        {\n            \"GUID\": \"335c0c20-4f6f-4b3b-834f-a27ccaa9ade7\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 814.9999389648438,\n                    \"y\": 262.0000305175781,\n                    \"width\": 112.00000762939453,\n                    \"height\": 42.000003814697269\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"7d6a525b-b711-4587-899b-abe39a024b3d\\\"}\",\n            \"PortData\": [\n                \"500d7a44-99c2-49d3-901e-f4f16bf4a0e2\"\n            ]\n        },\n        {\n            \"GUID\": \"8f0c0b57-a2c6-4eda-aca3-f6f78d63650b\",\n            \"Type\": \"DialogueGraph.SelfNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 1463.0001220703125,\n                    \"y\": 321.0000305175781,\n                    \"width\": 348.0000305175781,\n                    \"height\": 288.0\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"lines\\\":\\\"[{\\\\\\\"Line\\\\\\\":\\\\\\\"What do you have to sell?\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"b0d98ad9-9d98-4079-adb9-f7a1ecf64e36\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"46741a44-f383-47a3-97ba-c2d199c636ff\\\\\\\"},{\\\\\\\"Line\\\\\\\":\\\\\\\"Let's play some a game!\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"8243076a-a716-4654-a480-0aee6c414a93\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"89586d52-f782-45a1-a430-329ca3243b6e\\\\\\\"},{\\\\\\\"Line\\\\\\\":\\\\\\\"Nevermind.\\\\\\\",\\\\\\\"PortGuidA\\\\\\\":\\\\\\\"ad998ea4-7024-4b1c-adb5-095b37c9cc11\\\\\\\",\\\\\\\"PortGuidB\\\\\\\":\\\\\\\"4f0b4e30-37b1-49f3-8177-3aa376fb6bd7\\\\\\\"}]\\\"}\",\n            \"PortData\": [\n                \"0445323b-f689-4236-913f-fff5f3b6a430\",\n                \"b0d98ad9-9d98-4079-adb9-f7a1ecf64e36\",\n                \"46741a44-f383-47a3-97ba-c2d199c636ff\",\n                \"8243076a-a716-4654-a480-0aee6c414a93\",\n                \"89586d52-f782-45a1-a430-329ca3243b6e\",\n                \"ad998ea4-7024-4b1c-adb5-095b37c9cc11\",\n                \"4f0b4e30-37b1-49f3-8177-3aa376fb6bd7\"\n            ]\n        },\n        {\n            \"GUID\": \"e0f76e76-8cca-4e4b-914c-c416be309488\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 1872.000244140625,\n                    \"y\": 447.0,\n                    \"width\": 99.00000762939453,\n                    \"height\": 42.000003814697269\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"81c1a9c3-23ac-4fd0-92cc-597d9a8172e3\\\"}\",\n            \"PortData\": [\n                \"c09a5b7c-32bf-49e2-b53e-fd5c8c5c5e07\"\n            ]\n        },\n        {\n            \"GUID\": \"4ebe931e-de48-46de-af51-b36313dfc175\",\n            \"Type\": \"DialogueGraph.PropertyNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 1873.0,\n                    \"y\": 400.0,\n                    \"width\": 101.00000762939453,\n                    \"height\": 42.000003814697269\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{\\\"propertyGuid\\\":\\\"2af6175d-4323-4bd4-be23-72ea22a80668\\\"}\",\n            \"PortData\": [\n                \"54d84279-8fd3-40b0-8816-bd9156014b48\"\n            ]\n        },\n        {\n            \"GUID\": \"25e31218-4152-4863-b40f-0646fde7fdb5\",\n            \"Type\": \"DialogueGraph.AndBooleanNode\",\n            \"DrawState\": {\n                \"Position\": {\n                    \"serializedVersion\": \"2\",\n                    \"x\": 66.0,\n                    \"y\": 359.0,\n                    \"width\": 69.99998474121094,\n                    \"height\": 42.000030517578128\n                },\n                \"Expanded\": true\n            },\n            \"NodeData\": \"{}\",\n            \"PortData\": [\n                \"e1ad3df5-45d7-429d-898d-eb164827392d\",\n                \"30cafc6a-cbe6-43c2-9107-62ab28b3a4a1\",\n                \"71a7be46-510f-484d-86d2-feec149d6329\"\n            ]\n        }\n    ],\n    \"edges\": [\n        {\n            \"Input\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"Output\": \"2f81bcfa-aecc-41aa-91d9-443c4df926e7\",\n            \"InputPort\": \"9ceb5ac5-86f3-4bfb-9cd5-dbf896039136\",\n            \"OutputPort\": \"a7bb3225-d4e2-4c9c-8687-fb704c478e19\",\n            \"InputCapacity\": 0,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"Output\": \"d997cd5a-7120-44a6-99d8-f90c7f2ceebb\",\n            \"InputPort\": \"f66100ca-e3e8-48f3-8654-0abfa8574b28\",\n            \"OutputPort\": \"151b15e6-dccc-4140-a293-0cf981a5d6e7\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"9ea12800-a39a-4a23-af51-b8da8c0f3d08\",\n            \"Output\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"InputPort\": \"2e3ee987-ae0e-4c51-9db8-81f081c699a0\",\n            \"OutputPort\": \"edd14ccb-bcf9-4283-a613-b57568d7863b\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"001eee13-a346-4270-a20f-d4a806b66389\",\n            \"Output\": \"e8bfabc3-8e0b-4e64-8259-fcf3f1c86cce\",\n            \"InputPort\": \"90b9359c-41b0-4beb-b9e3-398261f1a807\",\n            \"OutputPort\": \"e2163097-6cb8-416d-98c2-16b74f556fd2\",\n            \"InputCapacity\": 0,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"1c559177-1a9d-469d-8c2d-662ad37b6387\",\n            \"Output\": \"001eee13-a346-4270-a20f-d4a806b66389\",\n            \"InputPort\": \"d719f911-4ca0-4311-8961-8ad4c5e1f5db\",\n            \"OutputPort\": \"8d7e16e6-5152-4f05-a21c-bf135f3ad83a\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        },\n        {\n            \"Input\": \"001eee13-a346-4270-a20f-d4a806b66389\",\n            \"Output\": \"0cfb83ea-f5ad-4a2f-bedf-fe22b7ebafc1\",\n            \"InputPort\": \"9c8cc39b-3ddf-44ec-ac56-891f59c14188\",\n            \"OutputPort\": \"2a4a3c7e-c0b7-4516-8f39-26997badbfda\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"Output\": \"1c559177-1a9d-469d-8c2d-662ad37b6387\",\n            \"InputPort\": \"c61ad627-28b5-480b-8e43-687b28b35a7c\",\n            \"OutputPort\": \"50ddcfa5-8d7b-436d-9675-0a50216054b1\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        },\n        {\n            \"Input\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"Output\": \"001eee13-a346-4270-a20f-d4a806b66389\",\n            \"InputPort\": \"c61ad627-28b5-480b-8e43-687b28b35a7c\",\n            \"OutputPort\": \"7d45657d-5d18-4ba9-b212-0dc82f23b5b1\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        },\n        {\n            \"Input\": \"82d6350e-1df0-4078-b8ff-2878c7e501be\",\n            \"Output\": \"1c559177-1a9d-469d-8c2d-662ad37b6387\",\n            \"InputPort\": \"2485be78-94bd-4d10-b323-1c69c6b6ee31\",\n            \"OutputPort\": \"f778cec1-9eb4-4e2a-9c26-d6aa9e1a9efa\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"89793740-d936-4d5d-9759-90f6d66cc405\",\n            \"Output\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"InputPort\": \"e4363284-75b4-4fe9-b593-43ddc7f55a12\",\n            \"OutputPort\": \"3d930cd0-e80b-440d-b610-a5a7a1230a82\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        },\n        {\n            \"Input\": \"dad5e7fd-c153-461b-b722-22aaa319a7cc\",\n            \"Output\": \"89793740-d936-4d5d-9759-90f6d66cc405\",\n            \"InputPort\": \"12c9fc4c-4bd4-4c22-8cba-8bf64e05eca5\",\n            \"OutputPort\": \"4ae4aca0-fa7a-4c2b-998a-3f588990066b\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"Output\": \"89793740-d936-4d5d-9759-90f6d66cc405\",\n            \"InputPort\": \"c61ad627-28b5-480b-8e43-687b28b35a7c\",\n            \"OutputPort\": \"5468b759-d9b7-4042-bbc7-8d5308935b78\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        },\n        {\n            \"Input\": \"946bc4b7-6ed0-4771-b07a-a44463447712\",\n            \"Output\": \"89793740-d936-4d5d-9759-90f6d66cc405\",\n            \"InputPort\": \"b79a8684-db4d-4242-b747-e246119bf634\",\n            \"OutputPort\": \"b8d0b595-658c-41d5-a8e8-bf357bd6f633\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        },\n        {\n            \"Input\": \"946bc4b7-6ed0-4771-b07a-a44463447712\",\n            \"Output\": \"335c0c20-4f6f-4b3b-834f-a27ccaa9ade7\",\n            \"InputPort\": \"d43c6810-3f08-4735-9764-1cd40ca077a7\",\n            \"OutputPort\": \"500d7a44-99c2-49d3-901e-f4f16bf4a0e2\",\n            \"InputCapacity\": 0,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"946bc4b7-6ed0-4771-b07a-a44463447712\",\n            \"Output\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"InputPort\": \"b79a8684-db4d-4242-b747-e246119bf634\",\n            \"OutputPort\": \"3704f597-12d6-40dc-9640-a0d60fe7c9f7\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        },\n        {\n            \"Input\": \"8f0c0b57-a2c6-4eda-aca3-f6f78d63650b\",\n            \"Output\": \"946bc4b7-6ed0-4771-b07a-a44463447712\",\n            \"InputPort\": \"0445323b-f689-4236-913f-fff5f3b6a430\",\n            \"OutputPort\": \"82687682-2b99-4189-baff-b7a1ea2b0db4\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        },\n        {\n            \"Input\": \"e0f76e76-8cca-4e4b-914c-c416be309488\",\n            \"Output\": \"8f0c0b57-a2c6-4eda-aca3-f6f78d63650b\",\n            \"InputPort\": \"c09a5b7c-32bf-49e2-b53e-fd5c8c5c5e07\",\n            \"OutputPort\": \"89586d52-f782-45a1-a430-329ca3243b6e\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"4ebe931e-de48-46de-af51-b36313dfc175\",\n            \"Output\": \"8f0c0b57-a2c6-4eda-aca3-f6f78d63650b\",\n            \"InputPort\": \"54d84279-8fd3-40b0-8816-bd9156014b48\",\n            \"OutputPort\": \"46741a44-f383-47a3-97ba-c2d199c636ff\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"946bc4b7-6ed0-4771-b07a-a44463447712\",\n            \"Output\": \"1c559177-1a9d-469d-8c2d-662ad37b6387\",\n            \"InputPort\": \"b79a8684-db4d-4242-b747-e246119bf634\",\n            \"OutputPort\": \"6204d9ef-60f0-44ee-a9d8-1a6fdbcc1a2b\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        },\n        {\n            \"Input\": \"25e31218-4152-4863-b40f-0646fde7fdb5\",\n            \"Output\": \"5824fb09-4f78-4fbf-b470-3c0241b140b2\",\n            \"InputPort\": \"e1ad3df5-45d7-429d-898d-eb164827392d\",\n            \"OutputPort\": \"d2be7122-1bae-4152-aa8a-775381c30450\",\n            \"InputCapacity\": 0,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"25e31218-4152-4863-b40f-0646fde7fdb5\",\n            \"Output\": \"d997cd5a-7120-44a6-99d8-f90c7f2ceebb\",\n            \"InputPort\": \"30cafc6a-cbe6-43c2-9107-62ab28b3a4a1\",\n            \"OutputPort\": \"151b15e6-dccc-4140-a293-0cf981a5d6e7\",\n            \"InputCapacity\": 0,\n            \"OutputCapacity\": 1\n        },\n        {\n            \"Input\": \"850489ea-8d9d-4bc2-9a5f-6a3302035848\",\n            \"Output\": \"25e31218-4152-4863-b40f-0646fde7fdb5\",\n            \"InputPort\": \"f39f52fc-9fdd-4425-9fc2-bb4065553657\",\n            \"OutputPort\": \"71a7be46-510f-484d-86d2-feec149d6329\",\n            \"InputCapacity\": 1,\n            \"OutputCapacity\": 0\n        }\n    ],\n    \"serializedProperties\": [\n        {\n            \"Type\": \"DialogueGraph.ActorProperty\",\n            \"Data\": \"{\\\"$type\\\":\\\"DialogueGraph.ActorProperty, DialogueGraph.Editor\\\",\\\"GUID\\\":\\\"7d6a525b-b711-4587-899b-abe39a024b3d\\\",\\\"Type\\\":2,\\\"DisplayName\\\":\\\"Shop Keeper\\\",\\\"ReferenceName\\\":\\\"Actor_47349990\\\",\\\"OverrideReferenceName\\\":null,\\\"Hidden\\\":false,\\\"ShortGuid\\\":\\\"47349990\\\"}\"\n        },\n        {\n            \"Type\": \"DialogueGraph.TriggerProperty\",\n            \"Data\": \"{\\\"$type\\\":\\\"DialogueGraph.TriggerProperty, DialogueGraph.Editor\\\",\\\"GUID\\\":\\\"040ac558-1527-47e7-96f5-741bd7d7a28e\\\",\\\"Type\\\":0,\\\"DisplayName\\\":\\\"Meet\\\",\\\"ReferenceName\\\":\\\"Trigger_F3AC8EC2\\\",\\\"OverrideReferenceName\\\":null,\\\"Hidden\\\":false,\\\"ShortGuid\\\":\\\"F3AC8EC2\\\"}\"\n        },\n        {\n            \"Type\": \"DialogueGraph.TriggerProperty\",\n            \"Data\": \"{\\\"$type\\\":\\\"DialogueGraph.TriggerProperty, DialogueGraph.Editor\\\",\\\"GUID\\\":\\\"4cf90030-325a-4b21-bde1-66f9e82e46ab\\\",\\\"Type\\\":0,\\\"DisplayName\\\":\\\"Clear Angry\\\",\\\"ReferenceName\\\":\\\"Trigger_2DA2BB98\\\",\\\"OverrideReferenceName\\\":null,\\\"Hidden\\\":false,\\\"ShortGuid\\\":\\\"2DA2BB98\\\"}\"\n        },\n        {\n            \"Type\": \"DialogueGraph.TriggerProperty\",\n            \"Data\": \"{\\\"$type\\\":\\\"DialogueGraph.TriggerProperty, DialogueGraph.Editor\\\",\\\"GUID\\\":\\\"444013ed-b010-4bf5-aa9f-cc66c157bd12\\\",\\\"Type\\\":0,\\\"DisplayName\\\":\\\"Make Angry\\\",\\\"ReferenceName\\\":\\\"Trigger_FDF03340\\\",\\\"OverrideReferenceName\\\":null,\\\"Hidden\\\":false,\\\"ShortGuid\\\":\\\"FDF03340\\\"}\"\n        },\n        {\n            \"Type\": \"DialogueGraph.CheckProperty\",\n            \"Data\": \"{\\\"$type\\\":\\\"DialogueGraph.CheckProperty, DialogueGraph.Editor\\\",\\\"GUID\\\":\\\"0499b57d-42ae-415f-b6fe-ccde98cc2fe1\\\",\\\"Type\\\":1,\\\"DisplayName\\\":\\\"Met Before?\\\",\\\"ReferenceName\\\":\\\"Check_535AF728\\\",\\\"OverrideReferenceName\\\":null,\\\"Hidden\\\":false,\\\"ShortGuid\\\":\\\"535AF728\\\"}\"\n        },\n        {\n            \"Type\": \"DialogueGraph.CheckProperty\",\n            \"Data\": \"{\\\"$type\\\":\\\"DialogueGraph.CheckProperty, DialogueGraph.Editor\\\",\\\"GUID\\\":\\\"3f457785-b316-4eae-87ee-8129b6b6ccd3\\\",\\\"Type\\\":1,\\\"DisplayName\\\":\\\"Angry?\\\",\\\"ReferenceName\\\":\\\"Check_26FE9665\\\",\\\"OverrideReferenceName\\\":null,\\\"Hidden\\\":false,\\\"ShortGuid\\\":\\\"26FE9665\\\"}\"\n        },\n        {\n            \"Type\": \"DialogueGraph.TriggerProperty\",\n            \"Data\": \"{\\\"$type\\\":\\\"DialogueGraph.TriggerProperty, DialogueGraph.Editor\\\",\\\"GUID\\\":\\\"81c1a9c3-23ac-4fd0-92cc-597d9a8172e3\\\",\\\"Type\\\":0,\\\"DisplayName\\\":\\\"Play Game\\\",\\\"ReferenceName\\\":\\\"Trigger_4500646E\\\",\\\"OverrideReferenceName\\\":null,\\\"Hidden\\\":false,\\\"ShortGuid\\\":\\\"4500646E\\\"}\"\n        },\n        {\n            \"Type\": \"DialogueGraph.TriggerProperty\",\n            \"Data\": \"{\\\"$type\\\":\\\"DialogueGraph.TriggerProperty, DialogueGraph.Editor\\\",\\\"GUID\\\":\\\"2af6175d-4323-4bd4-be23-72ea22a80668\\\",\\\"Type\\\":0,\\\"DisplayName\\\":\\\"Open Shop\\\",\\\"ReferenceName\\\":\\\"Trigger_ABEE4873\\\",\\\"OverrideReferenceName\\\":null,\\\"Hidden\\\":false,\\\"ShortGuid\\\":\\\"ABEE4873\\\"}\"\n        }\n    ]\n}"
  },
  {
    "path": "Samples~/DemoProject/Example.dlog.meta",
    "content": "fileFormatVersion: 2\nguid: eb71420dc23754148891843881b4dc58\nScriptedImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 2\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n  script: {fileID: 11500000, guid: ce3d5155149c4d55879633c98686ac8a, type: 3}\n"
  },
  {
    "path": "Samples~/DemoProject/Prefabs/Line Entry.prefab",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!1 &595898951743258825\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 6226757032160902825}\n  - component: {fileID: 904967633267369748}\n  - component: {fileID: 1424282131079466282}\n  m_Layer: 5\n  m_Name: background\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &6226757032160902825\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 595898951743258825}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1770718125874074080}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!222 &904967633267369748\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 595898951743258825}\n  m_CullTransparentMesh: 0\n--- !u!114 &1424282131079466282\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 595898951743258825}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.3490566, g: 0.3490566, b: 0.3490566, a: 0.7882353}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 21300000, guid: 7c81dda177317494594c6600575292b5, type: 3}\n  m_Type: 3\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 0\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!1 &2750719725343051474\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1928876071013246014}\n  - component: {fileID: 7401737524885884427}\n  - component: {fileID: 3210937741114328167}\n  m_Layer: 5\n  m_Name: text\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1928876071013246014\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2750719725343051474}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children: []\n  m_Father: {fileID: 1770718125874074080}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!222 &7401737524885884427\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2750719725343051474}\n  m_CullTransparentMesh: 0\n--- !u!114 &3210937741114328167\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 2750719725343051474}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_text: text\n  m_isRightToLeft: 0\n  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_fontSharedMaterials: []\n  m_fontMaterial: {fileID: 0}\n  m_fontMaterials: []\n  m_fontColor32:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontColor: {r: 1, g: 1, b: 1, a: 1}\n  m_enableVertexGradient: 0\n  m_colorMode: 3\n  m_fontColorGradient:\n    topLeft: {r: 1, g: 1, b: 1, a: 1}\n    topRight: {r: 1, g: 1, b: 1, a: 1}\n    bottomLeft: {r: 1, g: 1, b: 1, a: 1}\n    bottomRight: {r: 1, g: 1, b: 1, a: 1}\n  m_fontColorGradientPreset: {fileID: 0}\n  m_spriteAsset: {fileID: 0}\n  m_tintAllSprites: 0\n  m_StyleSheet: {fileID: 0}\n  m_TextStyleHashCode: -1183493901\n  m_overrideHtmlColors: 0\n  m_faceColor:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontSize: 32\n  m_fontSizeBase: 24\n  m_fontWeight: 400\n  m_enableAutoSizing: 1\n  m_fontSizeMin: 18\n  m_fontSizeMax: 32\n  m_fontStyle: 0\n  m_HorizontalAlignment: 2\n  m_VerticalAlignment: 512\n  m_textAlignment: 65535\n  m_characterSpacing: 0\n  m_wordSpacing: 0\n  m_lineSpacing: 0\n  m_lineSpacingMax: 0\n  m_paragraphSpacing: 0\n  m_charWidthMaxAdj: 0\n  m_enableWordWrapping: 1\n  m_wordWrappingRatios: 0.4\n  m_overflowMode: 0\n  m_linkedTextComponent: {fileID: 0}\n  parentLinkedComponent: {fileID: 0}\n  m_enableKerning: 1\n  m_enableExtraPadding: 0\n  checkPaddingRequired: 0\n  m_isRichText: 1\n  m_parseCtrlCharacters: 1\n  m_isOrthographic: 1\n  m_isCullingEnabled: 0\n  m_horizontalMapping: 0\n  m_verticalMapping: 0\n  m_uvLineOffset: 0\n  m_geometrySortingOrder: 0\n  m_IsTextObjectScaleStatic: 0\n  m_VertexBufferAutoSizeReduction: 1\n  m_useMaxVisibleDescender: 1\n  m_pageToDisplay: 1\n  m_margin: {x: 24, y: 0, z: 24, w: 0}\n  m_isUsingLegacyAnimationComponent: 0\n  m_isVolumetricText: 0\n  m_hasFontAssetChanged: 0\n  m_baseMaterial: {fileID: 0}\n  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}\n--- !u!1 &7120836296781277082\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1770718125874074080}\n  - component: {fileID: 784771038537814059}\n  m_Layer: 5\n  m_Name: Line Entry\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1770718125874074080\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 7120836296781277082}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_Children:\n  - {fileID: 6226757032160902825}\n  - {fileID: 1928876071013246014}\n  m_Father: {fileID: 0}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 45}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &784771038537814059\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 7120836296781277082}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: df26159aefe9e0a439a7155f15eecbed, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  Text: {fileID: 3210937741114328167}\n  Selection: {fileID: 1424282131079466282}\n"
  },
  {
    "path": "Samples~/DemoProject/Prefabs/Line Entry.prefab.meta",
    "content": "fileFormatVersion: 2\nguid: ec2a9df1e0f525c4da5d571c78b31254\nPrefabImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Prefabs.meta",
    "content": "fileFormatVersion: 2\nguid: b12cbaf73ce6e1049b74377fa0ce704d\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Scenes/Demo.unity",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!29 &1\nOcclusionCullingSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 2\n  m_OcclusionBakeSettings:\n    smallestOccluder: 5\n    smallestHole: 0.25\n    backfaceThreshold: 100\n  m_SceneGUID: 00000000000000000000000000000000\n  m_OcclusionCullingData: {fileID: 0}\n--- !u!104 &2\nRenderSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 9\n  m_Fog: 1\n  m_FogColor: {r: 0.65080994, g: 0.666729, b: 0.7075472, a: 1}\n  m_FogMode: 3\n  m_FogDensity: 0.05\n  m_LinearFogStart: 0\n  m_LinearFogEnd: 300\n  m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}\n  m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}\n  m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}\n  m_AmbientIntensity: 1\n  m_AmbientMode: 0\n  m_SubtractiveShadowColor: {r: 0.13296545, g: 0.19145328, b: 0.33962262, a: 1}\n  m_SkyboxMaterial: {fileID: 2100000, guid: 0ffaa0b7117ba8c47a9d05ae701d4b4d, type: 2}\n  m_HaloStrength: 0.5\n  m_FlareStrength: 1\n  m_FlareFadeSpeed: 3\n  m_HaloTexture: {fileID: 0}\n  m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}\n  m_DefaultReflectionMode: 0\n  m_DefaultReflectionResolution: 128\n  m_ReflectionBounces: 1\n  m_ReflectionIntensity: 1\n  m_CustomReflection: {fileID: 0}\n  m_Sun: {fileID: 0}\n  m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1}\n  m_UseRadianceAmbientProbe: 0\n--- !u!157 &3\nLightmapSettings:\n  m_ObjectHideFlags: 0\n  serializedVersion: 12\n  m_GIWorkflowMode: 0\n  m_GISettings:\n    serializedVersion: 2\n    m_BounceScale: 1\n    m_IndirectOutputScale: 1\n    m_AlbedoBoost: 1\n    m_EnvironmentLightingMode: 1\n    m_EnableBakedLightmaps: 1\n    m_EnableRealtimeLightmaps: 0\n  m_LightmapEditorSettings:\n    serializedVersion: 12\n    m_Resolution: 2\n    m_BakeResolution: 32\n    m_AtlasSize: 512\n    m_AO: 1\n    m_AOMaxDistance: 1\n    m_CompAOExponent: 1\n    m_CompAOExponentDirect: 0.3\n    m_ExtractAmbientOcclusion: 0\n    m_Padding: 2\n    m_LightmapParameters: {fileID: 0}\n    m_LightmapsBakeMode: 0\n    m_TextureCompression: 1\n    m_FinalGather: 0\n    m_FinalGatherFiltering: 1\n    m_FinalGatherRayCount: 256\n    m_ReflectionCompression: 2\n    m_MixedBakeMode: 1\n    m_BakeBackend: 1\n    m_PVRSampling: 1\n    m_PVRDirectSampleCount: 32\n    m_PVRSampleCount: 256\n    m_PVRBounces: 2\n    m_PVREnvironmentSampleCount: 256\n    m_PVREnvironmentReferencePointCount: 2048\n    m_PVRFilteringMode: 2\n    m_PVRDenoiserTypeDirect: 0\n    m_PVRDenoiserTypeIndirect: 0\n    m_PVRDenoiserTypeAO: 0\n    m_PVRFilterTypeDirect: 0\n    m_PVRFilterTypeIndirect: 0\n    m_PVRFilterTypeAO: 0\n    m_PVREnvironmentMIS: 0\n    m_PVRCulling: 1\n    m_PVRFilteringGaussRadiusDirect: 1\n    m_PVRFilteringGaussRadiusIndirect: 5\n    m_PVRFilteringGaussRadiusAO: 2\n    m_PVRFilteringAtrousPositionSigmaDirect: 0.548\n    m_PVRFilteringAtrousPositionSigmaIndirect: 2\n    m_PVRFilteringAtrousPositionSigmaAO: 1\n    m_ExportTrainingData: 0\n    m_TrainingDataDestination: TrainingData\n    m_LightProbeSampleCountMultiplier: 4\n  m_LightingDataAsset: {fileID: 0}\n  m_LightingSettings: {fileID: 4890085278179872738, guid: 477cc4148fad3449482a3bc3178594e2, type: 2}\n--- !u!196 &4\nNavMeshSettings:\n  serializedVersion: 2\n  m_ObjectHideFlags: 0\n  m_BuildSettings:\n    serializedVersion: 2\n    agentTypeID: 0\n    agentRadius: 0.5\n    agentHeight: 2\n    agentSlope: 45\n    agentClimb: 0.4\n    ledgeDropHeight: 0\n    maxJumpAcrossDistance: 0\n    minRegionArea: 2\n    manualCellSize: 0\n    cellSize: 0.16666667\n    manualTileSize: 0\n    tileSize: 256\n    accuratePlacement: 0\n    maxJobWorkers: 0\n    preserveTilesOutsideBounds: 0\n    debug:\n      m_Flags: 0\n  m_NavMeshData: {fileID: 0}\n--- !u!1 &84139884\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 84139885}\n  - component: {fileID: 84139887}\n  - component: {fileID: 84139886}\n  m_Layer: 5\n  m_Name: PlayerContainer\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 0\n--- !u!224 &84139885\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 84139884}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children:\n  - {fileID: 556143344}\n  - {fileID: 1556049107}\n  - {fileID: 691273550}\n  m_Father: {fileID: 635846895}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 0}\n  m_AnchoredPosition: {x: -50, y: 25}\n  m_SizeDelta: {x: -150, y: 300}\n  m_Pivot: {x: 0.5, y: 0}\n--- !u!114 &84139886\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 84139884}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.06888571, g: 0.08200593, b: 0.11320752, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 21300000, guid: 7c81dda177317494594c6600575292b5, type: 3}\n  m_Type: 0\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &84139887\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 84139884}\n  m_CullTransparentMesh: 0\n--- !u!1 &106971680\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 106971681}\n  - component: {fileID: 106971683}\n  - component: {fileID: 106971682}\n  m_Layer: 5\n  m_Name: Text (TMP)\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &106971681\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 106971680}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 1563392481}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: -62.49997}\n  m_SizeDelta: {x: 0, y: -125.00006}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &106971682\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 106971680}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_text: '<b>GAME/SHOP\n\n    SCREEN</b>\n\n\n\n    <smallcaps>press ESC to go back</smallcaps>'\n  m_isRightToLeft: 0\n  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_fontSharedMaterials: []\n  m_fontMaterial: {fileID: 0}\n  m_fontMaterials: []\n  m_fontColor32:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontColor: {r: 1, g: 1, b: 1, a: 1}\n  m_enableVertexGradient: 0\n  m_colorMode: 3\n  m_fontColorGradient:\n    topLeft: {r: 1, g: 1, b: 1, a: 1}\n    topRight: {r: 1, g: 1, b: 1, a: 1}\n    bottomLeft: {r: 1, g: 1, b: 1, a: 1}\n    bottomRight: {r: 1, g: 1, b: 1, a: 1}\n  m_fontColorGradientPreset: {fileID: 0}\n  m_spriteAsset: {fileID: 0}\n  m_tintAllSprites: 0\n  m_StyleSheet: {fileID: 0}\n  m_TextStyleHashCode: -1183493901\n  m_overrideHtmlColors: 0\n  m_faceColor:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontSize: 36\n  m_fontSizeBase: 36\n  m_fontWeight: 400\n  m_enableAutoSizing: 0\n  m_fontSizeMin: 18\n  m_fontSizeMax: 72\n  m_fontStyle: 0\n  m_HorizontalAlignment: 2\n  m_VerticalAlignment: 512\n  m_textAlignment: 65535\n  m_characterSpacing: 0\n  m_wordSpacing: 0\n  m_lineSpacing: 0\n  m_lineSpacingMax: 0\n  m_paragraphSpacing: 0\n  m_charWidthMaxAdj: 0\n  m_enableWordWrapping: 1\n  m_wordWrappingRatios: 0.4\n  m_overflowMode: 0\n  m_linkedTextComponent: {fileID: 0}\n  parentLinkedComponent: {fileID: 0}\n  m_enableKerning: 1\n  m_enableExtraPadding: 0\n  checkPaddingRequired: 0\n  m_isRichText: 1\n  m_parseCtrlCharacters: 1\n  m_isOrthographic: 1\n  m_isCullingEnabled: 0\n  m_horizontalMapping: 0\n  m_verticalMapping: 0\n  m_uvLineOffset: 0\n  m_geometrySortingOrder: 0\n  m_IsTextObjectScaleStatic: 0\n  m_VertexBufferAutoSizeReduction: 1\n  m_useMaxVisibleDescender: 1\n  m_pageToDisplay: 1\n  m_margin: {x: 0, y: 0, z: 0, w: 0}\n  m_isUsingLegacyAnimationComponent: 0\n  m_isVolumetricText: 0\n  m_hasFontAssetChanged: 0\n  m_baseMaterial: {fileID: 0}\n  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}\n--- !u!222 &106971683\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 106971680}\n  m_CullTransparentMesh: 0\n--- !u!1 &159501387\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 159501388}\n  - component: {fileID: 159501390}\n  - component: {fileID: 159501389}\n  m_Layer: 5\n  m_Name: NpcContainer\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 0\n--- !u!224 &159501388\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 159501387}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children:\n  - {fileID: 1018603580}\n  - {fileID: 1917591670}\n  m_Father: {fileID: 635846895}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 0}\n  m_AnchoredPosition: {x: 50, y: 25}\n  m_SizeDelta: {x: -150, y: 300}\n  m_Pivot: {x: 0.5, y: 0}\n--- !u!114 &159501389\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 159501387}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.06888571, g: 0.08200593, b: 0.11320752, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 21300000, guid: 7c81dda177317494594c6600575292b5, type: 3}\n  m_Type: 0\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &159501390\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 159501387}\n  m_CullTransparentMesh: 0\n--- !u!1 &556143343\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 556143344}\n  - component: {fileID: 556143346}\n  - component: {fileID: 556143345}\n  m_Layer: 5\n  m_Name: Name\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &556143344\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 556143343}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 84139885}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 1}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 75}\n  m_Pivot: {x: 0.5, y: 1}\n--- !u!114 &556143345\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 556143343}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_text: Player\n  m_isRightToLeft: 0\n  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_fontSharedMaterials: []\n  m_fontMaterial: {fileID: 0}\n  m_fontMaterials: []\n  m_fontColor32:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontColor: {r: 1, g: 1, b: 1, a: 1}\n  m_enableVertexGradient: 0\n  m_colorMode: 3\n  m_fontColorGradient:\n    topLeft: {r: 1, g: 1, b: 1, a: 1}\n    topRight: {r: 1, g: 1, b: 1, a: 1}\n    bottomLeft: {r: 1, g: 1, b: 1, a: 1}\n    bottomRight: {r: 1, g: 1, b: 1, a: 1}\n  m_fontColorGradientPreset: {fileID: 0}\n  m_spriteAsset: {fileID: 0}\n  m_tintAllSprites: 0\n  m_StyleSheet: {fileID: 0}\n  m_TextStyleHashCode: -1183493901\n  m_overrideHtmlColors: 0\n  m_faceColor:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontSize: 36\n  m_fontSizeBase: 36\n  m_fontWeight: 400\n  m_enableAutoSizing: 0\n  m_fontSizeMin: 18\n  m_fontSizeMax: 72\n  m_fontStyle: 0\n  m_HorizontalAlignment: 1\n  m_VerticalAlignment: 512\n  m_textAlignment: 65535\n  m_characterSpacing: 0\n  m_wordSpacing: 0\n  m_lineSpacing: 0\n  m_lineSpacingMax: 0\n  m_paragraphSpacing: 0\n  m_charWidthMaxAdj: 0\n  m_enableWordWrapping: 1\n  m_wordWrappingRatios: 0.4\n  m_overflowMode: 0\n  m_linkedTextComponent: {fileID: 0}\n  parentLinkedComponent: {fileID: 0}\n  m_enableKerning: 1\n  m_enableExtraPadding: 0\n  checkPaddingRequired: 0\n  m_isRichText: 1\n  m_parseCtrlCharacters: 1\n  m_isOrthographic: 1\n  m_isCullingEnabled: 0\n  m_horizontalMapping: 0\n  m_verticalMapping: 0\n  m_uvLineOffset: 0\n  m_geometrySortingOrder: 0\n  m_IsTextObjectScaleStatic: 0\n  m_VertexBufferAutoSizeReduction: 1\n  m_useMaxVisibleDescender: 1\n  m_pageToDisplay: 1\n  m_margin: {x: 16, y: 0, z: 0, w: 0}\n  m_isUsingLegacyAnimationComponent: 0\n  m_isVolumetricText: 0\n  m_hasFontAssetChanged: 0\n  m_baseMaterial: {fileID: 0}\n  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}\n--- !u!222 &556143346\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 556143343}\n  m_CullTransparentMesh: 0\n--- !u!1 &635846891\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 635846895}\n  - component: {fileID: 635846894}\n  - component: {fileID: 635846893}\n  - component: {fileID: 635846892}\n  m_Layer: 5\n  m_Name: Canvas\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!114 &635846892\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 635846891}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_IgnoreReversedGraphics: 1\n  m_BlockingObjects: 0\n  m_BlockingMask:\n    serializedVersion: 2\n    m_Bits: 4294967295\n--- !u!114 &635846893\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 635846891}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_UiScaleMode: 0\n  m_ReferencePixelsPerUnit: 100\n  m_ScaleFactor: 1\n  m_ReferenceResolution: {x: 800, y: 600}\n  m_ScreenMatchMode: 0\n  m_MatchWidthOrHeight: 0\n  m_PhysicalUnit: 3\n  m_FallbackScreenDPI: 96\n  m_DefaultSpriteDPI: 96\n  m_DynamicPixelsPerUnit: 1\n  m_PresetInfoIsWorld: 0\n--- !u!223 &635846894\nCanvas:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 635846891}\n  m_Enabled: 1\n  serializedVersion: 3\n  m_RenderMode: 0\n  m_Camera: {fileID: 0}\n  m_PlaneDistance: 100\n  m_PixelPerfect: 0\n  m_ReceivesEvents: 1\n  m_OverrideSorting: 0\n  m_OverridePixelPerfect: 0\n  m_SortingBucketNormalizedSize: 0\n  m_AdditionalShaderChannelsFlag: 25\n  m_SortingLayerID: 0\n  m_SortingOrder: 0\n  m_TargetDisplay: 0\n--- !u!224 &635846895\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 635846891}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 0, y: 0, z: 0}\n  m_ConstrainProportionsScale: 0\n  m_Children:\n  - {fileID: 84139885}\n  - {fileID: 159501388}\n  - {fileID: 1563392481}\n  - {fileID: 793253569}\n  m_Father: {fileID: 0}\n  m_RootOrder: 2\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 0}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 0}\n  m_Pivot: {x: 0, y: 0}\n--- !u!1 &691273549\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 691273550}\n  - component: {fileID: 691273552}\n  - component: {fileID: 691273551}\n  m_Layer: 5\n  m_Name: PlayerText\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 0\n--- !u!224 &691273550\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 691273549}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 84139885}\n  m_RootOrder: 2\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: -37.5}\n  m_SizeDelta: {x: 0, y: -75}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &691273551\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 691273549}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_text: Message\n  m_isRightToLeft: 0\n  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_fontSharedMaterials: []\n  m_fontMaterial: {fileID: 0}\n  m_fontMaterials: []\n  m_fontColor32:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontColor: {r: 1, g: 1, b: 1, a: 1}\n  m_enableVertexGradient: 0\n  m_colorMode: 3\n  m_fontColorGradient:\n    topLeft: {r: 1, g: 1, b: 1, a: 1}\n    topRight: {r: 1, g: 1, b: 1, a: 1}\n    bottomLeft: {r: 1, g: 1, b: 1, a: 1}\n    bottomRight: {r: 1, g: 1, b: 1, a: 1}\n  m_fontColorGradientPreset: {fileID: 0}\n  m_spriteAsset: {fileID: 0}\n  m_tintAllSprites: 0\n  m_StyleSheet: {fileID: 0}\n  m_TextStyleHashCode: -1183493901\n  m_overrideHtmlColors: 0\n  m_faceColor:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontSize: 24\n  m_fontSizeBase: 24\n  m_fontWeight: 400\n  m_enableAutoSizing: 0\n  m_fontSizeMin: 18\n  m_fontSizeMax: 72\n  m_fontStyle: 0\n  m_HorizontalAlignment: 1\n  m_VerticalAlignment: 256\n  m_textAlignment: 65535\n  m_characterSpacing: 0\n  m_wordSpacing: 0\n  m_lineSpacing: 0\n  m_lineSpacingMax: 0\n  m_paragraphSpacing: 0\n  m_charWidthMaxAdj: 0\n  m_enableWordWrapping: 1\n  m_wordWrappingRatios: 0.4\n  m_overflowMode: 0\n  m_linkedTextComponent: {fileID: 0}\n  parentLinkedComponent: {fileID: 0}\n  m_enableKerning: 1\n  m_enableExtraPadding: 0\n  checkPaddingRequired: 0\n  m_isRichText: 1\n  m_parseCtrlCharacters: 1\n  m_isOrthographic: 1\n  m_isCullingEnabled: 0\n  m_horizontalMapping: 0\n  m_verticalMapping: 0\n  m_uvLineOffset: 0\n  m_geometrySortingOrder: 0\n  m_IsTextObjectScaleStatic: 0\n  m_VertexBufferAutoSizeReduction: 1\n  m_useMaxVisibleDescender: 1\n  m_pageToDisplay: 1\n  m_margin: {x: 25, y: 8, z: 25, w: 25}\n  m_isUsingLegacyAnimationComponent: 0\n  m_isVolumetricText: 0\n  m_hasFontAssetChanged: 0\n  m_baseMaterial: {fileID: 0}\n  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}\n--- !u!222 &691273552\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 691273549}\n  m_CullTransparentMesh: 0\n--- !u!1 &793253568\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 793253569}\n  - component: {fileID: 793253571}\n  - component: {fileID: 793253570}\n  m_Layer: 5\n  m_Name: Keybinds\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &793253569\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 793253568}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 635846895}\n  m_RootOrder: 3\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 0, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 1920, y: 0}\n  m_Pivot: {x: 0, y: 0.5}\n--- !u!114 &793253570\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 793253568}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_text: '<b>Keybinds</b>\n\n\n    General:\n\n    <b>F</b> - Enter conversation\n\n    <b>Z</b>\n    - Reset conversation state\n\n    <b>SPACE</b> - Continue conversation\n\n    <b>ESC</b>\n    - Close shop/game menu\n\n\n    Choosing Line:\n\n    <b>UP</b> - Select previous\n    line\n\n    <b>DOWN</b> - Select next line\n\n    <b>SPACE</b> - Confirm selection'\n  m_isRightToLeft: 0\n  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_fontSharedMaterials: []\n  m_fontMaterial: {fileID: 0}\n  m_fontMaterials: []\n  m_fontColor32:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontColor: {r: 1, g: 1, b: 1, a: 1}\n  m_enableVertexGradient: 0\n  m_colorMode: 3\n  m_fontColorGradient:\n    topLeft: {r: 1, g: 1, b: 1, a: 1}\n    topRight: {r: 1, g: 1, b: 1, a: 1}\n    bottomLeft: {r: 1, g: 1, b: 1, a: 1}\n    bottomRight: {r: 1, g: 1, b: 1, a: 1}\n  m_fontColorGradientPreset: {fileID: 0}\n  m_spriteAsset: {fileID: 0}\n  m_tintAllSprites: 0\n  m_StyleSheet: {fileID: 0}\n  m_TextStyleHashCode: -1183493901\n  m_overrideHtmlColors: 0\n  m_faceColor:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontSize: 36\n  m_fontSizeBase: 36\n  m_fontWeight: 400\n  m_enableAutoSizing: 0\n  m_fontSizeMin: 18\n  m_fontSizeMax: 72\n  m_fontStyle: 0\n  m_HorizontalAlignment: 1\n  m_VerticalAlignment: 256\n  m_textAlignment: 65535\n  m_characterSpacing: 0\n  m_wordSpacing: 0\n  m_lineSpacing: 0\n  m_lineSpacingMax: 0\n  m_paragraphSpacing: 0\n  m_charWidthMaxAdj: 0\n  m_enableWordWrapping: 1\n  m_wordWrappingRatios: 0.4\n  m_overflowMode: 0\n  m_linkedTextComponent: {fileID: 0}\n  parentLinkedComponent: {fileID: 0}\n  m_enableKerning: 1\n  m_enableExtraPadding: 0\n  checkPaddingRequired: 0\n  m_isRichText: 1\n  m_parseCtrlCharacters: 1\n  m_isOrthographic: 1\n  m_isCullingEnabled: 0\n  m_horizontalMapping: 0\n  m_verticalMapping: 0\n  m_uvLineOffset: 0\n  m_geometrySortingOrder: 0\n  m_IsTextObjectScaleStatic: 0\n  m_VertexBufferAutoSizeReduction: 1\n  m_useMaxVisibleDescender: 1\n  m_pageToDisplay: 1\n  m_margin: {x: 16, y: 16, z: 0, w: 0}\n  m_isUsingLegacyAnimationComponent: 0\n  m_isVolumetricText: 0\n  m_hasFontAssetChanged: 0\n  m_baseMaterial: {fileID: 0}\n  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}\n--- !u!222 &793253571\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 793253568}\n  m_CullTransparentMesh: 0\n--- !u!1 &815786735\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 815786738}\n  - component: {fileID: 815786737}\n  - component: {fileID: 815786736}\n  m_Layer: 0\n  m_Name: Dialogue\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!114 &815786736\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 815786735}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 80c49c349eea4a6f9719386703f11e48, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  DlogObject: {fileID: 2841676755933307327, guid: eb71420dc23754148891843881b4dc58, type: 3}\n  CurrentAssetGuid: eb71420dc23754148891843881b4dc58\n  PersistentData:\n  - ActorDataIndices:\n      m_keys:\n      - 7d6a525b-b711-4587-899b-abe39a024b3d\n      m_values: 00000000\n    ActorData:\n    - Name: Shopkeeper\n      CustomData: {fileID: 0}\n      Property:\n        Guid: 7d6a525b-b711-4587-899b-abe39a024b3d\n        ReferenceName: Actor_47349990\n        DisplayName: Shop Keeper\n        Type: 2\n    CheckDataIndices:\n      m_keys:\n      - 0499b57d-42ae-415f-b6fe-ccde98cc2fe1\n      - 3f457785-b316-4eae-87ee-8129b6b6ccd3\n      m_values: 0000000001000000\n    CheckData:\n    - _target: {fileID: 815786737}\n      _methodName: MetBefore\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.CheckEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: Angry\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.CheckEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    TriggerDataIndices:\n      m_keys:\n      - 040ac558-1527-47e7-96f5-741bd7d7a28e\n      - 4cf90030-325a-4b21-bde1-66f9e82e46ab\n      - 444013ed-b010-4bf5-aa9f-cc66c157bd12\n      - 81c1a9c3-23ac-4fd0-92cc-597d9a8172e3\n      - 2af6175d-4323-4bd4-be23-72ea22a80668\n      m_values: 0000000001000000020000000300000004000000\n    TriggerData:\n    - _target: {fileID: 815786737}\n      _methodName: Meet\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: ClearAngry\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: MakeAngry\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: PlayGame\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: OpenShop\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n  - ActorDataIndices:\n      m_keys:\n      - 7d6a525b-b711-4587-899b-abe39a024b3d\n      m_values: 00000000\n    ActorData:\n    - Name: Shopkeeper\n      CustomData: {fileID: 0}\n      Property:\n        Guid: 7d6a525b-b711-4587-899b-abe39a024b3d\n        ReferenceName: Actor_47349990\n        DisplayName: Shop Keeper\n        Type: 2\n    CheckDataIndices:\n      m_keys:\n      - 0499b57d-42ae-415f-b6fe-ccde98cc2fe1\n      - 3f457785-b316-4eae-87ee-8129b6b6ccd3\n      m_values: 0000000001000000\n    CheckData:\n    - _target: {fileID: 815786737}\n      _methodName: MetBefore\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.CheckEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: Angry\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.CheckEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    TriggerDataIndices:\n      m_keys:\n      - 040ac558-1527-47e7-96f5-741bd7d7a28e\n      - 4cf90030-325a-4b21-bde1-66f9e82e46ab\n      - 444013ed-b010-4bf5-aa9f-cc66c157bd12\n      - 81c1a9c3-23ac-4fd0-92cc-597d9a8172e3\n      - 2af6175d-4323-4bd4-be23-72ea22a80668\n      m_values: 0000000001000000020000000300000004000000\n    TriggerData:\n    - _target: {fileID: 815786737}\n      _methodName: Meet\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: ClearAngry\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: MakeAngry\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: PlayGame\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: PlayGame\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n  - ActorDataIndices:\n      m_keys:\n      - 7d6a525b-b711-4587-899b-abe39a024b3d\n      m_values: 00000000\n    ActorData:\n    - Name: Shopkeeper\n      CustomData: {fileID: 0}\n      Property:\n        Guid: 7d6a525b-b711-4587-899b-abe39a024b3d\n        ReferenceName: Actor_47349990\n        DisplayName: Shop Keeper\n        Type: 2\n    CheckDataIndices:\n      m_keys:\n      - 0499b57d-42ae-415f-b6fe-ccde98cc2fe1\n      - 3f457785-b316-4eae-87ee-8129b6b6ccd3\n      m_values: 0000000001000000\n    CheckData:\n    - _target: {fileID: 815786737}\n      _methodName: MetBefore\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.CheckEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: Angry\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.CheckEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    TriggerDataIndices:\n      m_keys:\n      - 040ac558-1527-47e7-96f5-741bd7d7a28e\n      - 4cf90030-325a-4b21-bde1-66f9e82e46ab\n      - 444013ed-b010-4bf5-aa9f-cc66c157bd12\n      - 81c1a9c3-23ac-4fd0-92cc-597d9a8172e3\n      - 2af6175d-4323-4bd4-be23-72ea22a80668\n      m_values: 0000000001000000020000000300000004000000\n    TriggerData:\n    - _target: {fileID: 815786737}\n      _methodName: Meet\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: ClearAngry\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: MakeAngry\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: PlayGame\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 815786737}\n      _methodName: OpenShop\n      _args:\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 4\n        _typeName: System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      - boolValue: 0\n        intValue: 0\n        floatValue: 0\n        stringValue: \n        objectValue: {fileID: 0}\n        argType: 2\n        _typeName: System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n  PersistentDataIndices:\n    m_keys:\n    - ffe1901b3b8186c41bce7f983aec2f3e\n    - f1715ee0a9e1d9943a01aff710c974ee\n    - eb71420dc23754148891843881b4dc58\n    m_values: 000000000100000002000000\n--- !u!114 &815786737\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 815786735}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 547a5bae61204ff9b4d06acd989900dc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  DialogueSystem: {fileID: 815786736}\n  LineController: {fileID: 1556049108}\n  SecondaryScreen: {fileID: 1563392480}\n  PlayerContainer: {fileID: 84139884}\n  NpcContainer: {fileID: 159501387}\n  PlayerText: {fileID: 691273551}\n  NpcText: {fileID: 1917591671}\n  NpcName: {fileID: 1018603581}\n--- !u!4 &815786738\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 815786735}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!1 &1018603579\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1018603580}\n  - component: {fileID: 1018603582}\n  - component: {fileID: 1018603581}\n  m_Layer: 5\n  m_Name: Name\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!224 &1018603580\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1018603579}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 159501388}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 1}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: 0, y: 75}\n  m_Pivot: {x: 0.5, y: 1}\n--- !u!114 &1018603581\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1018603579}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_text: <NPC NAME>\n  m_isRightToLeft: 0\n  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_fontSharedMaterials: []\n  m_fontMaterial: {fileID: 0}\n  m_fontMaterials: []\n  m_fontColor32:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontColor: {r: 1, g: 1, b: 1, a: 1}\n  m_enableVertexGradient: 0\n  m_colorMode: 3\n  m_fontColorGradient:\n    topLeft: {r: 1, g: 1, b: 1, a: 1}\n    topRight: {r: 1, g: 1, b: 1, a: 1}\n    bottomLeft: {r: 1, g: 1, b: 1, a: 1}\n    bottomRight: {r: 1, g: 1, b: 1, a: 1}\n  m_fontColorGradientPreset: {fileID: 0}\n  m_spriteAsset: {fileID: 0}\n  m_tintAllSprites: 0\n  m_StyleSheet: {fileID: 0}\n  m_TextStyleHashCode: -1183493901\n  m_overrideHtmlColors: 0\n  m_faceColor:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontSize: 36\n  m_fontSizeBase: 36\n  m_fontWeight: 400\n  m_enableAutoSizing: 0\n  m_fontSizeMin: 18\n  m_fontSizeMax: 72\n  m_fontStyle: 0\n  m_HorizontalAlignment: 4\n  m_VerticalAlignment: 512\n  m_textAlignment: 65535\n  m_characterSpacing: 0\n  m_wordSpacing: 0\n  m_lineSpacing: 0\n  m_lineSpacingMax: 0\n  m_paragraphSpacing: 0\n  m_charWidthMaxAdj: 0\n  m_enableWordWrapping: 1\n  m_wordWrappingRatios: 0.4\n  m_overflowMode: 0\n  m_linkedTextComponent: {fileID: 0}\n  parentLinkedComponent: {fileID: 0}\n  m_enableKerning: 1\n  m_enableExtraPadding: 0\n  checkPaddingRequired: 0\n  m_isRichText: 1\n  m_parseCtrlCharacters: 1\n  m_isOrthographic: 1\n  m_isCullingEnabled: 0\n  m_horizontalMapping: 0\n  m_verticalMapping: 0\n  m_uvLineOffset: 0\n  m_geometrySortingOrder: 0\n  m_IsTextObjectScaleStatic: 0\n  m_VertexBufferAutoSizeReduction: 1\n  m_useMaxVisibleDescender: 1\n  m_pageToDisplay: 1\n  m_margin: {x: 0, y: 0, z: 22, w: 0}\n  m_isUsingLegacyAnimationComponent: 0\n  m_isVolumetricText: 0\n  m_hasFontAssetChanged: 0\n  m_baseMaterial: {fileID: 0}\n  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}\n--- !u!222 &1018603582\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1018603579}\n  m_CullTransparentMesh: 0\n--- !u!1 &1142602751\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1142602754}\n  - component: {fileID: 1142602753}\n  - component: {fileID: 1142602752}\n  m_Layer: 0\n  m_Name: EventSystem\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!114 &1142602752\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1142602751}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_HorizontalAxis: Horizontal\n  m_VerticalAxis: Vertical\n  m_SubmitButton: Submit\n  m_CancelButton: Cancel\n  m_InputActionsPerSecond: 10\n  m_RepeatDelay: 0.5\n  m_ForceModuleActive: 0\n--- !u!114 &1142602753\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1142602751}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_FirstSelected: {fileID: 0}\n  m_sendNavigationEvents: 1\n  m_DragThreshold: 10\n--- !u!4 &1142602754\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1142602751}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 3\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!1 &1556049106\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1556049107}\n  - component: {fileID: 1556049109}\n  - component: {fileID: 1556049108}\n  m_Layer: 5\n  m_Name: Line Selection\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 0\n--- !u!224 &1556049107\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1556049106}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 84139885}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: -37.5}\n  m_SizeDelta: {x: 0, y: -75}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1556049108\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1556049106}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: a8f8a8f77c081134daf031e2c4d4c14a, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  Prefab: {fileID: 784771038537814059, guid: ec2a9df1e0f525c4da5d571c78b31254, type: 3}\n  Owner: {fileID: 815786737}\n--- !u!114 &1556049109\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1556049106}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Padding:\n    m_Left: 8\n    m_Right: 8\n    m_Top: 0\n    m_Bottom: 0\n  m_ChildAlignment: 1\n  m_Spacing: 4\n  m_ChildForceExpandWidth: 1\n  m_ChildForceExpandHeight: 0\n  m_ChildControlWidth: 1\n  m_ChildControlHeight: 0\n  m_ChildScaleWidth: 0\n  m_ChildScaleHeight: 0\n  m_ReverseArrangement: 0\n--- !u!1 &1563392480\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1563392481}\n  - component: {fileID: 1563392483}\n  - component: {fileID: 1563392482}\n  m_Layer: 5\n  m_Name: SecondaryScreen\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 0\n--- !u!224 &1563392481\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1563392480}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children:\n  - {fileID: 106971681}\n  m_Father: {fileID: 635846895}\n  m_RootOrder: 2\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: 0}\n  m_SizeDelta: {x: -200, y: -200}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1563392482\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1563392480}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 0.23148806, g: 0.26835877, b: 0.3207547, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_Sprite: {fileID: 21300000, guid: 7c81dda177317494594c6600575292b5, type: 3}\n  m_Type: 0\n  m_PreserveAspect: 0\n  m_FillCenter: 1\n  m_FillMethod: 4\n  m_FillAmount: 1\n  m_FillClockwise: 1\n  m_FillOrigin: 0\n  m_UseSpriteMesh: 0\n  m_PixelsPerUnitMultiplier: 1\n--- !u!222 &1563392483\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1563392480}\n  m_CullTransparentMesh: 0\n--- !u!1 &1687258581\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1687258585}\n  - component: {fileID: 1687258584}\n  - component: {fileID: 1687258582}\n  - component: {fileID: 1687258586}\n  - component: {fileID: 1687258583}\n  m_Layer: 0\n  m_Name: Main Camera\n  m_TagString: MainCamera\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 1\n--- !u!81 &1687258582\nAudioListener:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1687258581}\n  m_Enabled: 1\n--- !u!114 &1687258583\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1687258581}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: 80c49c349eea4a6f9719386703f11e48, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  DlogObject: {fileID: 0}\n  CurrentAssetGuid: \n  PersistentData:\n  - ActorDataIndices:\n      m_keys:\n      - 58b3f912-90e7-49e2-8556-e267f54323f8\n      - 7f753410-7770-483b-a77d-900b84e7c3d6\n      m_values: 0000000001000000\n    ActorData:\n    - Name: Empty name\n      CustomData: {fileID: 0}\n      Property:\n        Guid: 58b3f912-90e7-49e2-8556-e267f54323f8\n        ReferenceName: Actor_40D0FB02\n        DisplayName: Actor 1\n        Type: 2\n    - Name: Empty name\n      CustomData: {fileID: 0}\n      Property:\n        Guid: 7f753410-7770-483b-a77d-900b84e7c3d6\n        ReferenceName: Actor_43EC52E2\n        DisplayName: Actor 2\n        Type: 2\n    CheckDataIndices:\n      m_keys:\n      - 30488925-40af-4ce8-a42e-f1048d4da6f1\n      m_values: 00000000\n    CheckData:\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.CheckEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    TriggerDataIndices:\n      m_keys:\n      - 024bf191-83a4-4ed3-a54f-fbf4c9c19ed2\n      - 5270c986-58a9-4978-aa4d-6014271f633c\n      m_values: 0000000001000000\n    TriggerData:\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n  - ActorDataIndices:\n      m_keys:\n      - 7d6a525b-b711-4587-899b-abe39a024b3d\n      m_values: 00000000\n    ActorData:\n    - Name: Empty name\n      CustomData: {fileID: 0}\n      Property:\n        Guid: 7d6a525b-b711-4587-899b-abe39a024b3d\n        ReferenceName: Actor_47349990\n        DisplayName: Shop Keeper\n        Type: 2\n    CheckDataIndices:\n      m_keys:\n      - 0499b57d-42ae-415f-b6fe-ccde98cc2fe1\n      - 3f457785-b316-4eae-87ee-8129b6b6ccd3\n      m_values: 0000000001000000\n    CheckData:\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.CheckEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.CheckEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    TriggerDataIndices:\n      m_keys:\n      - 040ac558-1527-47e7-96f5-741bd7d7a28e\n      - 4cf90030-325a-4b21-bde1-66f9e82e46ab\n      - 444013ed-b010-4bf5-aa9f-cc66c157bd12\n      - 81c1a9c3-23ac-4fd0-92cc-597d9a8172e3\n      - 2af6175d-4323-4bd4-be23-72ea22a80668\n      m_values: 0000000001000000020000000300000004000000\n    TriggerData:\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n    - _target: {fileID: 0}\n      _methodName: \n      _args: []\n      _dynamic: 1\n      _typeName: DialogueGraph.Runtime.TriggerEvent, DialogueGraph.Runtime, Version=0.0.0.0,\n        Culture=neutral, PublicKeyToken=null\n      dirty: 0\n  PersistentDataIndices:\n    m_keys:\n    - 247af246f342191408c82ff955be4ca3\n    - ffe1901b3b8186c41bce7f983aec2f3e\n    m_values: 0000000001000000\n--- !u!20 &1687258584\nCamera:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1687258581}\n  m_Enabled: 1\n  serializedVersion: 2\n  m_ClearFlags: 2\n  m_BackGroundColor: {r: 0.20754719, g: 0.20754719, b: 0.20754719, a: 0}\n  m_projectionMatrixMode: 1\n  m_GateFitMode: 2\n  m_FOVAxisMode: 0\n  m_SensorSize: {x: 36, y: 24}\n  m_LensShift: {x: 0, y: 0}\n  m_FocalLength: 50\n  m_NormalizedViewPortRect:\n    serializedVersion: 2\n    x: 0\n    y: 0\n    width: 1\n    height: 1\n  near clip plane: 0.3\n  far clip plane: 1000\n  field of view: 60\n  orthographic: 0\n  orthographic size: 5\n  m_Depth: -1\n  m_CullingMask:\n    serializedVersion: 2\n    m_Bits: 4294967295\n  m_RenderingPath: -1\n  m_TargetTexture: {fileID: 0}\n  m_TargetDisplay: 0\n  m_TargetEye: 3\n  m_HDR: 1\n  m_AllowMSAA: 1\n  m_AllowDynamicResolution: 0\n  m_ForceIntoRT: 0\n  m_OcclusionCulling: 1\n  m_StereoConvergence: 10\n  m_StereoSeparation: 0.022\n--- !u!4 &1687258585\nTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1687258581}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 0}\n  m_RootOrder: 0\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n--- !u!114 &1687258586\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1687258581}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_RenderShadows: 1\n  m_RequiresDepthTextureOption: 2\n  m_RequiresOpaqueTextureOption: 2\n  m_CameraType: 0\n  m_Cameras: []\n  m_RendererIndex: -1\n  m_VolumeLayerMask:\n    serializedVersion: 2\n    m_Bits: 1\n  m_VolumeTrigger: {fileID: 0}\n  m_VolumeFrameworkUpdateModeOption: 2\n  m_RenderPostProcessing: 1\n  m_Antialiasing: 1\n  m_AntialiasingQuality: 2\n  m_StopNaN: 1\n  m_Dithering: 0\n  m_ClearDepth: 1\n  m_AllowXRRendering: 1\n  m_RequiresDepthTexture: 0\n  m_RequiresColorTexture: 0\n  m_Version: 2\n--- !u!1 &1917591669\nGameObject:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  serializedVersion: 6\n  m_Component:\n  - component: {fileID: 1917591670}\n  - component: {fileID: 1917591672}\n  - component: {fileID: 1917591671}\n  m_Layer: 5\n  m_Name: NpcText\n  m_TagString: Untagged\n  m_Icon: {fileID: 0}\n  m_NavMeshLayer: 0\n  m_StaticEditorFlags: 0\n  m_IsActive: 0\n--- !u!224 &1917591670\nRectTransform:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1917591669}\n  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}\n  m_LocalPosition: {x: 0, y: 0, z: 0}\n  m_LocalScale: {x: 1, y: 1, z: 1}\n  m_ConstrainProportionsScale: 0\n  m_Children: []\n  m_Father: {fileID: 159501388}\n  m_RootOrder: 1\n  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}\n  m_AnchorMin: {x: 0, y: 0}\n  m_AnchorMax: {x: 1, y: 1}\n  m_AnchoredPosition: {x: 0, y: -37.5}\n  m_SizeDelta: {x: 0, y: -75}\n  m_Pivot: {x: 0.5, y: 0.5}\n--- !u!114 &1917591671\nMonoBehaviour:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1917591669}\n  m_Enabled: 1\n  m_EditorHideFlags: 0\n  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}\n  m_Name: \n  m_EditorClassIdentifier: \n  m_Material: {fileID: 0}\n  m_Color: {r: 1, g: 1, b: 1, a: 1}\n  m_RaycastTarget: 1\n  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}\n  m_Maskable: 1\n  m_OnCullStateChanged:\n    m_PersistentCalls:\n      m_Calls: []\n  m_text: Message\n  m_isRightToLeft: 0\n  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}\n  m_fontSharedMaterials: []\n  m_fontMaterial: {fileID: 0}\n  m_fontMaterials: []\n  m_fontColor32:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontColor: {r: 1, g: 1, b: 1, a: 1}\n  m_enableVertexGradient: 0\n  m_colorMode: 3\n  m_fontColorGradient:\n    topLeft: {r: 1, g: 1, b: 1, a: 1}\n    topRight: {r: 1, g: 1, b: 1, a: 1}\n    bottomLeft: {r: 1, g: 1, b: 1, a: 1}\n    bottomRight: {r: 1, g: 1, b: 1, a: 1}\n  m_fontColorGradientPreset: {fileID: 0}\n  m_spriteAsset: {fileID: 0}\n  m_tintAllSprites: 0\n  m_StyleSheet: {fileID: 0}\n  m_TextStyleHashCode: -1183493901\n  m_overrideHtmlColors: 0\n  m_faceColor:\n    serializedVersion: 2\n    rgba: 4294967295\n  m_fontSize: 24\n  m_fontSizeBase: 24\n  m_fontWeight: 400\n  m_enableAutoSizing: 0\n  m_fontSizeMin: 18\n  m_fontSizeMax: 72\n  m_fontStyle: 0\n  m_HorizontalAlignment: 1\n  m_VerticalAlignment: 256\n  m_textAlignment: 65535\n  m_characterSpacing: 0\n  m_wordSpacing: 0\n  m_lineSpacing: 0\n  m_lineSpacingMax: 0\n  m_paragraphSpacing: 0\n  m_charWidthMaxAdj: 0\n  m_enableWordWrapping: 1\n  m_wordWrappingRatios: 0.4\n  m_overflowMode: 0\n  m_linkedTextComponent: {fileID: 0}\n  parentLinkedComponent: {fileID: 0}\n  m_enableKerning: 1\n  m_enableExtraPadding: 0\n  checkPaddingRequired: 0\n  m_isRichText: 1\n  m_parseCtrlCharacters: 1\n  m_isOrthographic: 1\n  m_isCullingEnabled: 0\n  m_horizontalMapping: 0\n  m_verticalMapping: 0\n  m_uvLineOffset: 0\n  m_geometrySortingOrder: 0\n  m_IsTextObjectScaleStatic: 0\n  m_VertexBufferAutoSizeReduction: 1\n  m_useMaxVisibleDescender: 1\n  m_pageToDisplay: 1\n  m_margin: {x: 25, y: 8, z: 25, w: 25}\n  m_isUsingLegacyAnimationComponent: 0\n  m_isVolumetricText: 0\n  m_hasFontAssetChanged: 0\n  m_baseMaterial: {fileID: 0}\n  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}\n--- !u!222 &1917591672\nCanvasRenderer:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_GameObject: {fileID: 1917591669}\n  m_CullTransparentMesh: 0\n"
  },
  {
    "path": "Samples~/DemoProject/Scenes/Demo.unity.meta",
    "content": "fileFormatVersion: 2\nguid: d1c3109bdb54ad54c8a2b2838528e640\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Scenes/DemoLightingSettings.lighting",
    "content": "%YAML 1.1\n%TAG !u! tag:unity3d.com,2011:\n--- !u!850595691 &4890085278179872738\nLightingSettings:\n  m_ObjectHideFlags: 0\n  m_CorrespondingSourceObject: {fileID: 0}\n  m_PrefabInstance: {fileID: 0}\n  m_PrefabAsset: {fileID: 0}\n  m_Name: DemoLightingSettings\n  serializedVersion: 2\n  m_GIWorkflowMode: 1\n  m_EnableBakedLightmaps: 1\n  m_EnableRealtimeLightmaps: 0\n  m_RealtimeEnvironmentLighting: 0\n  m_BounceScale: 1\n  m_AlbedoBoost: 1\n  m_IndirectOutputScale: 1\n  m_UsingShadowmask: 0\n  m_BakeBackend: 1\n  m_LightmapMaxSize: 512\n  m_BakeResolution: 32\n  m_Padding: 2\n  m_TextureCompression: 1\n  m_AO: 1\n  m_AOMaxDistance: 1\n  m_CompAOExponent: 1\n  m_CompAOExponentDirect: 0.3\n  m_ExtractAO: 0\n  m_MixedBakeMode: 0\n  m_LightmapsBakeMode: 1\n  m_FilterMode: 1\n  m_LightmapParameters: {fileID: 0}\n  m_ExportTrainingData: 0\n  m_TrainingDataDestination: TrainingData\n  m_RealtimeResolution: 2\n  m_ForceWhiteAlbedo: 0\n  m_ForceUpdates: 0\n  m_FinalGather: 0\n  m_FinalGatherRayCount: 256\n  m_FinalGatherFiltering: 1\n  m_PVRCulling: 1\n  m_PVRSampling: 1\n  m_PVRDirectSampleCount: 32\n  m_PVRSampleCount: 256\n  m_PVREnvironmentSampleCount: 256\n  m_PVREnvironmentReferencePointCount: 2048\n  m_LightProbeSampleCountMultiplier: 4\n  m_PVRBounces: 2\n  m_PVRRussianRouletteStartBounce: 2\n  m_PVREnvironmentMIS: 0\n  m_PVRFilteringMode: 1\n  m_PVRDenoiserTypeDirect: 0\n  m_PVRDenoiserTypeIndirect: 0\n  m_PVRDenoiserTypeAO: 0\n  m_PVRFilterTypeDirect: 0\n  m_PVRFilterTypeIndirect: 0\n  m_PVRFilterTypeAO: 0\n  m_PVRFilteringGaussRadiusDirect: 1\n  m_PVRFilteringGaussRadiusIndirect: 5\n  m_PVRFilteringGaussRadiusAO: 2\n  m_PVRFilteringAtrousPositionSigmaDirect: 0.548\n  m_PVRFilteringAtrousPositionSigmaIndirect: 2\n  m_PVRFilteringAtrousPositionSigmaAO: 1\n"
  },
  {
    "path": "Samples~/DemoProject/Scenes/DemoLightingSettings.lighting.meta",
    "content": "fileFormatVersion: 2\nguid: 477cc4148fad3449482a3bc3178594e2\nNativeFormatImporter:\n  externalObjects: {}\n  mainObjectFileID: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Scenes.meta",
    "content": "fileFormatVersion: 2\nguid: 1f019e5d20d1e264fa2574da13337124\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Scripts/LineController.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing DialogueGraph.Runtime;\nusing UnityEngine;\n\npublic class LineController : MonoBehaviour {\n    public LineEntry Prefab;\n    public NPCDialogue Owner;\n    private List<LineEntry> entries;\n    private int selectedIndex;\n    private bool isActive;\n\n    public void Clear() {\n        entries.ForEach(entry => Destroy(entry.gameObject));\n        entries.Clear();\n    }\n\n    public void Initialize(List<ConversationLine> lines) {\n        isActive = true;\n        entries = new List<LineEntry>();\n        for (var i = 0; i < lines.Count; i++) {\n            var line = lines[i];\n            var entry = Instantiate(Prefab, transform);\n            entry.Initialize(line.Message);\n            entries.Add(entry);\n        }\n\n        selectedIndex = 0;\n        entries[0].Select(true);\n    }\n\n    public void SelectLine(int index) {\n        Clear();\n        isActive = false;\n        selectedIndex = -1;\n        Owner.PlayerSelect(index);\n    }\n\n    private void Update() {\n        if(!isActive) return;\n        if (Input.GetKeyDown(KeyCode.DownArrow)) {\n            var nextIndex = Mathf.Min(selectedIndex + 1, entries.Count - 1);\n            entries[selectedIndex].Select(false);\n            entries[nextIndex].Select(true);\n            selectedIndex = nextIndex;\n        } else if (Input.GetKeyDown(KeyCode.UpArrow)) {\n            var nextIndex = Mathf.Max(selectedIndex - 1, 0);\n            entries[selectedIndex].Select(false);\n            entries[nextIndex].Select(true);\n            selectedIndex = nextIndex;\n        }\n\n        if (Input.GetKeyDown(KeyCode.Space)) {\n            SelectLine(selectedIndex);\n        }\n    }\n}\n"
  },
  {
    "path": "Samples~/DemoProject/Scripts/LineController.cs.meta",
    "content": "fileFormatVersion: 2\nguid: a8f8a8f77c081134daf031e2c4d4c14a\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Scripts/LineEntry.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing TMPro;\nusing UnityEngine;\nusing UnityEngine.UI;\n\npublic class LineEntry : MonoBehaviour {\n    public TMP_Text Text;\n    public Image Selection;\n\n    public void Initialize(string text) {\n        Text.text = text;\n        Select(false);\n    }\n\n    public void Select(bool selected) {\n        Selection.fillAmount = selected ? 1 : 0;\n    }\n}\n"
  },
  {
    "path": "Samples~/DemoProject/Scripts/LineEntry.cs.meta",
    "content": "fileFormatVersion: 2\nguid: df26159aefe9e0a439a7155f15eecbed\nMonoImporter:\n  externalObjects: {}\n  serializedVersion: 2\n  defaultReferences: []\n  executionOrder: 0\n  icon: {instanceID: 0}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Scripts/NPCDialogue.cs",
    "content": "using DialogueGraph.Runtime;\nusing TMPro;\nusing UnityEngine;\n\npublic class NPCDialogue : MonoBehaviour {\n    public RuntimeDialogueGraph DialogueSystem;\n    public LineController LineController;\n\n    [Header(\"UI References\")]\n    public GameObject SecondaryScreen;\n    public GameObject PlayerContainer;\n    public GameObject NpcContainer;\n    public TMP_Text PlayerText;\n    public TMP_Text NpcText;\n    public TMP_Text NpcName;\n\n    private bool metBefore = false;\n    private bool isAngry = false;\n\n    private bool isInConversation = false;\n    private bool showingSecondaryScreen;\n    private bool showPlayer;\n    private bool isPlayerChoosing;\n    private bool shouldShowText;\n    private bool showingText;\n    private string textToShow;\n\n    private void Update() {\n        if (Input.GetKeyDown(KeyCode.Z) && !isInConversation) {\n            metBefore = false;\n            isAngry = false;\n        }\n\n        if (Input.GetKeyDown(KeyCode.F) && !isInConversation) {\n            DialogueSystem.ResetConversation();\n            isInConversation = true;\n            (showPlayer ? PlayerContainer : NpcContainer).SetActive(true);\n        }\n\n        if (showingSecondaryScreen) {\n            if (Input.GetKeyDown(KeyCode.Escape)) {\n                showingSecondaryScreen = false;\n                SecondaryScreen.SetActive(false);\n            }\n            return;\n        }\n\n        if (!isInConversation || isPlayerChoosing) return;\n        if (shouldShowText) {\n            (showPlayer ? PlayerContainer : NpcContainer).SetActive(true);\n            (showPlayer ? PlayerText : NpcText).gameObject.SetActive(true);\n            (showPlayer ? PlayerText : NpcText).text = textToShow;\n            showingText = true;\n            shouldShowText = false;\n        }\n\n        if (showingText) {\n            if (Input.GetKeyDown(KeyCode.Space)) {\n                showingText = false;\n                (showPlayer ? PlayerContainer : NpcContainer).SetActive(false);\n                (showPlayer ? PlayerText : NpcText).gameObject.SetActive(false);\n            }\n        } else {\n            if (DialogueSystem.IsConversationDone()) {\n                // Reset state\n                isInConversation = false;\n                showingSecondaryScreen = false;\n                showPlayer = false;\n                isPlayerChoosing = false;\n                shouldShowText = false;\n                showingText = false;\n\n                PlayerContainer.SetActive(false);\n                NpcContainer.SetActive(false);\n                return;\n            }\n\n            var isNpc = DialogueSystem.IsCurrentNpc();\n            if (isNpc) {\n                var currentActor = DialogueSystem.GetCurrentActor();\n                showPlayer = false;\n                shouldShowText = true;\n                textToShow = DialogueSystem.ProgressNpc();\n                NpcName.text = currentActor.Name;\n            } else {\n                var currentLines = DialogueSystem.GetCurrentLines();\n                isPlayerChoosing = true;\n                PlayerContainer.SetActive(true);\n                LineController.gameObject.SetActive(true);\n                LineController.Initialize(currentLines);\n            }\n        }\n    }\n\n    public void PlayerSelect(int index) {\n        LineController.gameObject.SetActive(false);\n        textToShow = DialogueSystem.ProgressSelf(index);\n        isPlayerChoosing = false;\n        shouldShowText = true;\n        showPlayer = true;\n    }\n\n    public bool MetBefore(string node, int lineIndex) {\n        return metBefore;\n    }\n\n    public bool Angry(string node, int lineIndex) {\n        return isAngry;\n    }\n\n    public void Meet(string node, int lineIndex) {\n        metBefore = true;\n    }\n\n    public void MakeAngry(string node, int lineIndex) {\n        isAngry = true;\n    }\n\n    public void ClearAngry(string node, int lineIndex) {\n        isAngry = false;\n    }\n\n    public void PlayGame(string node, int lineIndex) {\n        showingSecondaryScreen = true;\n        SecondaryScreen.SetActive(true);\n\n        NpcContainer.SetActive(false);\n        PlayerContainer.gameObject.SetActive(false);\n        showingText = false;\n        PlayerText.gameObject.SetActive(false);\n        NpcText.gameObject.SetActive(false);\n    }\n\n    public void OpenShop(string node, int lineIndex) {\n        showingSecondaryScreen = true;\n        SecondaryScreen.SetActive(true);\n\n        NpcContainer.SetActive(false);\n        PlayerContainer.gameObject.SetActive(false);\n        showingText = false;\n        PlayerText.gameObject.SetActive(false);\n        NpcText.gameObject.SetActive(false);\n    }\n}"
  },
  {
    "path": "Samples~/DemoProject/Scripts/NPCDialogue.cs.meta",
    "content": "﻿fileFormatVersion: 2\nguid: 547a5bae61204ff9b4d06acd989900dc\ntimeCreated: 1603725413"
  },
  {
    "path": "Samples~/DemoProject/Scripts.meta",
    "content": "fileFormatVersion: 2\nguid: 497b4a31a97474c499de5f5c516c0560\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Sprites/Square.png.meta",
    "content": "fileFormatVersion: 2\nguid: 7c81dda177317494594c6600575292b5\nTextureImporter:\n  internalIDToNameTable: []\n  externalObjects: {}\n  serializedVersion: 11\n  mipmaps:\n    mipMapMode: 0\n    enableMipMap: 1\n    sRGBTexture: 1\n    linearTexture: 0\n    fadeOut: 0\n    borderMipMap: 0\n    mipMapsPreserveCoverage: 0\n    alphaTestReferenceValue: 0.5\n    mipMapFadeDistanceStart: 1\n    mipMapFadeDistanceEnd: 3\n  bumpmap:\n    convertToNormalMap: 0\n    externalNormalMap: 0\n    heightScale: 0.25\n    normalMapFilter: 0\n  isReadable: 0\n  streamingMipmaps: 0\n  streamingMipmapsPriority: 0\n  vTOnly: 0\n  grayScaleToAlpha: 0\n  generateCubemap: 6\n  cubemapConvolution: 0\n  seamlessCubemap: 0\n  textureFormat: 1\n  maxTextureSize: 2048\n  textureSettings:\n    serializedVersion: 2\n    filterMode: 0\n    aniso: 1\n    mipBias: 0\n    wrapU: 0\n    wrapV: 0\n    wrapW: 0\n  nPOTScale: 0\n  lightmap: 0\n  compressionQuality: 50\n  spriteMode: 3\n  spriteExtrude: 1\n  spriteMeshType: 1\n  alignment: 0\n  spritePivot: {x: 0.5, y: 0.5}\n  spritePixelsToUnits: 4\n  spriteBorder: {x: 0, y: 0, z: 0, w: 0}\n  spriteGenerateFallbackPhysicsShape: 1\n  alphaUsage: 1\n  alphaIsTransparency: 0\n  spriteTessellationDetail: -1\n  textureType: 8\n  textureShape: 1\n  singleChannelComponent: 0\n  maxTextureSizeSet: 0\n  compressionQualitySet: 0\n  textureFormatSet: 0\n  ignorePngGamma: 0\n  applyGammaDecoding: 0\n  platformSettings:\n  - serializedVersion: 3\n    buildTarget: DefaultTexturePlatform\n    maxTextureSize: 2048\n    resizeAlgorithm: 0\n    textureFormat: 4\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Standalone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: iPhone\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Android\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  - serializedVersion: 3\n    buildTarget: Windows Store Apps\n    maxTextureSize: 8192\n    resizeAlgorithm: 0\n    textureFormat: -1\n    textureCompression: 1\n    compressionQuality: 50\n    crunchedCompression: 0\n    allowsAlphaSplitting: 0\n    overridden: 0\n    androidETC2FallbackOverride: 0\n    forceMaximumCompressionQuality_BC6H_BC7: 0\n  spriteSheet:\n    serializedVersion: 2\n    sprites: []\n    outline:\n    - - {x: -2, y: -2}\n      - {x: -2, y: 2}\n      - {x: 2, y: 2}\n      - {x: 2, y: -2}\n    physicsShape:\n    - - {x: -2, y: -2}\n      - {x: -2, y: 2}\n      - {x: 2, y: 2}\n      - {x: 2, y: -2}\n    bones: []\n    spriteID: 5e97eb03825dee720800000000000000\n    internalID: 0\n    vertices: []\n    indices: \n    edges: []\n    weights: []\n    secondaryTextures: []\n  spritePackingTag: \n  pSDRemoveMatte: 0\n  pSDShowRemoveMatteOption: 0\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject/Sprites.meta",
    "content": "fileFormatVersion: 2\nguid: 9939e84b550d92d4f859b5efa139b152\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "Samples~/DemoProject.meta",
    "content": "fileFormatVersion: 2\nguid: cd315cd9d6ef85d4d8b5a7e472403b3e\nfolderAsset: yes\nDefaultImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"com.github.teodorvecerdi.dialoguegraph\",\n  \"version\": \"2.0.0\",\n  \"displayName\": \"Dialogue Graph\",\n  \"description\": \"Interactive node-based tool similar to Shader Graph for developing branching conversation trees.\\nExample uses could be conversations with NPCs, but because this tool is mostly general purpose you can use it for any scenario that requires branching logic.\",\n  \"unity\": \"2020.3\",\n  \"keywords\": [\n    \"node-based\",\n    \"editor-tool\",\n    \"dialogue\",\n    \"visual-scripting\",\n    \"conversation\"\n  ],\n  \"author\": {\n    \"name\": \"Teodor Vecerdi\",\n    \"email\": \"teodor.vecerdi@gmail.com\",\n    \"url\": \"https://github.com/TeodorVecerdi\"\n  },\n  \"dependencies\": {\n    \"com.unity.textmeshpro\": \"3.0.1\",\n    \"com.unity.shadergraph\": \"10.5.1\",\n    \"com.unity.nuget.newtonsoft-json\": \"2.0.0\"\n  },\n  \"samples\": [\n    {\n      \"displayName\": \"Demo Project\",\n      \"description\": \"Small project showcasing the base usage of Dialogue Graph, including the Runtime API\",\n      \"path\": \"Samples~/DemoProject\"\n    }\n  ],\n  \"repository\": {\n    \"url\": \"https://github.com/TeodorVecerdi/DialogueGraph.git\",\n    \"type\": \"git\"\n  }\n}"
  },
  {
    "path": "package.json.meta",
    "content": "fileFormatVersion: 2\nguid: cad7e5ecfe4f9cd4b8bb7fa9b77499b5\nTextScriptImporter:\n  externalObjects: {}\n  userData: \n  assetBundleName: \n  assetBundleVariant: \n"
  }
]