Decompiled source of Cinematic Unity Explorer v1.3.5

CinematicUnityExplorer.BIE5.Mono.dll

Decompiled 2 weeks ago
using System;
using System.CodeDom.Compiler;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Diagnostics.SymbolStore;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Cryptography;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Timers;
using System.Xml;
using System.Xml.Serialization;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CinematicUnityExplorer.Cinematic;
using CinematicUnityExplorer.Inspectors;
using CinematicUnityExplorer.LineDrawing;
using CinematicUnityExplorer.Patches;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Mono.CSharp;
using Mono.CSharp.IL2CPP;
using Mono.CSharp.Linq;
using Mono.CSharp.Nullable;
using Mono.CSharp.yyParser;
using Mono.CSharp.yydebug;
using Mono.CompilerServices.SymbolWriter;
using MonoMod.RuntimeDetour;
using Tomlet;
using Tomlet.Attributes;
using Tomlet.Exceptions;
using Tomlet.Models;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityExplorer;
using UnityExplorer.CSConsole;
using UnityExplorer.CSConsole.Lexers;
using UnityExplorer.CacheObject;
using UnityExplorer.CacheObject.IValues;
using UnityExplorer.CacheObject.Views;
using UnityExplorer.CatmullRom;
using UnityExplorer.Config;
using UnityExplorer.Hooks;
using UnityExplorer.Inspectors;
using UnityExplorer.Inspectors.MouseInspectors;
using UnityExplorer.Loader.BIE;
using UnityExplorer.ObjectExplorer;
using UnityExplorer.Runtime;
using UnityExplorer.Serializers;
using UnityExplorer.UI;
using UnityExplorer.UI.Panels;
using UnityExplorer.UI.Widgets;
using UnityExplorer.UI.Widgets.AutoComplete;
using UnityExplorerPlus.ParseUtility;
using UniverseLib;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.Runtime;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.ObjectPool;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.UI.Widgets.ButtonList;
using UniverseLib.UI.Widgets.ScrollView;
using UniverseLib.Utility;

[assembly: AssemblyTitle("CinematicUnityExplorer")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: ComVisible(false)]
[assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")]
[assembly: AssemblyFileVersion("1.4.0")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCompany("originalnicodr, Sinai, yukieiji")]
[assembly: AssemblyProduct("CinematicUnityExplorer")]
[assembly: AssemblyCopyright("")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.4.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[<ea549b1f-d2b1-43fc-b732-d20c4d3ca6f0>Embedded]
	internal sealed class <ea549b1f-d2b1-43fc-b732-d20c4d3ca6f0>EmbeddedAttribute : System.Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[<ea549b1f-d2b1-43fc-b732-d20c4d3ca6f0>Embedded]
	internal sealed class IsReadOnlyAttribute : Attribute
	{
	}
}
namespace UnityExplorerPlus.ParseUtility
{
	public static class ParseManager
	{
		private static readonly Dictionary<string, Func<object, string>> customToStringsByFullName = new Dictionary<string, Func<object, string>>();

		private static readonly Dictionary<Type, Func<object, string>> customToStrings = new Dictionary<Type, Func<object, string>>();

		private static readonly Dictionary<string, Type> typeCache = new Dictionary<string, Type>();

		private static Type GetCachedType(string typeFullName)
		{
			if (typeCache.TryGetValue(typeFullName, out var value))
			{
				return value;
			}
			Type type = AccessTools.TypeByName(typeFullName);
			if ((object)type != null)
			{
				typeCache[typeFullName] = type;
			}
			return type;
		}

		public static string TryGetCustomToString(object value)
		{
			if (UnityHelpers.IsNullOrDestroyed(value, true))
			{
				return null;
			}
			Type type = value.GetType();
			if (customToStrings.TryGetValue(type, out var value2))
			{
				return value2(value);
			}
			return customToStrings.FirstOrDefault((KeyValuePair<Type, Func<object, string>> x) => x.Key.IsInstanceOfType(value)).Value?.Invoke(value);
		}

		public static bool IsTypeRegisteredForToString(Type type)
		{
			return customToStrings.ContainsKey(type) || customToStrings.Any((KeyValuePair<Type, Func<object, string>> x) => x.Key.IsInstanceOfType(type));
		}

		public static void RegisterToString(string typeFullName, Func<object, string> toString)
		{
			if (customToStringsByFullName.ContainsKey(typeFullName))
			{
			}
			customToStringsByFullName[typeFullName] = toString;
			Type cachedType = GetCachedType(typeFullName);
			if ((object)cachedType != null)
			{
				customToStrings[cachedType] = toString;
			}
		}

		public static void RegisterToString<T>(Func<T, string> toString)
		{
			RegisterToString(typeof(T).FullName, (object val) => toString((T)val));
		}

		public static void Init()
		{
			RegisterToString("tk2dSpriteAnimationClip", delegate(object clip)
			{
				string text11 = ((clip?.GetType().GetField("name"))?.GetValue(clip) as string) ?? "UnnamedClip";
				return "<color=grey>tk2dSpriteAnimationClip: </color><color=green>" + text11 + "</color>";
			});
			RegisterToString("tk2dSpriteDefinition", delegate(object def)
			{
				string text10 = ((def?.GetType().GetField("name"))?.GetValue(def) as string) ?? "UnnamedDefinition";
				return "<color=grey>tk2dSpriteDefinition: </color><color=green>" + text10 + "</color>";
			});
			RegisterToString("tk2dSpriteAnimationFrame", delegate(object frame)
			{
				string text9 = (frame?.GetType().GetField("spriteId"))?.GetValue(frame)?.ToString() ?? "UnnamedSpriteId";
				return "<color=grey>tk2dSpriteAnimationFrame: </color><color=green>" + text9 + "</color>";
			});
			RegisterToString("HutongGames.PlayMaker.FsmState", delegate(object state)
			{
				string text8 = ((state?.GetType().GetProperty("Name"))?.GetValue(state, null) as string) ?? "UnnamedState";
				return "<color=grey>Fsm State: </color><color=green>" + text8 + "</color>";
			});
			RegisterToString("HutongGames.PlayMaker.FsmTransition", delegate(object tran)
			{
				Type type2 = tran?.GetType();
				object obj2 = (type2?.GetProperty("FsmEvent"))?.GetValue(tran, null);
				string text4 = null;
				if (obj2 != null)
				{
					text4 = obj2.GetType().GetProperty("Name")?.GetValue(obj2, null) as string;
				}
				string text5 = (type2?.GetProperty("EventName"))?.GetValue(tran, null) as string;
				object obj3 = (type2?.GetProperty("ToFsmState"))?.GetValue(tran, null);
				string text6 = null;
				if (obj3 != null)
				{
					text6 = obj3.GetType().GetProperty("Name")?.GetValue(obj3, null) as string;
				}
				string text7 = (type2?.GetProperty("ToState"))?.GetValue(tran, null) as string;
				return "<color=grey>Fsm Transition: </color><color=green>" + (text4 ?? text5) + "</color><color=grey> -> </color><color=green>" + (text6 ?? text7) + "</color>";
			});
			RegisterToString("HutongGames.PlayMaker.FsmEvent", delegate(object ev)
			{
				string text3 = ((ev?.GetType().GetProperty("Name"))?.GetValue(ev, null) as string) ?? "UnnamedEvent";
				return "<color=grey>Fsm Event: </color><color=green>" + text3 + "</color>";
			});
			RegisterToString("HutongGames.PlayMaker.NamedVariable", delegate(object v)
			{
				Type type = v?.GetType();
				string text = (type?.GetProperty("VariableType"))?.GetValue(v, null)?.ToString() ?? "Unknown";
				string text2 = ((type?.GetProperty("Name"))?.GetValue(v, null) as string) ?? "Unnamed";
				object obj = (type?.GetProperty("Value"))?.GetValue(v, null);
				return "<color=grey>Fsm Variable(</color><color=green>" + text + "</color><color=grey>): </color><color=green>" + text2 + "</color> | " + ToStringUtility.ToStringWithType(obj, typeof(object), true);
			});
		}
	}
}
namespace System.Runtime.CompilerServices
{
	internal static class IsExternalInit
	{
	}
}
namespace CinematicUnityExplorer
{
	public static class Drawing
	{
		private static Texture2D aaLineTex;

		private static Texture2D lineTex;

		private static Material blitMaterial;

		private static Material blendMaterial;

		private static Rect lineRect;

		public static void DrawLine(Vector2 pointA, Vector2 pointB, Color color, float width, bool antiAlias)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			float num = pointB.x - pointA.x;
			float num2 = pointB.y - pointA.y;
			float num3 = Mathf.Sqrt(num * num + num2 * num2);
			if (!(num3 < 0.001f))
			{
				Texture2D val;
				Material val2;
				if (antiAlias)
				{
					width *= 3f;
					val = aaLineTex;
					val2 = blendMaterial;
				}
				else
				{
					val = lineTex;
					val2 = blitMaterial;
				}
				float num4 = width * num2 / num3;
				float num5 = width * num / num3;
				Matrix4x4 identity = Matrix4x4.identity;
				identity.m00 = num;
				identity.m01 = 0f - num4;
				identity.m03 = pointA.x + 0.5f * num4;
				identity.m10 = num2;
				identity.m11 = num5;
				identity.m13 = pointA.y - 0.5f * num5;
				GL.PushMatrix();
				GL.MultMatrix(identity);
				Graphics.DrawTexture(lineRect, (Texture)(object)val, lineRect, 0, 0, 0, 0, color, val2);
				if (antiAlias)
				{
					Graphics.DrawTexture(lineRect, (Texture)(object)val, lineRect, 0, 0, 0, 0, color, val2);
				}
				GL.PopMatrix();
			}
		}

		public static void DrawCircle(Vector2 center, int radius, Color color, float width, int segmentsPerQuarter)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			DrawCircle(center, radius, color, width, antiAlias: false, segmentsPerQuarter);
		}

		public static void DrawCircle(Vector2 center, int radius, Color color, float width, bool antiAlias, int segmentsPerQuarter)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_010c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0136: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			float num = (float)radius * 0.55191505f;
			Vector2 val = default(Vector2);
			((Vector2)(ref val))..ctor(center.x, center.y - (float)radius);
			Vector2 endTangent = default(Vector2);
			((Vector2)(ref endTangent))..ctor(center.x - num, center.y - (float)radius);
			Vector2 startTangent = default(Vector2);
			((Vector2)(ref startTangent))..ctor(center.x + num, center.y - (float)radius);
			Vector2 val2 = default(Vector2);
			((Vector2)(ref val2))..ctor(center.x + (float)radius, center.y);
			Vector2 endTangent2 = default(Vector2);
			((Vector2)(ref endTangent2))..ctor(center.x + (float)radius, center.y - num);
			Vector2 startTangent2 = default(Vector2);
			((Vector2)(ref startTangent2))..ctor(center.x + (float)radius, center.y + num);
			Vector2 val3 = default(Vector2);
			((Vector2)(ref val3))..ctor(center.x, center.y + (float)radius);
			Vector2 startTangent3 = default(Vector2);
			((Vector2)(ref startTangent3))..ctor(center.x - num, center.y + (float)radius);
			Vector2 endTangent3 = default(Vector2);
			((Vector2)(ref endTangent3))..ctor(center.x + num, center.y + (float)radius);
			Vector2 val4 = default(Vector2);
			((Vector2)(ref val4))..ctor(center.x - (float)radius, center.y);
			Vector2 startTangent4 = default(Vector2);
			((Vector2)(ref startTangent4))..ctor(center.x - (float)radius, center.y - num);
			Vector2 endTangent4 = default(Vector2);
			((Vector2)(ref endTangent4))..ctor(center.x - (float)radius, center.y + num);
			DrawBezierLine(val, startTangent, val2, endTangent2, color, width, antiAlias, segmentsPerQuarter);
			DrawBezierLine(val2, startTangent2, val3, endTangent3, color, width, antiAlias, segmentsPerQuarter);
			DrawBezierLine(val3, startTangent3, val4, endTangent4, color, width, antiAlias, segmentsPerQuarter);
			DrawBezierLine(val4, startTangent4, val, endTangent, color, width, antiAlias, segmentsPerQuarter);
		}

		public static void DrawBezierLine(Vector2 start, Vector2 startTangent, Vector2 end, Vector2 endTangent, Color color, float width, bool antiAlias, int segments)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			Vector2 pointA = CubeBezier(start, startTangent, end, endTangent, 0f);
			for (int i = 1; i < segments + 1; i++)
			{
				Vector2 val = CubeBezier(start, startTangent, end, endTangent, (float)i / (float)segments);
				DrawLine(pointA, val, color, width, antiAlias);
				pointA = val;
			}
		}

		private static Vector2 CubeBezier(Vector2 s, Vector2 st, Vector2 e, Vector2 et, float t)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			float num = 1f - t;
			return num * num * num * s + 3f * num * num * t * st + 3f * num * t * t * et + t * t * t * e;
		}

		static Drawing()
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			aaLineTex = null;
			lineTex = null;
			blitMaterial = null;
			blendMaterial = null;
			lineRect = new Rect(0f, 0f, 1f, 1f);
			Initialize();
		}

		private static void Initialize()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Expected O, but got Unknown
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Expected O, but got Unknown
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)lineTex == (Object)null)
			{
				lineTex = new Texture2D(1, 1, (TextureFormat)5, false);
				lineTex.SetPixel(0, 1, Color.white);
				lineTex.Apply();
			}
			if ((Object)(object)aaLineTex == (Object)null)
			{
				aaLineTex = new Texture2D(1, 3, (TextureFormat)5, false);
				aaLineTex.SetPixel(0, 0, new Color(1f, 1f, 1f, 0f));
				aaLineTex.SetPixel(0, 1, Color.white);
				aaLineTex.SetPixel(0, 2, new Color(1f, 1f, 1f, 0f));
				aaLineTex.Apply();
			}
			blitMaterial = (Material)typeof(GUI).GetMethod("get_blitMaterial", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, null);
			blendMaterial = (Material)typeof(GUI).GetMethod("get_blendMaterial", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, null);
		}
	}
	public abstract class SingleMonoBehaviour<T> : MonoBehaviour where T : SingleMonoBehaviour<T>
	{
		private static T _instance;

		public static T Instance
		{
			get
			{
				//IL_0044: Unknown result type (might be due to invalid IL or missing references)
				//IL_004a: Expected O, but got Unknown
				if ((Object)(object)_instance == (Object)null)
				{
					_instance = Object.FindObjectOfType<T>();
					if ((Object)(object)_instance == (Object)null)
					{
						GameObject val = new GameObject(typeof(T).Name);
						_instance = val.AddComponent<T>();
					}
				}
				return _instance;
			}
		}

		protected virtual void Awake()
		{
			if ((Object)(object)_instance != (Object)null && (Object)(object)_instance != (Object)(object)this)
			{
				Debug.LogWarning((object)("Another instance of " + typeof(T).Name + " already exists. Destroying this one."));
				Object.Destroy((Object)(object)((Component)this).gameObject);
			}
			else
			{
				_instance = (T)this;
				Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			}
		}

		protected virtual void OnDestroy()
		{
			if ((Object)(object)_instance == (Object)(object)this)
			{
				_instance = null;
			}
		}
	}
}
namespace CinematicUnityExplorer.Patches
{
	[HarmonyPatch]
	public static class CinematicUnityExplorerPatches
	{
		private static Type _playMakerFSMType;

		private static Type GetPlayMakerFSMType()
		{
			if ((object)_playMakerFSMType == null)
			{
				_playMakerFSMType = ReflectionUtility.GetTypeByName("PlayMakerFSM");
				if ((object)_playMakerFSMType != null)
				{
				}
			}
			return _playMakerFSMType;
		}

		[HarmonyPrefix]
		[HarmonyPatch(typeof(ToStringUtility), "ToStringWithType")]
		public static bool ToStringWithType_Prefix(object value, Type fallbackType, bool includeNamespace, ref string __result)
		{
			string text = ParseManager.TryGetCustomToString(value);
			if (text != null)
			{
				__result = text;
				return false;
			}
			return true;
		}

		[HarmonyPatch(typeof(CacheObjectBase), "SetDataToCell")]
		[HarmonyPostfix]
		public static void CacheObjectBase_SetDataToCell_Postfix(CacheObjectBase __instance, CacheObjectCell cell)
		{
			if (__instance.Value == null || !ParseManager.IsTypeRegisteredForToString(__instance.Value.GetType()))
			{
				return;
			}
			MethodInfo methodInfo = AccessTools.Method(typeof(CacheObjectBase), "SetValueState", (Type[])null, (Type[])null);
			if ((object)methodInfo != null)
			{
				Type type = AccessTools.Inner(typeof(CacheObjectBase), "ValueState");
				if ((object)type != null)
				{
					object obj = Activator.CreateInstance(type, true, __instance.CanWrite, __instance.CanWrite, true);
					methodInfo.Invoke(__instance, new object[2] { cell, obj });
				}
			}
		}

		[HarmonyPatch(typeof(ComponentList), "SetComponentCell")]
		[HarmonyPostfix]
		public static void ComponentList_SetComponentCell_Postfix(ComponentList __instance, ComponentCell cell, int index)
		{
			GameObjectInspector parent = __instance.Parent;
			if (parent == null)
			{
				return;
			}
			GameObject target = parent.Target;
			if (!((Object)(object)target != (Object)null))
			{
				return;
			}
			Component[] components = target.GetComponents<Component>();
			if (index < 0 || index >= components.Length)
			{
				return;
			}
			Component val = components[index];
			Type playMakerFSMType = GetPlayMakerFSMType();
			if ((object)playMakerFSMType == null || !playMakerFSMType.IsInstanceOfType(val))
			{
				return;
			}
			try
			{
				PropertyInfo property = playMakerFSMType.GetProperty("FsmName", BindingFlags.Instance | BindingFlags.Public);
				if ((object)property != null)
				{
					object value = property.GetValue(val, null);
					string text = value as string;
					if (!string.IsNullOrEmpty(text))
					{
						((ButtonCell)cell).Button.ButtonText.text = ((ButtonCell)cell).Button.ButtonText.text + "<color=grey>(</color><color=#7FFF00>" + text + "</color><color=grey>)</color>";
					}
				}
			}
			catch (Exception)
			{
			}
		}
	}
}
namespace CinematicUnityExplorer.Inspectors
{
	public struct TriangleVertices
	{
		public Vector3 VertexA;

		public Vector3 VertexB;

		public Vector3 VertexC;

		public TriangleVertices(Vector3 a, Vector3 b, Vector3 c)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			VertexA = a;
			VertexB = b;
			VertexC = c;
		}

		public void Deconstruct(out Vector3 a, out Vector3 b, out Vector3 c)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			a = VertexA;
			b = VertexB;
			c = VertexC;
		}
	}
	public static class TransformExtensions
	{
		public static float GetScaleX(this Transform transform)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return transform.localScale.x;
		}

		public static float GetScaleY(this Transform transform)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return transform.localScale.y;
		}

		public static string GetTransformPath(this Transform transform, bool includeSelf = true)
		{
			string text = (includeSelf ? ((Object)transform).name : "");
			Transform parent = transform.parent;
			while ((Object)(object)parent != (Object)null)
			{
				text = ((Object)parent).name + "/" + text;
				parent = parent.parent;
			}
			return text;
		}
	}
	public static class VectorExtensions
	{
		public static Vector3 MultiplyElements(this Vector3 a, Vector3 b)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			return new Vector3(a.x * b.x, a.y * b.y, a.z * b.z);
		}

		public static Vector2 MultiplyElements(this Vector2 a, Vector2 b)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			return new Vector2(a.x * b.x, a.y * b.y);
		}
	}
}
namespace CinematicUnityExplorer.LineDrawing
{
	public class LineData
	{
		public Vector2 Start { get; }

		public Vector2 End { get; }

		public Color Color { get; }

		public int Depth { get; }

		public float Width { get; }

		public LineData(Vector2 start, Vector2 end, Color color, int depth, float width = 0.7f)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			Start = start;
			End = end;
			Color = color;
			Depth = depth;
			Width = width;
		}
	}
	internal interface ILineProvider
	{
		List<LineData> Lines { get; }
	}
	internal class LineRenderer2 : SingleMonoBehaviour<LineRenderer2>
	{
		public List<ILineProvider> providers = new List<ILineProvider>();

		private void OnGUI()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Invalid comparison between Unknown and I4
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			Event current = Event.current;
			if (current == null || (int)current.type != 7)
			{
				return;
			}
			foreach (ILineProvider provider in providers)
			{
				foreach (LineData line in provider.Lines)
				{
					int depth = GUI.depth;
					GUI.depth = line.Depth;
					Drawing.DrawLine(line.Start, line.End, line.Color, line.Width, antiAlias: false);
					GUI.depth = depth;
				}
			}
		}
	}
	public struct Triangle
	{
		public Vector3 A;

		public Vector3 B;

		public Vector3 C;

		public Triangle(Vector3 a, Vector3 b, Vector3 c)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			A = a;
			B = b;
			C = c;
		}
	}
}
namespace CinematicUnityExplorer.Cinematic
{
	internal static class NativeMethods
	{
		[DllImport("kernel32.dll")]
		public static extern IntPtr LoadLibrary(string dll);

		[DllImport("kernel32.dll")]
		public static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
	}
	public class UnityIGCSConnector
	{
		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
		private delegate void MoveCameraCallback(float step_left, float step_up, float fov, int from_start);

		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
		private delegate void SessionCallback();

		[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
		private delegate IntPtr U_IGCS_Initialize(MoveCameraCallback callback, SessionCallback start_cb, SessionCallback end_cb);

		private Mono.CSharp.Tuple<Vector3, Quaternion> position = null;

		private Mono.CSharp.Tuple<Vector3, Quaternion> endSessionPosition = null;

		private readonly bool isValid = false;

		private bool _isActive = false;

		private readonly List<System.Delegate> delegates = new List<System.Delegate>();

		private readonly Queue<Mono.CSharp.Tuple<float, float>> commands = new Queue<Mono.CSharp.Tuple<float, float>>();

		private IntPtr CameraStatus = IntPtr.Zero;

		public bool IsActive => isValid && _isActive;

		public void UpdateFreecamStatus(bool enabled)
		{
			if (!(CameraStatus == IntPtr.Zero))
			{
				Marshal.WriteByte(CameraStatus, (byte)(enabled ? 1 : 0));
			}
		}

		public void ExecuteCameraCommand(Camera cam)
		{
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			Transform transform = ((Component)cam).transform;
			ShouldMoveToOriginalPosition(transform);
			if (!_isActive || position == null)
			{
				position = new Mono.CSharp.Tuple<Vector3, Quaternion>(transform.position, transform.rotation);
			}
			if (!_isActive || position == null)
			{
				return;
			}
			Mono.CSharp.Tuple<float, float> tuple = null;
			lock (commands)
			{
				if (commands.Count <= 0)
				{
					return;
				}
				tuple = commands.Dequeue();
			}
			transform.position = position.Item1;
			transform.rotation = position.Item2;
			transform.Translate(tuple.Item1, tuple.Item2, 0f);
		}

		private void MoveCamera(float stepLeft, float stepUp, float fov, int fromStart)
		{
			lock (commands)
			{
				commands.Enqueue(new Mono.CSharp.Tuple<float, float>(stepLeft, stepUp));
			}
		}

		private void StartSession()
		{
			_isActive = true;
		}

		public void ShouldMoveToOriginalPosition(Transform transform)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			if (isValid && endSessionPosition != null)
			{
				transform.position = endSessionPosition.Item1;
				transform.rotation = endSessionPosition.Item2;
				endSessionPosition = null;
			}
		}

		private void EndSession()
		{
			endSessionPosition = position;
			position = null;
			_isActive = false;
			lock (commands)
			{
				commands.Clear();
			}
		}

		public UnityIGCSConnector()
		{
			string text = ((IntPtr.Size == 8) ? "UnityIGCSConnector.dll" : "UnityIGCSConnector.32.dll");
			IntPtr intPtr = NativeMethods.LoadLibrary(text);
			if (intPtr == IntPtr.Zero)
			{
				ExplorerCore.LogWarning(text + " was not found so IGCSDof will not be available");
				return;
			}
			IntPtr procAddress = NativeMethods.GetProcAddress(intPtr, "U_IGCS_Initialize");
			if (procAddress == IntPtr.Zero)
			{
				throw new EntryPointNotFoundException("Failed to find 'U_IGCS_Initialize' which means you can have a corrupt UnityIGCSConnector.dll.");
			}
			U_IGCS_Initialize u_IGCS_Initialize = (U_IGCS_Initialize)Marshal.GetDelegateForFunctionPointer(procAddress, typeof(U_IGCS_Initialize));
			delegates.Add(new MoveCameraCallback(MoveCamera));
			delegates.Add(new SessionCallback(StartSession));
			delegates.Add(new SessionCallback(EndSession));
			CameraStatus = u_IGCS_Initialize((MoveCameraCallback)delegates[0], (SessionCallback)delegates[1], (SessionCallback)delegates[2]);
			if (CameraStatus == IntPtr.Zero)
			{
				throw new Exception("IGCSDof returned an invalid pointer which means something went wrong");
			}
			isValid = true;
		}
	}
}
namespace UniverseLib.Input
{
	public static class IGamepadInputInterceptor
	{
		private static bool _isEnabled = false;

		private static int _targetGamepadIndex = 0;

		private static Type _gamepadType;

		private static Type _buttonControlType;

		private static Type _axisControlType;

		private static Type _vector2ControlType;

		private static Type _inputControlType;

		private static PropertyInfo _basePathProp;

		private static PropertyInfo _buttonIsPressedProp;

		private static PropertyInfo _buttonWasPressedProp;

		private static PropertyInfo _buttonWasReleasedProp;

		private static MethodInfo _axisReadValueMethod;

		private static MethodInfo _vector2ReadValueMethod;

		private static PropertyInfo _deviceProp;

		private static PropertyInfo _vector2XProp;

		private static PropertyInfo _vector2YProp;

		private static PropertyInfo _gamepadAllProp;

		private static PropertyInfo _gamepadCurrentProp;

		private static PropertyInfo _gamepadLeftStickProp;

		private static PropertyInfo _gamepadRightStickProp;

		private static readonly Dictionary<string, string> _vendorPrefixMap = new Dictionary<string, string>
		{
			{ "/xinputcontrollerwindows", "/gamepad" },
			{ "/xinputcontroller", "/gamepad" },
			{ "/dualshockgamepad", "/gamepad" },
			{ "/dualsensegamepad", "/gamepad" },
			{ "/dualshock4gamepadhid", "/gamepad" },
			{ "/dualshock3gamepadhid", "/gamepad" },
			{ "/androidgamepad", "/gamepad" },
			{ "/switchprocontrollerhid", "/gamepad" }
		};

		private static readonly Dictionary<string, object> _axisControls = new Dictionary<string, object>();

		private static readonly Dictionary<string, object> _vector2Controls = new Dictionary<string, object>();

		private static readonly Dictionary<string, float> _axisValues = new Dictionary<string, float>();

		private static readonly Dictionary<string, Vector2> _vector2Values = new Dictionary<string, Vector2>();

		public static void Init()
		{
			try
			{
				LoadReflectedTypes();
				if ((object)_gamepadType != null && (object)_axisControlType != null)
				{
					PatchAnalogControls();
					DiscoverGamepadControls();
					_isEnabled = true;
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Init failed: " + ex.Message + "\n" + ex.StackTrace);
			}
		}

		public static void Enable()
		{
			_isEnabled = true;
		}

		public static void Disable()
		{
			_isEnabled = false;
		}

		public static void SetTargetGamepad(int index)
		{
			_targetGamepadIndex = index;
			ClearControlCaches();
			DiscoverGamepadControls();
		}

		private static void LoadReflectedTypes()
		{
			_gamepadType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Gamepad, Unity.InputSystem");
			_buttonControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl, Unity.InputSystem");
			_axisControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.AxisControl, Unity.InputSystem");
			_vector2ControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.Vector2Control, Unity.InputSystem");
			_inputControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.InputControl, Unity.InputSystem");
			_basePathProp = _inputControlType?.GetProperty("path", BindingFlags.Instance | BindingFlags.Public);
			_buttonIsPressedProp = _buttonControlType?.GetProperty("isPressed", BindingFlags.Instance | BindingFlags.Public);
			_buttonWasPressedProp = _buttonControlType?.GetProperty("wasPressedThisFrame", BindingFlags.Instance | BindingFlags.Public);
			_buttonWasReleasedProp = _buttonControlType?.GetProperty("wasReleasedThisFrame", BindingFlags.Instance | BindingFlags.Public);
			_axisReadValueMethod = _axisControlType?.GetMethod("ReadValue", Type.EmptyTypes);
			_vector2ReadValueMethod = _vector2ControlType?.GetMethod("ReadValue", Type.EmptyTypes);
			_deviceProp = _inputControlType?.GetProperty("device", BindingFlags.Instance | BindingFlags.Public);
			_vector2XProp = _vector2ControlType?.GetProperty("x", BindingFlags.Instance | BindingFlags.Public);
			_vector2YProp = _vector2ControlType?.GetProperty("y", BindingFlags.Instance | BindingFlags.Public);
			_gamepadAllProp = _gamepadType?.GetProperty("all", BindingFlags.Static | BindingFlags.Public);
			_gamepadCurrentProp = _gamepadType?.GetProperty("current", BindingFlags.Static | BindingFlags.Public);
			_gamepadLeftStickProp = _gamepadType?.GetProperty("leftStick", BindingFlags.Instance | BindingFlags.Public);
			_gamepadRightStickProp = _gamepadType?.GetProperty("rightStick", BindingFlags.Instance | BindingFlags.Public);
		}

		private static void LogLoadedType(string name, Type type)
		{
			if ((object)type != null)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Loaded type: " + name);
			}
			else
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to load type: " + name);
			}
		}

		private static void PatchAnalogControls()
		{
			try
			{
				if ((object)_vector2ControlType != null)
				{
					MethodInfo method = _vector2ControlType.GetMethod("ReadValue", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
					if ((object)method == null)
					{
						Type baseType = _vector2ControlType.BaseType;
						if ((object)baseType != null && baseType.IsGenericType)
						{
							method = baseType.GetMethod("ReadValue", BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
						}
					}
					if ((object)method != null)
					{
						PatchMethod(method, null, "Postfix_Vector2ReadValue");
					}
				}
				if ((object)_axisControlType == null)
				{
					return;
				}
				MethodInfo method2 = _axisControlType.GetMethod("ReadValue", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
				if ((object)method2 == null)
				{
					Type baseType2 = _axisControlType.BaseType;
					if ((object)baseType2 != null && baseType2.IsGenericType)
					{
						method2 = baseType2.GetMethod("ReadValue", BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
					}
				}
				if ((object)method2 != null)
				{
					PatchMethod(method2, null, "Postfix_AxisReadValue");
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error during patching: " + ex.Message);
			}
		}

		private static void PatchMethod(MethodInfo method, string prefixName, string postfixName)
		{
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if ((object)method != null)
				{
					MethodInfo methodInfo = ((prefixName != null) ? AccessTools.Method(typeof(IGamepadInputInterceptor), prefixName, (Type[])null, (Type[])null) : null);
					MethodInfo methodInfo2 = ((postfixName != null) ? AccessTools.Method(typeof(IGamepadInputInterceptor), postfixName, (Type[])null, (Type[])null) : null);
					object obj = ExplorerCore.Harmony;
					obj = method;
					obj = (object)(((object)methodInfo == null) ? ((HarmonyMethod)null) : new HarmonyMethod(methodInfo));
					obj = (object)(((object)methodInfo2 == null) ? ((HarmonyMethod)null) : new HarmonyMethod(methodInfo2));
					((Harmony)obj).Patch((MethodBase)obj, (HarmonyMethod)obj, (HarmonyMethod)obj, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to patch method: " + ex.Message);
			}
		}

		private static void DiscoverGamepadControls()
		{
			try
			{
				object gamepadInstance = GetGamepadInstance(_targetGamepadIndex);
				if (gamepadInstance == null)
				{
					return;
				}
				string[] array = new string[12]
				{
					"buttonSouth", "buttonNorth", "buttonWest", "buttonEast", "leftStickButton", "rightStickButton", "leftShoulder", "rightShoulder", "startButton", "selectButton",
					"leftTrigger", "rightTrigger"
				};
				string[] array2 = new string[2] { "leftStick", "rightStick" };
				string[] array3 = array;
				foreach (string text in array3)
				{
					try
					{
						PropertyInfo property = _gamepadType.GetProperty(text, BindingFlags.Instance | BindingFlags.Public);
						if ((object)property == null)
						{
							continue;
						}
						object value = property.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value != null)
						{
							string text2 = ExtractAndNormalizePath(value);
							if (!string.IsNullOrEmpty(text2))
							{
								INewInputSystem.gamepadButtonControls[text2] = value;
							}
						}
					}
					catch (Exception ex)
					{
						ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access button " + text + ": " + ex.Message);
					}
				}
				try
				{
					PropertyInfo property2 = _gamepadType.GetProperty("dpad", BindingFlags.Instance | BindingFlags.Public);
					if ((object)property2 != null)
					{
						object value2 = property2.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value2 != null)
						{
							string[] array4 = new string[4] { "up", "down", "left", "right" };
							string[] array5 = array4;
							foreach (string text3 in array5)
							{
								try
								{
									PropertyInfo property3 = value2.GetType().GetProperty(text3, BindingFlags.Instance | BindingFlags.Public);
									if ((object)property3 == null)
									{
										continue;
									}
									object value3 = property3.GetValue(value2, BindingFlags.Default, null, null, null);
									if (value3 != null)
									{
										string text4 = ExtractAndNormalizePath(value3);
										if (!string.IsNullOrEmpty(text4))
										{
											INewInputSystem.gamepadButtonControls[text4] = value3;
										}
									}
								}
								catch (Exception ex2)
								{
									ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access dpad." + text3 + ": " + ex2.Message);
								}
							}
						}
					}
				}
				catch (Exception ex3)
				{
					ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access dpad: " + ex3.Message);
				}
				string[] array6 = array2;
				foreach (string text5 in array6)
				{
					try
					{
						PropertyInfo property4 = _gamepadType.GetProperty(text5, BindingFlags.Instance | BindingFlags.Public);
						if ((object)property4 == null)
						{
							continue;
						}
						object value4 = property4.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value4 == null)
						{
							continue;
						}
						string text6 = ExtractAndNormalizePath(value4);
						if (!string.IsNullOrEmpty(text6))
						{
							_vector2Controls[text6] = value4;
						}
						string[] array7 = new string[2] { "x", "y" };
						string[] array8 = array7;
						foreach (string text7 in array8)
						{
							try
							{
								PropertyInfo property5 = value4.GetType().GetProperty(text7, BindingFlags.Instance | BindingFlags.Public);
								if ((object)property5 == null)
								{
									continue;
								}
								object value5 = property5.GetValue(value4, BindingFlags.Default, null, null, null);
								if (value5 != null)
								{
									string value6 = ExtractAndNormalizePath(value5);
									if (!string.IsNullOrEmpty(value6))
									{
										string text8 = text5.ToLowerInvariant();
										string key = "/gamepad/" + text8 + "/" + text7;
										_axisControls[key] = value5;
									}
								}
							}
							catch (Exception ex4)
							{
								ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access " + text5 + "." + text7 + ": " + ex4.Message);
							}
						}
					}
					catch (Exception ex5)
					{
						ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access vector2 " + text5 + ": " + ex5.Message);
					}
				}
				string[] array9 = new string[2] { "leftTrigger", "rightTrigger" };
				string[] array10 = array9;
				foreach (string text9 in array10)
				{
					try
					{
						PropertyInfo property6 = _gamepadType.GetProperty(text9, BindingFlags.Instance | BindingFlags.Public);
						if ((object)property6 == null)
						{
							continue;
						}
						object value7 = property6.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value7 != null)
						{
							string text10 = ExtractAndNormalizePath(value7);
							if (!string.IsNullOrEmpty(text10))
							{
								_axisControls[text10] = value7;
							}
						}
					}
					catch (Exception ex6)
					{
						ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access " + text9 + ": " + ex6.Message);
					}
				}
				int num = INewInputSystem.gamepadButtonControls.Count + _axisControls.Count + _vector2Controls.Count;
			}
			catch (Exception ex7)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error discovering controls: " + ex7.Message + "\n" + ex7.StackTrace);
			}
		}

		private static object GetGamepadInstance(int index)
		{
			try
			{
				if ((object)_gamepadAllProp != null)
				{
					object value = _gamepadAllProp.GetValue(null, BindingFlags.Default, null, null, null);
					if (value != null)
					{
						Type type = value.GetType();
						PropertyInfo property = type.GetProperty("Count", BindingFlags.Instance | BindingFlags.Public);
						PropertyInfo property2 = type.GetProperty("Item", BindingFlags.Instance | BindingFlags.Public);
						if ((object)property != null && (object)property2 != null)
						{
							int num = (int)property.GetValue(value, BindingFlags.Default, null, null, null);
							if (index >= 0 && index < num)
							{
								return property2.GetValue(value, new object[1] { index });
							}
						}
					}
				}
				if ((object)_gamepadCurrentProp != null)
				{
					return _gamepadCurrentProp.GetValue(null, BindingFlags.Default, null, null, null);
				}
				return null;
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error getting gamepad instance: " + ex.Message);
				return null;
			}
		}

		private static string ExtractAndNormalizePath(object control)
		{
			if (control == null)
			{
				return null;
			}
			string text = null;
			try
			{
				string text2 = control.ToString();
				if (!string.IsNullOrEmpty(text2))
				{
					int num = text2.IndexOf('/');
					if (num >= 0)
					{
						int num2 = text2.IndexOf('}', num);
						if (num2 >= 0)
						{
							text = text2.Substring(num, num2 - num);
						}
					}
				}
			}
			catch
			{
			}
			if (string.IsNullOrEmpty(text))
			{
				try
				{
					PropertyInfo property = control.GetType().GetProperty("name", BindingFlags.Instance | BindingFlags.Public);
					if ((object)property != null)
					{
						string text3 = property.GetValue(control, BindingFlags.Default, null, null, null) as string;
						if (!string.IsNullOrEmpty(text3))
						{
							text = "/gamepad/" + text3;
						}
					}
				}
				catch
				{
				}
			}
			if (string.IsNullOrEmpty(text))
			{
				return null;
			}
			return NormalizeControlPath(text);
		}

		public static string NormalizeControlPath(string rawPath)
		{
			if (string.IsNullOrEmpty(rawPath))
			{
				return rawPath;
			}
			string text = rawPath.ToLowerInvariant().Trim();
			foreach (KeyValuePair<string, string> item in _vendorPrefixMap)
			{
				if (text.StartsWith(item.Key))
				{
					text = item.Value + text.Substring(item.Key.Length);
					break;
				}
			}
			int length = "/gamepad".Length;
			if (text.StartsWith("/gamepad") && text.Length > length && char.IsDigit(text[length]))
			{
				text = "/gamepad" + text.Substring(length + 1);
			}
			switch (text)
			{
			default:
				if (!(text == "/gamepad/right"))
				{
					break;
				}
				goto case "/gamepad/up";
			case "/gamepad/up":
			case "/gamepad/down":
			case "/gamepad/left":
			{
				string text2 = text.Substring("/gamepad/".Length);
				text = "/gamepad/dpad/" + text2;
				break;
			}
			}
			return text;
		}

		private static void ClearControlCaches()
		{
			INewInputSystem.gamepadButtonControls.Clear();
			_axisControls.Clear();
			_vector2Controls.Clear();
			_axisValues.Clear();
			_vector2Values.Clear();
		}

		public static bool IsButtonPressed(string buttonPath)
		{
			if (!_isEnabled)
			{
				return false;
			}
			string key = buttonPath.ToLower();
			if (INewInputSystem.gamepadButtonControls.TryGetValue(key, out var value) && (object)_buttonIsPressedProp != null)
			{
				_buttonIsPressedProp.GetValue(value, BindingFlags.Default, null, null, null);
			}
			bool value2;
			return INewInputSystem.buttonPressedStates.TryGetValue(key, out value2) && value2;
		}

		public static bool WasButtonPressedThisFrame(string buttonPath)
		{
			if (!_isEnabled)
			{
				return false;
			}
			string key = buttonPath.ToLower();
			if (INewInputSystem.gamepadButtonControls.TryGetValue(key, out var value) && (object)_buttonWasPressedProp != null)
			{
				_buttonWasPressedProp.GetValue(value, BindingFlags.Default, null, null, null);
			}
			bool value2;
			return INewInputSystem.buttonWasPressedStates.TryGetValue(key, out value2) && value2;
		}

		public static bool WasButtonReleasedThisFrame(string buttonPath)
		{
			if (!_isEnabled)
			{
				return false;
			}
			string key = buttonPath.ToLower();
			if (INewInputSystem.gamepadButtonControls.TryGetValue(key, out var value) && (object)_buttonWasReleasedProp != null)
			{
				_buttonWasReleasedProp.GetValue(value, BindingFlags.Default, null, null, null);
			}
			bool value2;
			return INewInputSystem.buttonWasReleasedStates.TryGetValue(key, out value2) && value2;
		}

		public static float GetAxisValue(string axisPath)
		{
			if (!_isEnabled)
			{
				return 0f;
			}
			string key = NormalizeControlPath(axisPath ?? "");
			if (_axisControls.TryGetValue(key, out var value) && (object)_axisReadValueMethod != null)
			{
				_axisReadValueMethod.Invoke(value, null);
			}
			float value2;
			return _axisValues.TryGetValue(key, out value2) ? value2 : 0f;
		}

		public static Vector2 GetVector2Value(string vectorPath)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			if (!_isEnabled)
			{
				return new Vector2(0f, 0f);
			}
			string key = NormalizeControlPath(vectorPath ?? "");
			if (_vector2Controls.TryGetValue(key, out var value) && (object)_vector2ReadValueMethod != null)
			{
				_vector2ReadValueMethod.Invoke(value, null);
			}
			Vector2 value2;
			return (Vector2)(_vector2Values.TryGetValue(key, out value2) ? value2 : new Vector2(0f, 0f));
		}

		public static IEnumerable<string> GetRegisteredButtonPaths()
		{
			return INewInputSystem.gamepadButtonControls.Keys;
		}

		public static IEnumerable<string> GetRegisteredAxisPaths()
		{
			return _axisControls.Keys;
		}

		public static IEnumerable<string> GetRegisteredVector2Paths()
		{
			return _vector2Controls.Keys;
		}

		private static void Postfix_Vector2ReadValue(object __instance, ref object __result)
		{
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			if (__instance == null || __result == null)
			{
				return;
			}
			try
			{
				if ((object)_deviceProp != null)
				{
					object value = _deviceProp.GetValue(__instance, BindingFlags.Default, null, null, null);
					if (value == null)
					{
						return;
					}
				}
			}
			catch
			{
				return;
			}
			string text = ExtractAndNormalizePath(__instance);
			if (string.IsNullOrEmpty(text))
			{
				return;
			}
			try
			{
				if ((object)_vector2XProp != null && (object)_vector2YProp != null)
				{
					float num = (float)_vector2XProp.GetValue(__result, BindingFlags.Default, null, null, null);
					float num2 = (float)_vector2YProp.GetValue(__result, BindingFlags.Default, null, null, null);
					_vector2Values[text] = new Vector2(num, num2);
					if (_isEnabled && FreeCamPanel.ShouldOverrideInput() && _vector2XProp.CanWrite && _vector2YProp.CanWrite)
					{
						_vector2XProp.SetValue(__result, 0f, BindingFlags.Default, null, null, null);
						_vector2YProp.SetValue(__result, 0f, BindingFlags.Default, null, null, null);
					}
				}
			}
			catch
			{
			}
		}

		private static void Postfix_AxisReadValue(object __instance, ref float __result)
		{
			if (__instance == null)
			{
				return;
			}
			try
			{
				if ((object)_deviceProp != null)
				{
					object value = _deviceProp.GetValue(__instance, BindingFlags.Default, null, null, null);
					if (value == null)
					{
						return;
					}
				}
			}
			catch
			{
				return;
			}
			string text = ExtractAndNormalizePath(__instance);
			if (string.IsNullOrEmpty(text))
			{
				return;
			}
			string text2 = text;
			try
			{
				object gamepadInstance = GetGamepadInstance(_targetGamepadIndex);
				if (gamepadInstance != null)
				{
					if ((object)_gamepadLeftStickProp != null)
					{
						object value2 = _gamepadLeftStickProp.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value2 != null)
						{
							PropertyInfo property = value2.GetType().GetProperty("x", BindingFlags.Instance | BindingFlags.Public);
							PropertyInfo property2 = value2.GetType().GetProperty("y", BindingFlags.Instance | BindingFlags.Public);
							object obj2 = property?.GetValue(value2, BindingFlags.Default, null, null, null);
							object obj3 = property2?.GetValue(value2, BindingFlags.Default, null, null, null);
							if (__instance == obj2 || __instance == obj3)
							{
								text2 = text.Replace("/gamepad/x", "/gamepad/leftstick/x").Replace("/gamepad/y", "/gamepad/leftstick/y");
							}
						}
					}
					if (text2 == text && (object)_gamepadRightStickProp != null)
					{
						object value3 = _gamepadRightStickProp.GetValue(gamepadInstance, BindingFlags.Default, null, null, null);
						if (value3 != null)
						{
							PropertyInfo property3 = value3.GetType().GetProperty("x", BindingFlags.Instance | BindingFlags.Public);
							PropertyInfo property4 = value3.GetType().GetProperty("y", BindingFlags.Instance | BindingFlags.Public);
							object obj4 = property3?.GetValue(value3, BindingFlags.Default, null, null, null);
							object obj5 = property4?.GetValue(value3, BindingFlags.Default, null, null, null);
							if (__instance == obj4 || __instance == obj5)
							{
								text2 = text.Replace("/gamepad/x", "/gamepad/rightstick/x").Replace("/gamepad/y", "/gamepad/rightstick/y");
							}
						}
					}
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error identifying stick axis: " + ex.Message);
			}
			_axisValues[text2] = __result;
			if (_isEnabled && FreeCamPanel.ShouldOverrideInput())
			{
				__result = 0f;
			}
		}
	}
	public static class IInputManager
	{
		private static InputType currentInputType;

		public static Vector3 MousePosition => InputManager.MousePosition;

		public static void Setup()
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Expected I4, but got Unknown
			currentInputType = InputManager.CurrentType;
			InputType val = currentInputType;
			InputType val2 = val;
			switch ((int)val2)
			{
			case 1:
				ILegacyInput.Init();
				break;
			case 0:
				INewInputSystem.Init();
				break;
			case 2:
				break;
			}
		}

		public static bool GetKey(KeyCode key)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected I4, but got Unknown
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			InputType val = currentInputType;
			InputType val2 = val;
			return (int)val2 switch
			{
				1 => ILegacyInput.GetKey(key), 
				0 => INewInputSystem.GetKey(key), 
				_ => InputManager.GetKey(key), 
			};
		}

		public static bool GetKeyDown(KeyCode key)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected I4, but got Unknown
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			InputType val = currentInputType;
			InputType val2 = val;
			switch ((int)val2)
			{
			case 1:
				return ILegacyInput.GetKeyDown(key);
			case 0:
			{
				string buttonName = ("/keyboard/" + ((object)(KeyCode)(ref key)).ToString()).ToLower();
				return INewInputSystem.GetButtonWasPressed(buttonName);
			}
			default:
				return InputManager.GetKeyDown(key);
			}
		}

		public static bool GetKeyUp(KeyCode key)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected I4, but got Unknown
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			InputType val = currentInputType;
			InputType val2 = val;
			switch ((int)val2)
			{
			case 1:
				return ILegacyInput.GetKeyUp(key);
			case 0:
			{
				string buttonName = ("/keyboard/" + ((object)(KeyCode)(ref key)).ToString()).ToLower();
				return INewInputSystem.GetButtonWasReleased(buttonName);
			}
			default:
				return InputManager.GetKeyUp(key);
			}
		}

		public static bool GetMouseButton(int button)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected I4, but got Unknown
			InputType val = currentInputType;
			InputType val2 = val;
			return (int)val2 switch
			{
				1 => ILegacyInput.GetMouseButton(button), 
				0 => INewInputSystem.GetMouseButton(button), 
				_ => InputManager.GetMouseButton(button), 
			};
		}

		public static bool GetMouseButtonDown(int button)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected I4, but got Unknown
			InputType val = currentInputType;
			InputType val2 = val;
			return (int)val2 switch
			{
				1 => ILegacyInput.GetMouseButtonDown(button), 
				0 => INewInputSystem.GetMouseButtonDown(button), 
				_ => InputManager.GetMouseButtonDown(button), 
			};
		}
	}
	public static class ILegacyInput
	{
		public static Dictionary<KeyCode, bool> getKeyDict = new Dictionary<KeyCode, bool>();

		public static Dictionary<KeyCode, bool> getKeyDownDict = new Dictionary<KeyCode, bool>();

		public static Dictionary<KeyCode, bool> getKeyUpDict = new Dictionary<KeyCode, bool>();

		public static Dictionary<int, bool> getMouseButton = new Dictionary<int, bool>();

		public static Dictionary<int, bool> getMouseButtonDown = new Dictionary<int, bool>();

		public static bool GetKey(KeyCode key)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			if ((int)key == 0)
			{
				return false;
			}
			InputManager.GetKey(key);
			return getKeyDict[key];
		}

		public static bool GetKeyDown(KeyCode key)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			if ((int)key == 0)
			{
				return false;
			}
			InputManager.GetKeyDown(key);
			return getKeyDownDict[key];
		}

		public static bool GetKeyUp(KeyCode key)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Invalid comparison between Unknown and I4
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			if ((int)key == 0)
			{
				return false;
			}
			InputManager.GetKeyUp(key);
			return getKeyUpDict[key];
		}

		public static bool GetMouseButton(int button)
		{
			InputManager.GetMouseButton(button);
			return getMouseButton[button];
		}

		public static bool GetMouseButtonDown(int button)
		{
			InputManager.GetMouseButtonDown(button);
			return getMouseButtonDown[button];
		}

		public static void Init()
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Expected O, but got Unknown
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Expected O, but got Unknown
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_0154: Expected O, but got Unknown
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Expected O, but got Unknown
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Expected O, but got Unknown
			//IL_0249: Unknown result type (might be due to invalid IL or missing references)
			//IL_0256: Expected O, but got Unknown
			//IL_029f: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ac: Expected O, but got Unknown
			Type typeByName = ReflectionUtility.GetTypeByName("UnityEngine.Input");
			try
			{
				MethodInfo method = typeByName.GetMethod("GetKey", new Type[1] { typeof(string) });
				ExplorerCore.Harmony.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyString", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method2 = typeByName.GetMethod("GetKey", new Type[1] { typeof(KeyCode) });
				ExplorerCore.Harmony.Patch((MethodBase)method2, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyKeyCode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method3 = typeByName.GetMethod("GetKeyDown", new Type[1] { typeof(string) });
				ExplorerCore.Harmony.Patch((MethodBase)method3, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyDownString", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method4 = typeByName.GetMethod("GetKeyDown", new Type[1] { typeof(KeyCode) });
				ExplorerCore.Harmony.Patch((MethodBase)method4, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyDownKeyCode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method5 = typeByName.GetMethod("GetKeyUp", new Type[1] { typeof(string) });
				ExplorerCore.Harmony.Patch((MethodBase)method5, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyUpString", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method6 = typeByName.GetMethod("GetKeyUp", new Type[1] { typeof(KeyCode) });
				ExplorerCore.Harmony.Patch((MethodBase)method6, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyUpKeyCode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method7 = typeByName.GetMethod("GetMouseButton", new Type[1] { typeof(int) });
				ExplorerCore.Harmony.Patch((MethodBase)method7, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideMouseButton", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
			try
			{
				MethodInfo method8 = typeByName.GetMethod("GetMouseButtonDown", new Type[1] { typeof(int) });
				ExplorerCore.Harmony.Patch((MethodBase)method8, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideMouseButtonDown", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
		}

		public static void OverrideKeyString(ref bool __result, ref string name)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			KeyCode key = (KeyCode)System.Enum.Parse(typeof(KeyCode), name);
			getKeyDict[key] = __result;
			if (FreeCamPanel.ShouldOverrideInput())
			{
				__result = false;
			}
		}

		public static void OverrideKeyKeyCode(ref bool __result, ref KeyCode key)
		{
			if (key)
			{
				getKeyDict[key] = __result;
				if (FreeCamPanel.ShouldOverrideInput())
				{
					__result = false;
				}
			}
		}

		public static void OverrideKeyDownString(ref bool __result, ref string name)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			KeyCode key = (KeyCode)System.Enum.Parse(typeof(KeyCode), name);
			getKeyDownDict[key] = __result;
			if (FreeCamPanel.ShouldOverrideInput())
			{
				__result = false;
			}
		}

		public static void OverrideKeyDownKeyCode(ref bool __result, ref KeyCode key)
		{
			if (key)
			{
				getKeyDownDict[key] = __result;
				if (FreeCamPanel.ShouldOverrideInput())
				{
					__result = false;
				}
			}
		}

		public static void OverrideKeyUpString(ref bool __result, ref string name)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			KeyCode key = (KeyCode)System.Enum.Parse(typeof(KeyCode), name);
			getKeyUpDict[key] = __result;
			if (FreeCamPanel.ShouldOverrideInput())
			{
				__result = false;
			}
		}

		public static void OverrideKeyUpKeyCode(ref bool __result, ref KeyCode key)
		{
			if (key)
			{
				getKeyUpDict[key] = __result;
				if (FreeCamPanel.ShouldOverrideInput())
				{
					__result = false;
				}
			}
		}

		public static void OverrideMouseButton(ref bool __result, ref int button)
		{
			getMouseButton[button] = __result;
			if (FreeCamPanel.ShouldOverrideInput() && (button != 0 || !UIManager.ShowMenu))
			{
				__result = false;
			}
		}

		public static void OverrideMouseButtonDown(ref bool __result, ref int button)
		{
			getMouseButtonDown[button] = __result;
			if (FreeCamPanel.ShouldOverrideInput() && (button != 0 || !UIManager.ShowMenu))
			{
				__result = false;
			}
		}
	}
	public static class INewInputSystem
	{
		private static PropertyInfo isPressedProp;

		private static PropertyInfo wasPressedProp;

		private static PropertyInfo wasReleasedProp;

		private static MethodInfo isValueConsideredPressed;

		private static MethodInfo isPressedMethod;

		private static MethodInfo isInProgressMethod;

		private static MethodInfo wasPressedMethod;

		private static MethodInfo wasPerformedMethod;

		internal static readonly Dictionary<string, object> buttonControls = new Dictionary<string, object>();

		internal static readonly Dictionary<string, object> gamepadButtonControls = new Dictionary<string, object>();

		internal static readonly Dictionary<string, bool> buttonPressedStates = new Dictionary<string, bool>();

		internal static readonly Dictionary<string, bool> buttonWasPressedStates = new Dictionary<string, bool>();

		internal static readonly Dictionary<string, bool> buttonWasReleasedStates = new Dictionary<string, bool>();

		private static readonly Dictionary<string, bool> buttonIsValueConsideredPressedStates = new Dictionary<string, bool>();

		private static readonly Dictionary<string, bool> actionInProgressStates = new Dictionary<string, bool>();

		private static readonly Dictionary<string, bool> actionWasPerformedStates = new Dictionary<string, bool>();

		public static void Init()
		{
			Type typeByName = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl, Unity.InputSystem");
			Type typeByName2 = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.InputAction, Unity.InputSystem");
			if ((object)typeByName == null || (object)typeByName2 == null)
			{
				ExplorerCore.LogWarning("Unity.InputSystem types not found; InputSystem integration disabled.");
				return;
			}
			PatchButtonControl(typeByName);
			PatchInputAction(typeByName2);
			GetButtonControls();
			IGamepadInputInterceptor.Init();
		}

		private static void PatchButtonControl(Type buttonControlType)
		{
			isPressedProp = buttonControlType.GetProperty("isPressed");
			wasPressedProp = buttonControlType.GetProperty("wasPressedThisFrame");
			wasReleasedProp = buttonControlType.GetProperty("wasReleasedThisFrame");
			isValueConsideredPressed = buttonControlType.GetMethod("IsValueConsideredPressed");
			PatchPropertyGetter(isPressedProp, "Postfix_IsPressed");
			PatchPropertyGetter(wasPressedProp, "Postfix_WasPressedThisFrame");
			PatchPropertyGetter(wasReleasedProp, "Postfix_WasReleasedThisFrame");
			PatchPropertyGetter(wasReleasedProp, "Postfix_IsValueConsideredPressed");
		}

		private static void PatchInputAction(Type inputActionType)
		{
			isPressedMethod = inputActionType.GetMethod("IsPressed");
			isInProgressMethod = inputActionType.GetMethod("IsInProgress");
			wasPressedMethod = inputActionType.GetMethod("WasPressedThisFrame");
			wasPerformedMethod = inputActionType.GetMethod("WasPerformedThisFrame");
			PatchMethod(isPressedMethod, "Postfix_IsPressed");
			PatchMethod(isInProgressMethod, "Postfix_IsInProgress");
			PatchMethod(wasPressedMethod, "Postfix_WasPressedThisFrame");
			PatchMethod(wasPerformedMethod, "Postfix_WasPerformedThisFrame");
		}

		private static void PatchPropertyGetter(PropertyInfo prop, string postfixName)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			if ((object)prop?.GetGetMethod() != null)
			{
				ExplorerCore.Harmony.Patch((MethodBase)prop.GetGetMethod(), (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(INewInputSystem), postfixName, (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
		}

		private static void PatchMethod(MethodInfo method, string postfixName)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			if ((object)method != null)
			{
				ExplorerCore.Harmony.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(INewInputSystem), postfixName, (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
		}

		public static void GetButtonControls()
		{
			PropertyInfo pathProp = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl, Unity.InputSystem")?.GetProperty("path", BindingFlags.Instance | BindingFlags.Public);
			RegisterDeviceControls("UnityEngine.InputSystem.Keyboard", "UnityEngine.InputSystem.Controls.KeyControl", pathProp);
			RegisterDeviceControls("UnityEngine.InputSystem.Mouse", "UnityEngine.InputSystem.Controls.ButtonControl", pathProp);
		}

		internal static void RegisterDeviceControls(string deviceTypeName, string controlTypeName, PropertyInfo pathProp)
		{
			Type typeByName = ReflectionUtility.GetTypeByName(deviceTypeName + ", Unity.InputSystem");
			if ((object)typeByName == null)
			{
				return;
			}
			object obj = typeByName.GetProperty("current", BindingFlags.Static | BindingFlags.Public)?.GetValue(null, null);
			if (obj == null)
			{
				return;
			}
			PropertyInfo[] properties = typeByName.GetProperties(BindingFlags.Instance | BindingFlags.Public);
			foreach (PropertyInfo propertyInfo in properties)
			{
				if (propertyInfo.GetIndexParameters().Length != 0 || !(propertyInfo.PropertyType.FullName == controlTypeName))
				{
					continue;
				}
				object value = propertyInfo.GetValue(obj, null);
				if (value != null)
				{
					string text = pathProp?.GetValue(value, null) as string;
					if (!string.IsNullOrEmpty(text))
					{
						buttonControls[text.ToLower()] = value;
					}
				}
			}
		}

		public static bool GetKey(KeyCode key)
		{
			string buttonName = PropToKeycode(("/keyboard/" + ((object)(KeyCode)(ref key)).ToString()).ToLower());
			return GetButtonPressed(buttonName);
		}

		public static bool GetButtonPressed(string buttonName)
		{
			string key = buttonName.ToLower();
			if (buttonControls.TryGetValue(key, out var value))
			{
				isPressedProp?.GetValue(value, null);
				bool value2;
				return buttonPressedStates.TryGetValue(key, out value2) && value2;
			}
			return false;
		}

		public static bool GetButtonWasPressed(string buttonName)
		{
			string key = buttonName.ToLower();
			if (buttonControls.TryGetValue(key, out var value))
			{
				wasPressedProp?.GetValue(value, null);
				bool value2;
				return buttonWasPressedStates.TryGetValue(key, out value2) && value2;
			}
			return false;
		}

		public static bool GetButtonWasReleased(string buttonName)
		{
			string key = buttonName.ToLower();
			if (buttonControls.TryGetValue(key, out var value))
			{
				wasReleasedProp?.GetValue(value, null);
				bool value2;
				return buttonWasReleasedStates.TryGetValue(key, out value2) && value2;
			}
			return false;
		}

		public static bool GetMouseButton(int button)
		{
			return GetButtonPressed(button switch
			{
				0 => "/mouse/leftbutton", 
				1 => "/mouse/rightbutton", 
				2 => "/mouse/middlebutton", 
				3 => "/mouse/forwardbutton", 
				4 => "/mouse/backbutton", 
				_ => $"/mouse/button{button}", 
			});
		}

		public static bool GetMouseButtonDown(int button)
		{
			return GetButtonWasPressed(button switch
			{
				0 => "/mouse/leftbutton", 
				1 => "/mouse/rightbutton", 
				2 => "/mouse/middlebutton", 
				3 => "/mouse/forwardbutton", 
				4 => "/mouse/backbutton", 
				_ => $"/mouse/button{button}", 
			});
		}

		private static void Postfix_IsPressed(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, buttonPressedStates);
		}

		private static void Postfix_WasPressedThisFrame(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, buttonWasPressedStates);
		}

		private static void Postfix_WasReleasedThisFrame(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, buttonWasReleasedStates);
		}

		private static void Postfix_IsValueConsideredPressed(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, buttonIsValueConsideredPressedStates);
		}

		private static void Postfix_IsInProgress(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, actionInProgressStates);
		}

		private static void Postfix_WasPerformedThisFrame(object __instance, ref bool __result)
		{
			StoreState(__instance, ref __result, actionWasPerformedStates);
		}

		private static void StoreState(object __instance, ref bool __result, Dictionary<string, bool> dict)
		{
			try
			{
				Type type = __instance.GetType();
				string rawPath = ((type.GetProperty("path") ?? type.GetProperty("name"))?.GetValue(__instance, null)?.ToString() ?? string.Empty).ToLower();
				rawPath = IGamepadInputInterceptor.NormalizeControlPath(rawPath);
				dict[rawPath] = __result;
				if (FreeCamPanel.ShouldOverrideInput())
				{
					__result = false;
				}
			}
			catch (Exception ex)
			{
				ExplorerCore.LogWarning("Failed to store state: " + ex.Message);
			}
		}

		public static string PropToKeycode(string propName)
		{
			return propName switch
			{
				"/keyboard/leftcontrol" => "/keyboard/leftctrl", 
				"/keyboard/rightcontrol" => "/keyboard/rightctrl", 
				"/keyboard/keypad0" => "/keyboard/numpad0", 
				"/keyboard/keypad1" => "/keyboard/numpad1", 
				"/keyboard/keypad2" => "/keyboard/numpad2", 
				"/keyboard/keypad3" => "/keyboard/numpad3", 
				"/keyboard/keypad4" => "/keyboard/numpad4", 
				"/keyboard/keypad5" => "/keyboard/numpad5", 
				"/keyboard/keypad6" => "/keyboard/numpad6", 
				"/keyboard/keypad7" => "/keyboard/numpad7", 
				"/keyboard/keypad8" => "/keyboard/numpad8", 
				"/keyboard/keypad9" => "/keyboard/numpad9", 
				"/keyboard/keypaddivide" => "/keyboard/numpaddivide", 
				"/keyboard/keypadmultiply" => "/keyboard/numpadmultiply", 
				"/keyboard/keypadminus" => "/keyboard/numpadminus", 
				"/keyboard/keypadplus" => "/keyboard/numpadplus", 
				"/keyboard/keypadperiod" => "/keyboard/numpadperiod", 
				"/keyboard/keypadequals" => "/keyboard/numpadequals", 
				"/keyboard/keypadenter" => "/keyboard/numpadenter", 
				"/keyboard/alpha0" => "/keyboard/0", 
				"/keyboard/alpha1" => "/keyboard/1", 
				"/keyboard/alpha2" => "/keyboard/2", 
				"/keyboard/alpha3" => "/keyboard/3", 
				"/keyboard/alpha4" => "/keyboard/4", 
				"/keyboard/alpha5" => "/keyboard/5", 
				"/keyboard/alpha6" => "/keyboard/6", 
				"/keyboard/alpha7" => "/keyboard/7", 
				"/keyboard/alpha8" => "/keyboard/8", 
				"/keyboard/alpha9" => "/keyboard/9", 
				"/keyboard/print" => "/keyboard/printscreen", 
				_ => propName, 
			};
		}
	}
}
namespace UnityExplorer
{
	public class ArrowGenerator
	{
		public static GameObject CreateArrow(Vector3 arrowPosition, Quaternion arrowRotation, Color color)
		{
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Expected O, but got Unknown
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Expected O, but got Unknown
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Expected O, but got Unknown
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_0180: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				float value = ConfigManager.Arrow_Size.Value;
				Vector3 localScale = default(Vector3);
				((Vector3)(ref localScale))..ctor(Math.Max(value, 0.1f), Math.Max(value, 0.1f), Math.Max(value, 0.1f));
				GameObject val = GameObject.CreatePrimitive((PrimitiveType)2);
				val.GetComponent<Collider>().enabled = false;
				val.GetComponent<MeshFilter>().mesh = CreateCylinderMesh(0.01f, 20, 2);
				val.transform.rotation = Quaternion.LookRotation(Vector3.down, Vector3.up);
				Renderer component = val.GetComponent<Renderer>();
				component.material = new Material(Shader.Find("Sprites/Default"));
				component.material.color = color;
				GameObject val2 = GameObject.CreatePrimitive((PrimitiveType)0);
				val2.GetComponent<Collider>().enabled = false;
				val2.GetComponent<MeshFilter>().mesh = CreateConeMesh(10, 0.05f, 0.1f);
				val2.transform.SetParent(val.transform, true);
				Renderer component2 = val2.GetComponent<Renderer>();
				component2.material = new Material(Shader.Find("Sprites/Default"));
				component2.material.color = color;
				val.transform.rotation = Quaternion.LookRotation(Vector3.back, Vector3.up);
				GameObject val3 = new GameObject("CUE-Arrow");
				val.transform.SetParent(val3.transform, true);
				val3.transform.localScale = localScale;
				val3.transform.position = arrowPosition;
				val3.transform.rotation = arrowRotation;
				Transform transform = val3.transform;
				transform.position += 0.5f * val3.transform.forward;
				return val3;
			}
			catch
			{
				return FallbackArrow(arrowPosition, arrowRotation, color);
			}
		}

		private static GameObject FallbackArrow(Vector3 arrowPosition, Quaternion arrowRotation, Color color)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Expected O, but got Unknown
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Expected O, but got Unknown
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fc: Expected O, but got Unknown
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0169: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = GameObject.CreatePrimitive((PrimitiveType)2);
			val.GetComponent<Collider>().enabled = false;
			Renderer component = val.GetComponent<Renderer>();
			component.material = new Material(Shader.Find("Sprites/Default"));
			component.material.color = color;
			val.transform.localScale = new Vector3(0.025f, 0.15f, 0.025f);
			GameObject val2 = GameObject.CreatePrimitive((PrimitiveType)0);
			val2.GetComponent<Collider>().enabled = false;
			val2.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f);
			val2.transform.position = new Vector3(0f, 0.15f, 0f);
			val2.transform.SetParent(val.transform, true);
			Renderer component2 = val2.GetComponent<Renderer>();
			component2.material = new Material(Shader.Find("Sprites/Default"));
			component2.material.color = color;
			GameObject val3 = new GameObject("CUE-Arrow");
			val.transform.SetParent(val3.transform, true);
			val3.transform.position = arrowPosition;
			Vector3 eulerAngles = ((Quaternion)(ref arrowRotation)).eulerAngles;
			eulerAngles.x += 90f;
			val3.transform.rotation = Quaternion.Euler(eulerAngles);
			Transform transform = val3.transform;
			transform.position += 0.15f * val3.transform.up;
			return val3;
		}

		public static void PatchLights()
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Expected O, but got Unknown
			try
			{
				PropertyInfo property = typeof(Light).GetProperty("color");
				MethodInfo setMethod = property.GetSetMethod();
				ExplorerCore.Harmony.Patch((MethodBase)setMethod, new HarmonyMethod(AccessTools.Method(typeof(ArrowGenerator), "ChangeArrowColor", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			catch
			{
			}
		}

		private static void ChangeArrowColor(Light __instance, Color __0)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if (((Object)__instance).name.Contains("CUE - Light"))
			{
				Renderer[] componentsInChildren = ((Component)__instance).GetComponentsInChildren<Renderer>();
				Renderer[] array = componentsInChildren;
				foreach (Renderer val in array)
				{
					val.material.color = __0;
				}
			}
		}

		private static Mesh CreateConeMesh(int subdivisions, float radius, float height)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			Mesh val = new Mesh();
			Vector3[] array = (Vector3[])(object)new Vector3[subdivisions + 2];
			Vector2[] array2 = (Vector2[])(object)new Vector2[array.Length];
			int[] array3 = new int[subdivisions * 2 * 3];
			array[0] = Vector3.zero;
			array2[0] = new Vector2(0.5f, 0f);
			int i = 0;
			int num = subdivisions - 1;
			for (; i < subdivisions; i++)
			{
				float num2 = (float)i / (float)num;
				float num3 = num2 * ((float)Math.PI * 2f);
				float num4 = Mathf.Cos(num3) * radius;
				float num5 = Mathf.Sin(num3) * radius;
				array[i + 1] = new Vector3(num4, 0f, num5);
				array2[i + 1] = new Vector2(num2, 0f);
			}
			array[subdivisions + 1] = new Vector3(0f, height, 0f);
			array2[subdivisions + 1] = new Vector2(0.5f, 1f);
			int j = 0;
			for (int num6 = subdivisions - 1; j < num6; j++)
			{
				int num7 = j * 3;
				array3[num7] = 0;
				array3[num7 + 1] = j + 1;
				array3[num7 + 2] = j + 2;
			}
			int num8 = subdivisions * 3;
			int k = 0;
			for (int num9 = subdivisions - 1; k < num9; k++)
			{
				int num10 = k * 3 + num8;
				array3[num10] = k + 1;
				array3[num10 + 1] = subdivisions + 1;
				array3[num10 + 2] = k + 2;
			}
			val.vertices = array;
			val.uv = array2;
			val.triangles = array3;
			val.RecalculateBounds();
			val.RecalculateNormals();
			return val;
		}

		private static Mesh CreateCylinderMesh(float radius = 1f, int iterations = 50, int lenggth = 10, float gap = 0.5f)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Expected O, but got Unknown
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			int num = 0;
			float num2 = 0f;
			int i = 0;
			Vector3[] array = (Vector3[])(object)new Vector3[iterations * lenggth + 2];
			int num3 = 0;
			array[^2] = Vector3.zero;
			for (; i < lenggth; i++)
			{
				int num4 = 0;
				while (num4 < iterations)
				{
					float num5 = (float)num4 * 1f / (float)iterations * (float)Math.PI * 2f;
					float num6 = Mathf.Sin(num5) * radius;
					float num7 = Mathf.Cos(num5) * radius;
					array[num3] = new Vector3(num6, num7, num2);
					num4++;
					num++;
					num3++;
				}
				num2 += gap;
			}
			array[^1] = new Vector3(0f, 0f, array[^3].z);
			Mesh val = new Mesh();
			val.vertices = array;
			int j = 0;
			Vector3[] array2 = (Vector3[])(object)new Vector3[num + 2];
			for (; j < num; j++)
			{
				array2[j] = Vector3.forward;
			}
			val.normals = array2;
			j = 0;
			int[] array3 = new int[3 * (lenggth - 1) * iterations * 2 + 3];
			for (; j < (lenggth - 1) * iterations; j++)
			{
				array3[j * 3] = j;
				if ((j + 1) % iterations == 0)
				{
					array3[j * 3 + 1] = 1 + j - iterations;
				}
				else
				{
					array3[j * 3 + 1] = 1 + j;
				}
				array3[j * 3 + 2] = iterations + j;
			}
			int num8 = -1;
			for (int k = (array3.Length - 3) / 2; k < array3.Length - 6; k += 3)
			{
				if ((num8 + 2) % iterations == 0)
				{
					array3[k] = num8 + iterations * 2 + 1;
				}
				else
				{
					array3[k] = num8 + iterations + 1;
				}
				array3[k + 1] = num8 + 2;
				array3[k + 2] = num8 + iterations + 2;
				num8++;
			}
			array3[^3] = 0;
			array3[^2] = iterations * 2 - 1;
			array3[^1] = iterations;
			int[] array4 = new int[iterations * 3 * 2];
			int num9 = 0;
			for (int l = 0; l < array4.Length / 2; l += 3)
			{
				array4[l] = num9;
				if (num9 + 1 != iterations)
				{
					array4[l + 1] = num9 + 1;
				}
				else
				{
					array4[l + 1] = 0;
				}
				array4[l + 2] = array.Length - 2;
				num9++;
			}
			num9 = iterations * (lenggth - 1);
			for (int m = array4.Length / 2; m < array4.Length; m += 3)
			{
				array4[m] = num9;
				if (num9 + 1 != iterations * (lenggth - 1))
				{
					array4[m + 1] = num9 + 1;
				}
				else
				{
					array4[m + 1] = iterations * (lenggth - 1);
				}
				array4[m + 2] = array.Length - 1;
				num9++;
			}
			array4[^3] = iterations * (lenggth - 1);
			array4[^2] = array.Length - 3;
			array4[^1] = array.Length - 1;
			int[] array5 = new int[array3.Length + array4.Length];
			int num10 = 0;
			int num11 = 0;
			num10 = 0;
			num11 = 0;
			for (; num10 < array3.Length; num10++)
			{
				array5[num11++] = array3[num10];
			}
			for (num10 = 0; num10 < array4.Length; num10++)
			{
				array5[num11++] = array4[num10];
			}
			val.triangles = array5;
			val.Optimize();
			val.RecalculateNormals();
			return val;
		}
	}
	public class ExplorerBehaviour : MonoBehaviour
	{
		internal bool quitting;

		internal static ExplorerBehaviour Instance { get; private set; }

		internal static void Setup()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			GameObject val = new GameObject("ExplorerBehaviour");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)61;
			Instance = val.AddComponent<ExplorerBehaviour>();
		}

		internal void Update()
		{
			ExplorerCore.Update();
		}

		internal void OnDestroy()
		{
			OnApplicationQuit();
		}

		internal void OnApplicationQuit()
		{
			if (!quitting)
			{
				quitting = true;
				if (Object.op_Implicit((Object)(object)UIManager.UIRoot))
				{
					TryDestroy(((Component)UIManager.UIRoot.transform.root).gameObject);
				}
				object? value = typeof(Universe).Assembly.GetType("UniverseLib.UniversalBehaviour").GetProperty("Instance", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null);
				TryDestroy(((Component)((value is Component) ? value : null)).gameObject);
				TryDestroy(((Component)this).gameObject);
			}
		}

		internal void TryDestroy(GameObject obj)
		{
			try
			{
				if (Object.op_Implicit((Object)(object)obj))
				{
					Object.Destroy((Object)(object)obj);
				}
			}
			catch
			{
			}
		}
	}
	public class KeypressListener : MonoBehaviour
	{
		private bool frameSkip;

		internal static KeypressListener Instance { get; private set; }

		internal static void Setup()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			GameObject val = new GameObject("KeypressListener");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)61;
			Instance = val.AddComponent<KeypressListener>();
		}

		public void Update()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid I

UniverseLib.Mono.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using HarmonyLib;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UniverseLib.Config;
using UniverseLib.Input;
using UniverseLib.Runtime;
using UniverseLib.Runtime.Mono;
using UniverseLib.UI;
using UniverseLib.UI.Models;
using UniverseLib.UI.ObjectPool;
using UniverseLib.UI.Panels;
using UniverseLib.UI.Widgets;
using UniverseLib.UI.Widgets.ScrollView;
using UniverseLib.Utility;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("UniverseLib")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Sinai, yukieiji")]
[assembly: AssemblyProduct("UniverseLib")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")]
[assembly: AssemblyFileVersion("1.5.5")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.5.5.0")]
[module: UnverifiableCode]
public static class MonoExtensions
{
	private static PropertyInfo p_childControlHeight = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlHeight");

	private static PropertyInfo p_childControlWidth = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlWidth");

	public static void AddListener(this UnityEvent _event, Action listener)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		_event.AddListener(new UnityAction(listener.Invoke));
	}

	public static void AddListener<T>(this UnityEvent<T> _event, Action<T> listener)
	{
		_event.AddListener((UnityAction<T>)listener.Invoke);
	}

	public static void RemoveListener(this UnityEvent _event, Action listener)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		_event.RemoveListener(new UnityAction(listener.Invoke));
	}

	public static void RemoveListener<T>(this UnityEvent<T> _event, Action<T> listener)
	{
		_event.RemoveListener((UnityAction<T>)listener.Invoke);
	}

	public static void Clear(this StringBuilder sb)
	{
		sb.Remove(0, sb.Length);
	}

	public static void SetChildControlHeight(this HorizontalOrVerticalLayoutGroup group, bool value)
	{
		p_childControlHeight?.SetValue(group, value, null);
	}

	public static void SetChildControlWidth(this HorizontalOrVerticalLayoutGroup group, bool value)
	{
		p_childControlWidth?.SetValue(group, value, null);
	}
}
namespace UniverseLib
{
	public static class ReflectionExtensions
	{
		public static Type GetActualType(this object obj)
		{
			return ReflectionUtility.Instance.Internal_GetActualType(obj);
		}

		public static object TryCast(this object obj)
		{
			return ReflectionUtility.Instance.Internal_TryCast(obj, ReflectionUtility.Instance.Internal_GetActualType(obj));
		}

		public static object TryCast(this object obj, Type castTo)
		{
			return ReflectionUtility.Instance.Internal_TryCast(obj, castTo);
		}

		public static T TryCast<T>(this object obj)
		{
			try
			{
				return (T)ReflectionUtility.Instance.Internal_TryCast(obj, typeof(T));
			}
			catch
			{
				return default(T);
			}
		}

		public static Type[] TryGetTypes(this Assembly asm)
		{
			try
			{
				return asm.GetTypes();
			}
			catch (ReflectionTypeLoadException e)
			{
				return ReflectionUtility.TryExtractTypesFromException(e);
			}
			catch
			{
				try
				{
					return asm.GetExportedTypes();
				}
				catch (ReflectionTypeLoadException e2)
				{
					return ReflectionUtility.TryExtractTypesFromException(e2);
				}
				catch
				{
					return ArgumentUtility.EmptyTypes;
				}
			}
		}

		public static bool ReferenceEqual(this object objA, object objB)
		{
			if (objA == objB)
			{
				return true;
			}
			Object val = (Object)((objA is Object) ? objA : null);
			if (val != null)
			{
				Object val2 = (Object)((objB is Object) ? objB : null);
				if (val2 != null && Object.op_Implicit(val) && Object.op_Implicit(val2) && val.m_CachedPtr == val2.m_CachedPtr)
				{
					return true;
				}
			}
			return false;
		}

		public static string ReflectionExToString(this Exception e, bool innerMost = true)
		{
			if (e == null)
			{
				return "The exception was null.";
			}
			if (innerMost)
			{
				e = e.GetInnerMostException();
			}
			return $"{e.GetType()}: {e.Message}";
		}

		public static Exception GetInnerMostException(this Exception e)
		{
			while (e != null && e.InnerException != null)
			{
				e = e.InnerException;
			}
			return e;
		}
	}
	public class ReflectionUtility
	{
		public static bool Initializing;

		public const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;

		public static readonly SortedDictionary<string, Type> AllTypes = new SortedDictionary<string, Type>(StringComparer.OrdinalIgnoreCase);

		public static readonly List<string> AllNamespaces = new List<string>();

		private static readonly HashSet<string> uniqueNamespaces = new HashSet<string>();

		private static string[] allTypeNamesArray;

		private static readonly Dictionary<string, Type> shorthandToType = new Dictionary<string, Type>
		{
			{
				"object",
				typeof(object)
			},
			{
				"string",
				typeof(string)
			},
			{
				"bool",
				typeof(bool)
			},
			{
				"byte",
				typeof(byte)
			},
			{
				"sbyte",
				typeof(sbyte)
			},
			{
				"char",
				typeof(char)
			},
			{
				"decimal",
				typeof(decimal)
			},
			{
				"double",
				typeof(double)
			},
			{
				"float",
				typeof(float)
			},
			{
				"int",
				typeof(int)
			},
			{
				"uint",
				typeof(uint)
			},
			{
				"long",
				typeof(long)
			},
			{
				"ulong",
				typeof(ulong)
			},
			{
				"short",
				typeof(short)
			},
			{
				"ushort",
				typeof(ushort)
			},
			{
				"void",
				typeof(void)
			}
		};

		internal static readonly Dictionary<string, Type[]> baseTypes = new Dictionary<string, Type[]>();

		internal static ReflectionUtility Instance { get; private set; }

		public static event Action<Type> OnTypeLoaded;

		internal static void Init()
		{
			Instance = new ReflectionUtility();
			Instance.Initialize();
		}

		protected virtual void Initialize()
		{
			SetupTypeCache();
			Initializing = false;
		}

		public static string[] GetTypeNameArray()
		{
			if (allTypeNamesArray == null || allTypeNamesArray.Length != AllTypes.Count)
			{
				allTypeNamesArray = new string[AllTypes.Count];
				int num = 0;
				foreach (string key in AllTypes.Keys)
				{
					allTypeNamesArray[num] = key;
					num++;
				}
			}
			return allTypeNamesArray;
		}

		private static void SetupTypeCache()
		{
			if (Universe.Context == RuntimeContext.Mono)
			{
				ForceLoadManagedAssemblies();
			}
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			foreach (Assembly asm in assemblies)
			{
				CacheTypes(asm);
			}
			AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoaded;
		}

		private static void AssemblyLoaded(object sender, AssemblyLoadEventArgs args)
		{
			if ((object)args.LoadedAssembly != null && !(args.LoadedAssembly.GetName().Name == "completions"))
			{
				CacheTypes(args.LoadedAssembly);
			}
		}

		private static void ForceLoadManagedAssemblies()
		{
			string path = Path.Combine(Application.dataPath, "Managed");
			if (!Directory.Exists(path))
			{
				return;
			}
			string[] files = Directory.GetFiles(path, "*.dll");
			foreach (string assemblyFile in files)
			{
				try
				{
					Assembly asm = Assembly.LoadFrom(assemblyFile);
					asm.TryGetTypes();
				}
				catch
				{
				}
			}
		}

		internal static void CacheTypes(Assembly asm)
		{
			Type[] array = asm.TryGetTypes();
			foreach (Type type in array)
			{
				try
				{
					string @namespace = type.Namespace;
					if (!string.IsNullOrEmpty(@namespace) && !uniqueNamespaces.Contains(@namespace))
					{
						uniqueNamespaces.Add(@namespace);
						int j;
						for (j = 0; j < AllNamespaces.Count && @namespace.CompareTo(AllNamespaces[j]) >= 0; j++)
						{
						}
						AllNamespaces.Insert(j, @namespace);
					}
				}
				catch (Exception arg)
				{
					Universe.Log($"Can't cache type named {type.Name} Error: {arg}");
				}
				AllTypes[type.FullName] = type;
				ReflectionUtility.OnTypeLoaded?.Invoke(type);
			}
		}

		public static Type GetTypeByName(string fullName)
		{
			return Instance.Internal_GetTypeByName(fullName);
		}

		internal virtual Type Internal_GetTypeByName(string fullName)
		{
			if (shorthandToType.TryGetValue(fullName, out var value))
			{
				return value;
			}
			AllTypes.TryGetValue(fullName, out var value2);
			if ((object)value2 == null)
			{
				value2 = Type.GetType(fullName);
			}
			return value2;
		}

		internal virtual Type Internal_GetActualType(object obj)
		{
			return obj?.GetType();
		}

		internal virtual object Internal_TryCast(object obj, Type castTo)
		{
			return obj;
		}

		public static string ProcessTypeInString(Type type, string theString)
		{
			return Instance.Internal_ProcessTypeInString(theString, type);
		}

		internal virtual string Internal_ProcessTypeInString(string theString, Type type)
		{
			return theString;
		}

		public static void FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances)
		{
			Instance.Internal_FindSingleton(possibleNames, type, flags, instances);
		}

		internal virtual void Internal_FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances)
		{
			foreach (string name in possibleNames)
			{
				FieldInfo field = type.GetField(name, flags);
				if ((object)field != null)
				{
					object value = field.GetValue(null);
					if (value != null)
					{
						instances.Add(value);
						break;
					}
				}
			}
		}

		public static Type[] TryExtractTypesFromException(ReflectionTypeLoadException e)
		{
			try
			{
				return e.Types.Where((Type it) => (object)it != null).ToArray();
			}
			catch
			{
				return ArgumentUtility.EmptyTypes;
			}
		}

		public static Type[] GetAllBaseTypes(object obj)
		{
			return GetAllBaseTypes(obj?.GetActualType());
		}

		public static Type[] GetAllBaseTypes(Type type)
		{
			if ((object)type == null)
			{
				throw new ArgumentNullException("type");
			}
			string assemblyQualifiedName = type.AssemblyQualifiedName;
			if (baseTypes.TryGetValue(assemblyQualifiedName, out var value))
			{
				return value;
			}
			List<Type> list = new List<Type>();
			while ((object)type != null)
			{
				list.Add(type);
				type = type.BaseType;
			}
			value = list.ToArray();
			baseTypes.Add(assemblyQualifiedName, value);
			return value;
		}

		public static void GetImplementationsOf(Type baseType, Action<HashSet<Type>> onResultsFetched, bool allowAbstract, bool allowGeneric, bool allowEnum)
		{
			RuntimeHelper.StartCoroutine(DoGetImplementations(onResultsFetched, baseType, allowAbstract, allowGeneric, allowEnum));
		}

		private static IEnumerator DoGetImplementations(Action<HashSet<Type>> onResultsFetched, Type baseType, bool allowAbstract, bool allowGeneric, bool allowEnum)
		{
			List<Type> resolvedTypes = new List<Type>();
			OnTypeLoaded += ourListener;
			HashSet<Type> set = new HashSet<Type>();
			IEnumerator coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, DefaultTypesEnumerator());
			while (coro2.MoveNext())
			{
				yield return null;
			}
			OnTypeLoaded -= ourListener;
			if (resolvedTypes.Count > 0)
			{
				coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, resolvedTypes.GetEnumerator());
				while (coro2.MoveNext())
				{
					yield return null;
				}
			}
			onResultsFetched(set);
			void ourListener(Type t)
			{
				resolvedTypes.Add(t);
			}
		}

		private static IEnumerator<Type> DefaultTypesEnumerator()
		{
			string[] names = GetTypeNameArray();
			foreach (string name in names)
			{
				yield return AllTypes[name];
			}
		}

		private static IEnumerator GetImplementationsAsync(Type baseType, HashSet<Type> set, bool allowAbstract, bool allowGeneric, bool allowEnum, IEnumerator<Type> enumerator)
		{
			Stopwatch sw = new Stopwatch();
			sw.Start();
			bool isGenericParam = baseType?.IsGenericParameter ?? false;
			while (enumerator.MoveNext())
			{
				if (sw.ElapsedMilliseconds > 10)
				{
					yield return null;
					sw.Reset();
					sw.Start();
				}
				try
				{
					Type type = enumerator.Current;
					if (set.Contains(type) || (!allowAbstract && type.IsAbstract) || (!allowGeneric && type.IsGenericType) || (!allowEnum && type.IsEnum) || type.FullName.Contains("PrivateImplementationDetails") || type.FullName.Contains("DisplayClass") || Enumerable.Contains(type.FullName, '<'))
					{
						continue;
					}
					if (!isGenericParam)
					{
						if ((object)baseType == null || baseType.IsAssignableFrom(type))
						{
							goto IL_0269;
						}
					}
					else if ((!type.IsClass || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.NotNullableValueTypeConstraint)) && (!type.IsValueType || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.ReferenceTypeConstraint)) && !baseType.GetGenericParameterConstraints().Any((Type it) => !it.IsAssignableFrom(type)))
					{
						goto IL_0269;
					}
					goto end_IL_009f;
					IL_0269:
					set.Add(type);
					end_IL_009f:;
				}
				catch
				{
				}
			}
		}

		public static bool IsEnumerable(Type type)
		{
			return Instance.Internal_IsEnumerable(type);
		}

		protected virtual bool Internal_IsEnumerable(Type type)
		{
			return typeof(IEnumerable).IsAssignableFrom(type);
		}

		public static bool TryGetEnumerator(object ienumerable, out IEnumerator enumerator)
		{
			return Instance.Internal_TryGetEnumerator(ienumerable, out enumerator);
		}

		protected virtual bool Internal_TryGetEnumerator(object list, out IEnumerator enumerator)
		{
			enumerator = (list as IEnumerable).GetEnumerator();
			return true;
		}

		public static bool TryGetEntryType(Type enumerableType, out Type type)
		{
			return Instance.Internal_TryGetEntryType(enumerableType, out type);
		}

		protected virtual bool Internal_TryGetEntryType(Type enumerableType, out Type type)
		{
			if (enumerableType.IsArray)
			{
				type = enumerableType.GetElementType();
				return true;
			}
			Type[] interfaces = enumerableType.GetInterfaces();
			foreach (Type type2 in interfaces)
			{
				if (type2.IsGenericType)
				{
					Type genericTypeDefinition = type2.GetGenericTypeDefinition();
					if ((object)genericTypeDefinition == typeof(IEnumerable<>) || (object)genericTypeDefinition == typeof(IList<>) || (object)genericTypeDefinition == typeof(ICollection<>))
					{
						type = type2.GetGenericArguments()[0];
						return true;
					}
				}
			}
			type = typeof(object);
			return false;
		}

		public static bool IsDictionary(Type type)
		{
			return Instance.Internal_IsDictionary(type);
		}

		protected virtual bool Internal_IsDictionary(Type type)
		{
			return typeof(IDictionary).IsAssignableFrom(type);
		}

		public static bool TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator)
		{
			return Instance.Internal_TryGetDictEnumerator(dictionary, out dictEnumerator);
		}

		protected virtual bool Internal_TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator)
		{
			dictEnumerator = EnumerateDictionary((IDictionary)dictionary);
			return true;
		}

		private IEnumerator<DictionaryEntry> EnumerateDictionary(IDictionary dict)
		{
			IDictionaryEnumerator enumerator = dict.GetEnumerator();
			while (enumerator.MoveNext())
			{
				yield return new DictionaryEntry(enumerator.Key, enumerator.Value);
			}
		}

		public static bool TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values)
		{
			return Instance.Internal_TryGetEntryTypes(dictionaryType, out keys, out values);
		}

		protected virtual bool Internal_TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values)
		{
			Type[] interfaces = dictionaryType.GetInterfaces();
			foreach (Type type in interfaces)
			{
				if (type.IsGenericType && (object)type.GetGenericTypeDefinition() == typeof(IDictionary<, >))
				{
					Type[] genericArguments = type.GetGenericArguments();
					keys = genericArguments[0];
					values = genericArguments[1];
					return true;
				}
			}
			keys = typeof(object);
			values = typeof(object);
			return false;
		}
	}
	public abstract class RuntimeHelper
	{
		internal static RuntimeHelper Instance { get; private set; }

		internal static void Init()
		{
			Instance = new MonoProvider();
			Instance.OnInitialize();
		}

		protected internal abstract void OnInitialize();

		public static Coroutine StartCoroutine(IEnumerator routine)
		{
			return Instance.Internal_StartCoroutine(routine);
		}

		protected internal abstract Coroutine Internal_StartCoroutine(IEnumerator routine);

		public static void StopCoroutine(Coroutine coroutine)
		{
			Instance.Internal_StopCoroutine(coroutine);
		}

		protected internal abstract void Internal_StopCoroutine(Coroutine coroutine);

		public static T AddComponent<T>(GameObject obj, Type type) where T : Component
		{
			return Instance.Internal_AddComponent<T>(obj, type);
		}

		protected internal abstract T Internal_AddComponent<T>(GameObject obj, Type type) where T : Component;

		public static ScriptableObject CreateScriptable(Type type)
		{
			return Instance.Internal_CreateScriptable(type);
		}

		protected internal abstract ScriptableObject Internal_CreateScriptable(Type type);

		public static string LayerToName(int layer)
		{
			return Instance.Internal_LayerToName(layer);
		}

		protected internal abstract string Internal_LayerToName(int layer);

		public static T[] FindObjectsOfTypeAll<T>() where T : Object
		{
			return Instance.Internal_FindObjectsOfTypeAll<T>();
		}

		public static Object[] FindObjectsOfTypeAll(Type type)
		{
			return Instance.Internal_FindObjectsOfTypeAll(type);
		}

		protected internal abstract T[] Internal_FindObjectsOfTypeAll<T>() where T : Object;

		protected internal abstract Object[] Internal_FindObjectsOfTypeAll(Type type);

		public static void GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list)
		{
			Instance.Internal_GraphicRaycast(raycaster, data, list);
		}

		protected internal abstract void Internal_GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list);

		public static GameObject[] GetRootGameObjects(Scene scene)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Instance.Internal_GetRootGameObjects(scene);
		}

		protected internal abstract GameObject[] Internal_GetRootGameObjects(Scene scene);

		public static int GetRootCount(Scene scene)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			return Instance.Internal_GetRootCount(scene);
		}

		protected internal abstract int Internal_GetRootCount(Scene scene);

		public static void SetColorBlockAuto(Selectable selectable, Color baseColor)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			Instance.Internal_SetColorBlock(selectable, baseColor, baseColor * 1.2f, baseColor * 0.8f);
		}

		public static void SetColorBlock(Selectable selectable, ColorBlock colors)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			Instance.Internal_SetColorBlock(selectable, colors);
		}

		protected internal abstract void Internal_SetColorBlock(Selectable selectable, ColorBlock colors);

		public static void SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null)
		{
			Instance.Internal_SetColorBlock(selectable, normal, highlighted, pressed, disabled);
		}

		protected internal abstract void Internal_SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null);
	}
	internal class UniversalBehaviour : MonoBehaviour
	{
		internal static UniversalBehaviour Instance { get; private set; }

		internal static void Setup()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("UniverseLibBehaviour");
			Object.DontDestroyOnLoad((Object)(object)val);
			((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x3D);
			Instance = val.AddComponent<UniversalBehaviour>();
		}

		internal void Update()
		{
			Universe.Update();
		}
	}
	public class Universe
	{
		public enum GlobalState
		{
			WaitingToSetup,
			SettingUp,
			SetupCompleted
		}

		public const string NAME = "UniverseLib";

		public const string VERSION = "1.5.5";

		public const string AUTHOR = "Sinai, yukieiji";

		public const string GUID = "com.sinai.universelib";

		private static float startupDelay;

		private static Action<string, LogType> logHandler;

		public static RuntimeContext Context { get; } = RuntimeContext.Mono;


		public static GlobalState CurrentGlobalState { get; private set; }

		internal static Harmony Harmony { get; } = new Harmony("com.sinai.universelib");


		private static event Action OnInitialized;

		public static void Init(Action onInitialized = null, Action<string, LogType> logHandler = null)
		{
			Init(1f, onInitialized, logHandler, default(UniverseLibConfig));
		}

		public static void Init(float startupDelay, Action onInitialized, Action<string, LogType> logHandler, UniverseLibConfig config)
		{
			if (CurrentGlobalState == GlobalState.SetupCompleted)
			{
				InvokeOnInitialized(onInitialized);
				return;
			}
			if (startupDelay > Universe.startupDelay)
			{
				Universe.startupDelay = startupDelay;
			}
			ConfigManager.LoadConfig(config);
			OnInitialized += onInitialized;
			if (logHandler != null && Universe.logHandler == null)
			{
				Universe.logHandler = logHandler;
			}
			if (CurrentGlobalState == GlobalState.WaitingToSetup)
			{
				CurrentGlobalState = GlobalState.SettingUp;
				Log("UniverseLib 1.5.5 initializing...");
				UniversalBehaviour.Setup();
				ReflectionUtility.Init();
				RuntimeHelper.Init();
				RuntimeHelper.Instance.Internal_StartCoroutine(SetupCoroutine());
				Log("Finished UniverseLib initial setup.");
			}
		}

		internal static void Update()
		{
			UniversalUI.Update();
		}

		private static IEnumerator SetupCoroutine()
		{
			yield return null;
			Stopwatch sw = new Stopwatch();
			sw.Start();
			while (ReflectionUtility.Initializing || (float)sw.ElapsedMilliseconds * 0.001f < startupDelay)
			{
				yield return null;
			}
			InputManager.Init();
			UniversalUI.Init();
			Log("UniverseLib 1.5.5 initialized.");
			CurrentGlobalState = GlobalState.SetupCompleted;
			InvokeOnInitialized(Universe.OnInitialized);
		}

		private static void InvokeOnInitialized(Action onInitialized)
		{
			if (onInitialized == null)
			{
				return;
			}
			Delegate[] invocationList = onInitialized.GetInvocationList();
			foreach (Delegate @delegate in invocationList)
			{
				try
				{
					@delegate.DynamicInvoke();
				}
				catch (Exception arg)
				{
					LogWarning($"Exception invoking onInitialized callback! {arg}");
				}
			}
		}

		internal static void Log(object message)
		{
			Log(message, (LogType)3);
		}

		internal static void LogWarning(object message)
		{
			Log(message, (LogType)2);
		}

		internal static void LogError(object message)
		{
			Log(message, (LogType)0);
		}

		private static void Log(object message, LogType logType)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			if (logHandler != null)
			{
				logHandler("[UniverseLib] " + (message?.ToString() ?? string.Empty), logType);
			}
		}

		internal static bool Patch(Type type, string methodName, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Invalid comparison between Unknown and I4
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Expected O, but got Unknown
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Expected O, but got Unknown
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Expected O, but got Unknown
			try
			{
				string text = (((int)methodType == 1) ? "get_" : (((int)methodType != 2) ? string.Empty : "set_"));
				string text2 = text;
				MethodInfo methodInfo = ((arguments == null) ? type.GetMethod(text2 + methodName, AccessTools.all) : type.GetMethod(text2 + methodName, AccessTools.all, null, arguments, null));
				if ((object)methodInfo == null)
				{
					return false;
				}
				PatchProcessor val = Harmony.CreateProcessor((MethodBase)methodInfo);
				if ((object)prefix != null)
				{
					val.AddPrefix(new HarmonyMethod(prefix));
				}
				if ((object)postfix != null)
				{
					val.AddPostfix(new HarmonyMethod(postfix));
				}
				if ((object)finalizer != null)
				{
					val.AddFinalizer(new HarmonyMethod(finalizer));
				}
				val.Patch();
				return true;
			}
			catch (Exception arg)
			{
				LogWarning($"\t Exception patching {type.FullName}.{methodName}: {arg}");
				return false;
			}
		}

		internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			foreach (string methodName in possibleNames)
			{
				if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
				{
					return true;
				}
			}
			return false;
		}

		internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			foreach (string methodName in possibleNames)
			{
				foreach (Type[] arguments in possibleArguments)
				{
					if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
					{
						return true;
					}
				}
			}
			return false;
		}

		internal static bool Patch(Type type, string methodName, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			foreach (Type[] arguments in possibleArguments)
			{
				if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer))
				{
					return true;
				}
			}
			return false;
		}
	}
}
namespace UniverseLib.Utility
{
	public static class ArgumentUtility
	{
		public static readonly Type[] EmptyTypes = new Type[0];

		public static readonly object[] EmptyArgs = new object[0];

		public static readonly Type[] ParseArgs = new Type[1] { typeof(string) };
	}
	public static class IOUtility
	{
		private static readonly char[] invalidDirectoryCharacters = Path.GetInvalidPathChars();

		private static readonly char[] invalidFilenameCharacters = Path.GetInvalidFileNameChars();

		public static string EnsureValidFilePath(string fullPathWithFile)
		{
			fullPathWithFile = string.Concat(fullPathWithFile.Split(invalidDirectoryCharacters));
			Directory.CreateDirectory(Path.GetDirectoryName(fullPathWithFile));
			return fullPathWithFile;
		}

		public static string EnsureValidFilename(string filename)
		{
			return string.Concat(filename.Split(invalidFilenameCharacters));
		}
	}
	public static class MiscUtility
	{
		public static bool ContainsIgnoreCase(this string _this, string s)
		{
			return CultureInfo.CurrentCulture.CompareInfo.IndexOf(_this, s, CompareOptions.IgnoreCase) >= 0;
		}

		public static bool HasFlag(this Enum flags, Enum value)
		{
			try
			{
				ulong num = Convert.ToUInt64(value);
				return (Convert.ToUInt64(flags) & num) == num;
			}
			catch
			{
				long num2 = Convert.ToInt64(value);
				return (Convert.ToInt64(flags) & num2) == num2;
			}
		}

		public static bool EndsWith(this StringBuilder sb, string _string)
		{
			int length = _string.Length;
			if (sb.Length < length)
			{
				return false;
			}
			int num = 0;
			int num2 = sb.Length - length;
			while (num2 < sb.Length)
			{
				if (sb[num2] != _string[num])
				{
					return false;
				}
				num2++;
				num++;
			}
			return true;
		}
	}
	public static class ParseUtility
	{
		internal delegate object ParseMethod(string input);

		internal delegate string ToStringMethod(object obj);

		public static readonly string NumberFormatString = "0.####";

		private static readonly Dictionary<int, string> numSequenceStrings = new Dictionary<int, string>();

		private static readonly HashSet<Type> nonPrimitiveTypes = new HashSet<Type>
		{
			typeof(string),
			typeof(decimal),
			typeof(DateTime)
		};

		private static readonly HashSet<Type> formattedTypes = new HashSet<Type>
		{
			typeof(float),
			typeof(double),
			typeof(decimal)
		};

		private static readonly Dictionary<string, string> typeInputExamples = new Dictionary<string, string>();

		private static readonly Dictionary<string, ParseMethod> customTypes = new Dictionary<string, ParseMethod>
		{
			{
				typeof(Vector2).FullName,
				TryParseVector2
			},
			{
				typeof(Vector3).FullName,
				TryParseVector3
			},
			{
				typeof(Vector4).FullName,
				TryParseVector4
			},
			{
				typeof(Quaternion).FullName,
				TryParseQuaternion
			},
			{
				typeof(Rect).FullName,
				TryParseRect
			},
			{
				typeof(Color).FullName,
				TryParseColor
			},
			{
				typeof(Color32).FullName,
				TryParseColor32
			},
			{
				typeof(LayerMask).FullName,
				TryParseLayerMask
			}
		};

		private static readonly Dictionary<string, ToStringMethod> customTypesToString = new Dictionary<string, ToStringMethod>
		{
			{
				typeof(Vector2).FullName,
				Vector2ToString
			},
			{
				typeof(Vector3).FullName,
				Vector3ToString
			},
			{
				typeof(Vector4).FullName,
				Vector4ToString
			},
			{
				typeof(Quaternion).FullName,
				QuaternionToString
			},
			{
				typeof(Rect).FullName,
				RectToString
			},
			{
				typeof(Color).FullName,
				ColorToString
			},
			{
				typeof(Color32).FullName,
				Color32ToString
			},
			{
				typeof(LayerMask).FullName,
				LayerMaskToString
			}
		};

		public static string FormatDecimalSequence(params object[] numbers)
		{
			if (numbers.Length == 0)
			{
				return null;
			}
			return string.Format(CultureInfo.CurrentCulture, GetSequenceFormatString(numbers.Length), numbers);
		}

		internal static string GetSequenceFormatString(int count)
		{
			if (count <= 0)
			{
				return null;
			}
			if (numSequenceStrings.ContainsKey(count))
			{
				return numSequenceStrings[count];
			}
			string[] array = new string[count];
			for (int i = 0; i < count; i++)
			{
				array[i] = $"{{{i}:{NumberFormatString}}}";
			}
			string text = string.Join(" ", array);
			numSequenceStrings.Add(count, text);
			return text;
		}

		public static bool CanParse(Type type)
		{
			return !string.IsNullOrEmpty(type?.FullName) && (type.IsPrimitive || type.IsEnum || nonPrimitiveTypes.Contains(type) || customTypes.ContainsKey(type.FullName));
		}

		public static bool CanParse<T>()
		{
			return CanParse(typeof(T));
		}

		public static bool TryParse<T>(string input, out T obj, out Exception parseException)
		{
			object obj2;
			bool result = TryParse(input, typeof(T), out obj2, out parseException);
			if (obj2 != null)
			{
				obj = (T)obj2;
			}
			else
			{
				obj = default(T);
			}
			return result;
		}

		public static bool TryParse(string input, Type type, out object obj, out Exception parseException)
		{
			obj = null;
			parseException = null;
			if ((object)type == null)
			{
				return false;
			}
			if ((object)type == typeof(string))
			{
				obj = input;
				return true;
			}
			if (type.IsEnum)
			{
				try
				{
					obj = Enum.Parse(type, input);
					return true;
				}
				catch (Exception e)
				{
					parseException = e.GetInnerMostException();
					return false;
				}
			}
			try
			{
				if (customTypes.ContainsKey(type.FullName))
				{
					obj = customTypes[type.FullName](input);
				}
				else
				{
					obj = AccessTools.Method(type, "Parse", ArgumentUtility.ParseArgs, (Type[])null).Invoke(null, new object[1] { input });
				}
				return true;
			}
			catch (Exception e2)
			{
				Exception innerMostException = e2.GetInnerMostException();
				parseException = innerMostException;
			}
			return false;
		}

		public static string ToStringForInput<T>(object obj)
		{
			return ToStringForInput(obj, typeof(T));
		}

		public static string ToStringForInput(object obj, Type type)
		{
			if ((object)type == null || obj == null)
			{
				return null;
			}
			if ((object)type == typeof(string))
			{
				return obj as string;
			}
			if (type.IsEnum)
			{
				return Enum.IsDefined(type, obj) ? Enum.GetName(type, obj) : obj.ToString();
			}
			try
			{
				if (customTypes.ContainsKey(type.FullName))
				{
					return customTypesToString[type.FullName](obj);
				}
				if (formattedTypes.Contains(type))
				{
					return AccessTools.Method(type, "ToString", new Type[2]
					{
						typeof(string),
						typeof(IFormatProvider)
					}, (Type[])null).Invoke(obj, new object[2]
					{
						NumberFormatString,
						CultureInfo.CurrentCulture
					}) as string;
				}
				return obj.ToString();
			}
			catch (Exception arg)
			{
				Universe.LogWarning($"Exception formatting object for input: {arg}");
				return null;
			}
		}

		public static string GetExampleInput<T>()
		{
			return GetExampleInput(typeof(T));
		}

		public static string GetExampleInput(Type type)
		{
			if (!typeInputExamples.ContainsKey(type.AssemblyQualifiedName))
			{
				try
				{
					if (type.IsEnum)
					{
						typeInputExamples.Add(type.AssemblyQualifiedName, Enum.GetNames(type).First());
					}
					else
					{
						object obj = Activator.CreateInstance(type);
						typeInputExamples.Add(type.AssemblyQualifiedName, ToStringForInput(obj, type));
					}
				}
				catch (Exception message)
				{
					Universe.LogWarning("Exception generating default instance for example input for '" + type.FullName + "'");
					Universe.Log(message);
					return "";
				}
			}
			return typeInputExamples[type.AssemblyQualifiedName];
		}

		internal static object TryParseVector2(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			Vector2 val = default(Vector2);
			string[] array = input.Split(new char[1] { ' ' });
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector2ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector2 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y);
		}

		internal static object TryParseVector3(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			string[] array = input.Split(new char[1] { ' ' });
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector3ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector3 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z);
		}

		internal static object TryParseVector4(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			Vector4 val = default(Vector4);
			string[] array = input.Split(new char[1] { ' ' });
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			val.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string Vector4ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Vector4 val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.x, val.y, val.z, val.w);
		}

		internal static object TryParseQuaternion(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			string[] array = input.Split(new char[1] { ' ' });
			if (array.Length == 4)
			{
				Quaternion val2 = default(Quaternion);
				val2.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
				val2.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
				val2.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
				val2.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
				return val2;
			}
			val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			return Quaternion.Euler(val);
		}

		internal static string QuaternionToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Quaternion val) || 1 == 0)
			{
				return null;
			}
			Vector3 eulerAngles = ((Quaternion)(ref val)).eulerAngles;
			return FormatDecimalSequence(eulerAngles.x, eulerAngles.y, eulerAngles.z);
		}

		internal static object TryParseRect(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			Rect val = default(Rect);
			string[] array = input.Split(new char[1] { ' ' });
			((Rect)(ref val)).x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).width = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			((Rect)(ref val)).height = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			return val;
		}

		internal static string RectToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Rect val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(((Rect)(ref val)).x, ((Rect)(ref val)).y, ((Rect)(ref val)).width, ((Rect)(ref val)).height);
		}

		internal static object TryParseColor(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			Color val = default(Color);
			string[] array = input.Split(new char[1] { ' ' });
			val.r = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.g = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.b = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			if (array.Length > 3)
			{
				val.a = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			}
			else
			{
				val.a = 1f;
			}
			return val;
		}

		internal static string ColorToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Color val) || 1 == 0)
			{
				return null;
			}
			return FormatDecimalSequence(val.r, val.g, val.b, val.a);
		}

		internal static object TryParseColor32(string input)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			Color32 val = default(Color32);
			string[] array = input.Split(new char[1] { ' ' });
			val.r = byte.Parse(array[0].Trim(), CultureInfo.CurrentCulture);
			val.g = byte.Parse(array[1].Trim(), CultureInfo.CurrentCulture);
			val.b = byte.Parse(array[2].Trim(), CultureInfo.CurrentCulture);
			if (array.Length > 3)
			{
				val.a = byte.Parse(array[3].Trim(), CultureInfo.CurrentCulture);
			}
			else
			{
				val.a = byte.MaxValue;
			}
			return val;
		}

		internal static string Color32ToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is Color32 val) || 1 == 0)
			{
				return null;
			}
			return $"{val.r} {val.g} {val.b} {val.a}";
		}

		internal static object TryParseLayerMask(string input)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			return LayerMask.op_Implicit(int.Parse(input));
		}

		internal static string LayerMaskToString(object obj)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			if (!(obj is LayerMask val) || 1 == 0)
			{
				return null;
			}
			return ((LayerMask)(ref val)).value.ToString();
		}
	}
	public static class SignatureHighlighter
	{
		public const string NAMESPACE = "#a8a8a8";

		public const string CONST = "#92c470";

		public const string CLASS_STATIC = "#3a8d71";

		public const string CLASS_INSTANCE = "#2df7b2";

		public const string STRUCT = "#0fba3a";

		public const string INTERFACE = "#9b9b82";

		public const string FIELD_STATIC = "#8d8dc6";

		public const string FIELD_INSTANCE = "#c266ff";

		public const string METHOD_STATIC = "#b55b02";

		public const string METHOD_INSTANCE = "#ff8000";

		public const string PROP_STATIC = "#588075";

		public const string PROP_INSTANCE = "#55a38e";

		public const string LOCAL_ARG = "#a6e9e9";

		public const string OPEN_COLOR = "<color=";

		public const string CLOSE_COLOR = "</color>";

		public const string OPEN_ITALIC = "<i>";

		public const string CLOSE_ITALIC = "</i>";

		public static readonly Regex ArrayTokenRegex = new Regex("\\[,*?\\]");

		private static readonly Regex colorTagRegex = new Regex("<color=#?[\\d|\\w]*>");

		public static readonly Color StringOrange = new Color(0.83f, 0.61f, 0.52f);

		public static readonly Color EnumGreen = new Color(0.57f, 0.76f, 0.43f);

		public static readonly Color KeywordBlue = new Color(0.3f, 0.61f, 0.83f);

		public static readonly string keywordBlueHex = KeywordBlue.ToHex();

		public static readonly Color NumberGreen = new Color(0.71f, 0.8f, 0.65f);

		private static readonly Dictionary<string, string> typeToRichType = new Dictionary<string, string>();

		private static readonly Dictionary<string, string> highlightedMethods = new Dictionary<string, string>();

		private static readonly Dictionary<Type, string> builtInTypesToShorthand = new Dictionary<Type, string>
		{
			{
				typeof(object),
				"object"
			},
			{
				typeof(string),
				"string"
			},
			{
				typeof(bool),
				"bool"
			},
			{
				typeof(byte),
				"byte"
			},
			{
				typeof(sbyte),
				"sbyte"
			},
			{
				typeof(char),
				"char"
			},
			{
				typeof(decimal),
				"decimal"
			},
			{
				typeof(double),
				"double"
			},
			{
				typeof(float),
				"float"
			},
			{
				typeof(int),
				"int"
			},
			{
				typeof(uint),
				"uint"
			},
			{
				typeof(long),
				"long"
			},
			{
				typeof(ulong),
				"ulong"
			},
			{
				typeof(short),
				"short"
			},
			{
				typeof(ushort),
				"ushort"
			},
			{
				typeof(void),
				"void"
			}
		};

		public static string Parse(Type type, bool includeNamespace, MemberInfo memberInfo = null)
		{
			if ((object)type == null)
			{
				throw new ArgumentNullException("type");
			}
			if (memberInfo is MethodInfo method)
			{
				return ParseMethod(method);
			}
			if (memberInfo is ConstructorInfo ctor)
			{
				return ParseConstructor(ctor);
			}
			StringBuilder stringBuilder = new StringBuilder();
			if (type.IsByRef)
			{
				AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append("ref ").Append("</color>");
			}
			Type type2 = type;
			while (type2.HasElementType)
			{
				type2 = type2.GetElementType();
			}
			includeNamespace &= !builtInTypesToShorthand.ContainsKey(type2);
			if (!type.IsGenericParameter && (!type.HasElementType || !type.GetElementType().IsGenericParameter) && includeNamespace && TryGetNamespace(type, out var ns))
			{
				AppendOpenColor(stringBuilder, "#a8a8a8").Append(ns).Append("</color>").Append('.');
			}
			stringBuilder.Append(ProcessType(type));
			if ((object)memberInfo != null)
			{
				stringBuilder.Append('.');
				int index = stringBuilder.Length - 1;
				AppendOpenColor(stringBuilder, GetMemberInfoColor(memberInfo, out var isStatic)).Append(memberInfo.Name).Append("</color>");
				if (isStatic)
				{
					stringBuilder.Insert(index, "<i>");
					stringBuilder.Append("</i>");
				}
			}
			return stringBuilder.ToString();
		}

		private static string ProcessType(Type type)
		{
			string key = type.ToString();
			if (typeToRichType.ContainsKey(key))
			{
				return typeToRichType[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			if (!type.IsGenericParameter)
			{
				int length = stringBuilder.Length;
				Type declaringType = type.DeclaringType;
				while ((object)declaringType != null)
				{
					stringBuilder.Insert(length, HighlightType(declaringType) + ".");
					declaringType = declaringType.DeclaringType;
				}
				stringBuilder.Append(HighlightType(type));
				if (type.IsGenericType)
				{
					ProcessGenericArguments(type, stringBuilder);
				}
			}
			else
			{
				stringBuilder.Append("<color=").Append("#92c470").Append('>')
					.Append(type.Name)
					.Append("</color>");
			}
			string text = stringBuilder.ToString();
			typeToRichType.Add(key, text);
			return text;
		}

		internal static string GetClassColor(Type type)
		{
			if (type.IsAbstract && type.IsSealed)
			{
				return "#3a8d71";
			}
			if (type.IsEnum || type.IsGenericParameter)
			{
				return "#92c470";
			}
			if (type.IsValueType)
			{
				return "#0fba3a";
			}
			if (type.IsInterface)
			{
				return "#9b9b82";
			}
			return "#2df7b2";
		}

		private static bool TryGetNamespace(Type type, out string ns)
		{
			return !string.IsNullOrEmpty(ns = type.Namespace?.Trim());
		}

		private static StringBuilder AppendOpenColor(StringBuilder sb, string color)
		{
			return sb.Append("<color=").Append(color).Append('>');
		}

		private static string HighlightType(Type type)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (type.IsByRef)
			{
				type = type.GetElementType();
			}
			int num = 0;
			Match match = ArrayTokenRegex.Match(type.Name);
			if (match != null && match.Success)
			{
				num = 1 + match.Value.Count((char c) => c == ',');
				type = type.GetElementType();
			}
			if (builtInTypesToShorthand.TryGetValue(type, out var value))
			{
				AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append(value).Append("</color>");
			}
			else
			{
				stringBuilder.Append("<color=" + GetClassColor(type) + ">").Append(type.Name).Append("</color>");
			}
			if (num > 0)
			{
				stringBuilder.Append('[').Append(new string(',', num - 1)).Append(']');
			}
			return stringBuilder.ToString();
		}

		private static void ProcessGenericArguments(Type type, StringBuilder sb)
		{
			List<Type> list = type.GetGenericArguments().ToList();
			for (int i = 0; i < sb.Length; i++)
			{
				if (!list.Any())
				{
					break;
				}
				if (sb[i] != '`')
				{
					continue;
				}
				int num = i;
				i++;
				StringBuilder stringBuilder = new StringBuilder();
				for (; char.IsDigit(sb[i]); i++)
				{
					stringBuilder.Append(sb[i]);
				}
				string text = stringBuilder.ToString();
				int num2 = int.Parse(text);
				sb.Remove(num, text.Length + 1);
				int num3 = 1;
				num++;
				while (num3 < "</color>".Length && sb[num] == "</color>"[num3])
				{
					num3++;
					num++;
				}
				sb.Insert(num, '<');
				num++;
				int length = sb.Length;
				while (num2 > 0 && list.Any())
				{
					num2--;
					Type type2 = list.First();
					list.RemoveAt(0);
					sb.Insert(num, ProcessType(type2));
					if (num2 > 0)
					{
						num += sb.Length - length;
						sb.Insert(num, ", ");
						num += 2;
						length = sb.Length;
					}
				}
				sb.Insert(num + sb.Length - length, '>');
			}
		}

		public static string RemoveHighlighting(string _string)
		{
			if (_string == null)
			{
				throw new ArgumentNullException("_string");
			}
			_string = _string.Replace("<i>", string.Empty);
			_string = _string.Replace("</i>", string.Empty);
			_string = colorTagRegex.Replace(_string, string.Empty);
			_string = _string.Replace("</color>", string.Empty);
			return _string;
		}

		[Obsolete("Use 'ParseMethod(MethodInfo)' instead (rename).")]
		public static string HighlightMethod(MethodInfo method)
		{
			return ParseMethod(method);
		}

		public static string ParseMethod(MethodInfo method)
		{
			string key = GeneralExtensions.FullDescription((MethodBase)method);
			if (highlightedMethods.ContainsKey(key))
			{
				return highlightedMethods[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(Parse(method.DeclaringType, includeNamespace: false));
			stringBuilder.Append('.');
			string text = ((!method.IsStatic) ? "#ff8000" : "#b55b02");
			stringBuilder.Append("<color=" + text + ">" + method.Name + "</color>");
			if (method.IsGenericMethod)
			{
				stringBuilder.Append("<");
				Type[] genericArguments = method.GetGenericArguments();
				for (int i = 0; i < genericArguments.Length; i++)
				{
					Type type = genericArguments[i];
					if (type.IsGenericParameter)
					{
						stringBuilder.Append("<color=#92c470>" + genericArguments[i].Name + "</color>");
					}
					else
					{
						stringBuilder.Append(Parse(type, includeNamespace: false));
					}
					if (i < genericArguments.Length - 1)
					{
						stringBuilder.Append(", ");
					}
				}
				stringBuilder.Append(">");
			}
			stringBuilder.Append('(');
			ParameterInfo[] parameters = method.GetParameters();
			for (int j = 0; j < parameters.Length; j++)
			{
				ParameterInfo parameterInfo = parameters[j];
				stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false));
				if (j < parameters.Length - 1)
				{
					stringBuilder.Append(", ");
				}
			}
			stringBuilder.Append(')');
			string text2 = stringBuilder.ToString();
			highlightedMethods.Add(key, text2);
			return text2;
		}

		[Obsolete("Use 'ParseConstructor(ConstructorInfo)' instead (rename).")]
		public static string HighlightConstructor(ConstructorInfo ctor)
		{
			return ParseConstructor(ctor);
		}

		public static string ParseConstructor(ConstructorInfo ctor)
		{
			string key = GeneralExtensions.FullDescription((MethodBase)ctor);
			if (highlightedMethods.ContainsKey(key))
			{
				return highlightedMethods[key];
			}
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.Append(Parse(ctor.DeclaringType, includeNamespace: false));
			string value = stringBuilder.ToString();
			stringBuilder.Append('.');
			stringBuilder.Append(value);
			stringBuilder.Append('(');
			ParameterInfo[] parameters = ctor.GetParameters();
			for (int i = 0; i < parameters.Length; i++)
			{
				ParameterInfo parameterInfo = parameters[i];
				stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false));
				if (i < parameters.Length - 1)
				{
					stringBuilder.Append(", ");
				}
			}
			stringBuilder.Append(')');
			string text = stringBuilder.ToString();
			highlightedMethods.Add(key, text);
			return text;
		}

		public static string GetMemberInfoColor(MemberInfo memberInfo, out bool isStatic)
		{
			isStatic = false;
			if (memberInfo is FieldInfo fieldInfo)
			{
				if (fieldInfo.IsStatic)
				{
					isStatic = true;
					return "#8d8dc6";
				}
				return "#c266ff";
			}
			if (memberInfo is MethodInfo methodInfo)
			{
				if (methodInfo.IsStatic)
				{
					isStatic = true;
					return "#b55b02";
				}
				return "#ff8000";
			}
			if (memberInfo is PropertyInfo propertyInfo)
			{
				if (propertyInfo.GetAccessors(nonPublic: true)[0].IsStatic)
				{
					isStatic = true;
					return "#588075";
				}
				return "#55a38e";
			}
			if (memberInfo is ConstructorInfo)
			{
				isStatic = true;
				return "#2df7b2";
			}
			throw new NotImplementedException(memberInfo.GetType().Name + " is not supported");
		}
	}
	public static class ToStringUtility
	{
		internal static Dictionary<string, MethodInfo> toStringMethods = new Dictionary<string, MethodInfo>();

		private const string nullString = "<color=grey>null</color>";

		private const string nullUnknown = "<color=grey>null</color> (?)";

		private const string destroyedString = "<color=red>Destroyed</color>";

		private const string untitledString = "<i><color=grey>untitled</color></i>";

		private const string eventSystemNamespace = "UnityEngine.EventSystem";

		public static string PruneString(string s, int chars = 200, int lines = 5)
		{
			if (string.IsNullOrEmpty(s))
			{
				return s;
			}
			StringBuilder stringBuilder = new StringBuilder(Math.Max(chars, s.Length));
			int num = 0;
			for (int i = 0; i < s.Length; i++)
			{
				if (num >= lines || i >= chars)
				{
					stringBuilder.Append("...");
					break;
				}
				char c = s[i];
				if (c == '\r' || c == '\n')
				{
					num++;
				}
				stringBuilder.Append(c);
			}
			return stringBuilder.ToString();
		}

		public static string ToStringWithType(object value, Type fallbackType, bool includeNamespace = true)
		{
			if (value.IsNullOrDestroyed() && (object)fallbackType == null)
			{
				return "<color=grey>null</color> (?)";
			}
			Type type = value?.GetActualType() ?? fallbackType;
			string text = SignatureHighlighter.Parse(type, includeNamespace);
			StringBuilder stringBuilder = new StringBuilder();
			if (value.IsNullOrDestroyed())
			{
				if (value == null)
				{
					stringBuilder.Append("<color=grey>null</color>");
					AppendRichType(stringBuilder, text);
					return stringBuilder.ToString();
				}
				stringBuilder.Append("<color=red>Destroyed</color>");
				AppendRichType(stringBuilder, text);
				return stringBuilder.ToString();
			}
			Object val = (Object)((value is Object) ? value : null);
			if (val != null)
			{
				if (string.IsNullOrEmpty(val.name))
				{
					stringBuilder.Append("<i><color=grey>untitled</color></i>");
				}
				else
				{
					stringBuilder.Append('"');
					stringBuilder.Append(PruneString(val.name, 50, 1));
					stringBuilder.Append('"');
				}
				AppendRichType(stringBuilder, text);
			}
			else if (type.FullName.StartsWith("UnityEngine.EventSystem"))
			{
				stringBuilder.Append(text);
			}
			else
			{
				string text2 = ToString(value);
				if (type.IsGenericType || text2 == type.FullName || text2 == type.FullName + " " + type.FullName || text2 == "Il2Cpp" + type.FullName || type.FullName == "Il2Cpp" + text2)
				{
					stringBuilder.Append(text);
				}
				else
				{
					stringBuilder.Append(PruneString(text2));
					AppendRichType(stringBuilder, text);
				}
			}
			return stringBuilder.ToString();
		}

		private static void AppendRichType(StringBuilder sb, string richType)
		{
			sb.Append(' ');
			sb.Append('(');
			sb.Append(richType);
			sb.Append(')');
		}

		private static string ToString(object value)
		{
			if (value.IsNullOrDestroyed())
			{
				if (value == null)
				{
					return "<color=grey>null</color>";
				}
				return "<color=red>Destroyed</color>";
			}
			Type actualType = value.GetActualType();
			if (!toStringMethods.ContainsKey(actualType.AssemblyQualifiedName))
			{
				MethodInfo method = actualType.GetMethod("ToString", ArgumentUtility.EmptyTypes);
				toStringMethods.Add(actualType.AssemblyQualifiedName, method);
			}
			value = value.TryCast(actualType);
			string theString;
			try
			{
				theString = (string)toStringMethods[actualType.AssemblyQualifiedName].Invoke(value, ArgumentUtility.EmptyArgs);
			}
			catch (Exception e)
			{
				theString = e.ReflectionExToString();
			}
			return ReflectionUtility.ProcessTypeInString(actualType, theString);
		}
	}
	public static class UnityHelpers
	{
		private static PropertyInfo onEndEdit;

		public static bool OccuredEarlierThanDefault(this float time)
		{
			return Time.realtimeSinceStartup - 0.01f >= time;
		}

		public static bool OccuredEarlierThan(this float time, float secondsAgo)
		{
			return Time.realtimeSinceStartup - secondsAgo >= time;
		}

		public static bool IsNullOrDestroyed(this object obj, bool suppressWarning = true)
		{
			try
			{
				if (obj == null)
				{
					if (!suppressWarning)
					{
						Universe.LogWarning("The target instance is null!");
					}
					return true;
				}
				Object val = (Object)((obj is Object) ? obj : null);
				if (val != null && !Object.op_Implicit(val))
				{
					if (!suppressWarning)
					{
						Universe.LogWarning("The target UnityEngine.Object was destroyed!");
					}
					return true;
				}
				return false;
			}
			catch
			{
				return true;
			}
		}

		public static string GetTransformPath(this Transform transform, bool includeSelf = false)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (includeSelf)
			{
				stringBuilder.Append(((Object)transform).name);
			}
			while (Object.op_Implicit((Object)(object)transform.parent))
			{
				transform = transform.parent;
				stringBuilder.Insert(0, '/');
				stringBuilder.Insert(0, ((Object)transform).name);
			}
			return stringBuilder.ToString();
		}

		public static string ToHex(this Color color)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			byte b = (byte)Mathf.Clamp(Mathf.RoundToInt(color.r * 255f), 0, 255);
			byte b2 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.g * 255f), 0, 255);
			byte b3 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.b * 255f), 0, 255);
			return $"{b:X2}{b2:X2}{b3:X2}";
		}

		public static Color ToColor(this string _string)
		{
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			_string = _string.Replace("#", "");
			if (_string.Length != 6)
			{
				return Color.magenta;
			}
			byte b = byte.Parse(_string.Substring(0, 2), NumberStyles.HexNumber);
			byte b2 = byte.Parse(_string.Substring(2, 2), NumberStyles.HexNumber);
			byte b3 = byte.Parse(_string.Substring(4, 2), NumberStyles.HexNumber);
			Color result = default(Color);
			result.r = (float)((decimal)b / 255m);
			result.g = (float)((decimal)b2 / 255m);
			result.b = (float)((decimal)b3 / 255m);
			result.a = 1f;
			return result;
		}

		public static UnityEvent<string> GetOnEndEdit(this InputField _this)
		{
			if ((object)onEndEdit == null)
			{
				onEndEdit = AccessTools.Property(typeof(InputField), "onEndEdit") ?? throw new Exception("Could not get InputField.onEndEdit property!");
			}
			return onEndEdit.GetValue(_this, null).TryCast<UnityEvent<string>>();
		}
	}
}
namespace UniverseLib.UI
{
	public class UIBase
	{
		internal static readonly int TOP_SORTORDER = 30000;

		public string ID { get; }

		public GameObject RootObject { get; }

		public RectTransform RootRect { get; }

		public Canvas Canvas { get; }

		public Action UpdateMethod { get; }

		public PanelManager Panels { get; }

		public bool Enabled
		{
			get
			{
				return Object.op_Implicit((Object)(object)RootObject) && RootObject.activeSelf;
			}
			set
			{
				UniversalUI.SetUIActive(ID, value);
			}
		}

		public UIBase(string id, Action updateMethod)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			if (string.IsNullOrEmpty(id))
			{
				throw new ArgumentException("Cannot register a UI with a null or empty id!");
			}
			if (UniversalUI.registeredUIs.ContainsKey(id))
			{
				throw new ArgumentException("A UI with the id '" + id + "' is already registered!");
			}
			ID = id;
			UpdateMethod = updateMethod;
			RootObject = UIFactory.CreateUIObject(id + "_Root", UniversalUI.CanvasRoot);
			RootObject.SetActive(false);
			RootRect = RootObject.GetComponent<RectTransform>();
			Canvas = RootObject.AddComponent<Canvas>();
			Canvas.renderMode = (RenderMode)1;
			Canvas.referencePixelsPerUnit = 100f;
			Canvas.sortingOrder = TOP_SORTORDER;
			Canvas.overrideSorting = true;
			CanvasScaler val = RootObject.AddComponent<CanvasScaler>();
			val.referenceResolution = new Vector2(1920f, 1080f);
			val.screenMatchMode = (ScreenMatchMode)1;
			RootObject.AddComponent<GraphicRaycaster>();
			RectTransform component = RootObject.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.pivot = new Vector2(0.5f, 0.5f);
			Panels = CreatePanelManager();
			RootObject.SetActive(true);
			UniversalUI.registeredUIs.Add(id, this);
			UniversalUI.uiBases.Add(this);
		}

		protected virtual PanelManager CreatePanelManager()
		{
			return new PanelManager(this);
		}

		public void SetOnTop()
		{
			RootObject.transform.SetAsLastSibling();
			foreach (UIBase uiBasis in UniversalUI.uiBases)
			{
				int num = UniversalUI.CanvasRoot.transform.childCount - ((Transform)uiBasis.RootRect).GetSiblingIndex();
				uiBasis.Canvas.sortingOrder = TOP_SORTORDER - num;
			}
			UniversalUI.uiBases.Sort((UIBase a, UIBase b) => b.RootObject.transform.GetSiblingIndex().CompareTo(a.RootObject.transform.GetSiblingIndex()));
		}

		internal void Update()
		{
			try
			{
				Panels.Update();
				UpdateMethod?.Invoke();
			}
			catch (Exception arg)
			{
				Universe.LogWarning($"Exception invoking update method for {ID}: {arg}");
			}
		}
	}
	public static class UIFactory
	{
		internal static Vector2 largeElementSize = new Vector2(100f, 30f);

		internal static Vector2 smallElementSize = new Vector2(25f, 25f);

		internal static Color defaultTextColor = Color.white;

		public static GameObject CreateUIObject(string name, GameObject parent, Vector2 sizeDelta = default(Vector2))
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Expected O, but got Unknown
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name)
			{
				layer = 5,
				hideFlags = (HideFlags)61
			};
			if (Object.op_Implicit((Object)(object)parent))
			{
				val.transform.SetParent(parent.transform, false);
			}
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = sizeDelta;
			return val;
		}

		internal static void SetDefaultTextValues(Text text)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)text).color = defaultTextColor;
			text.font = UniversalUI.DefaultFont;
			text.fontSize = 14;
		}

		internal static void SetDefaultSelectableValues(Selectable selectable)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			Navigation navigation = selectable.navigation;
			((Navigation)(ref navigation)).mode = (Mode)4;
			selectable.navigation = navigation;
			RuntimeHelper.Instance.Internal_SetColorBlock(selectable, (Color?)new Color(0.2f, 0.2f, 0.2f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)new Color(0.15f, 0.15f, 0.15f), (Color?)null);
		}

		public static LayoutElement SetLayoutElement(GameObject gameObject, int? minWidth = null, int? minHeight = null, int? flexibleWidth = null, int? flexibleHeight = null, int? preferredWidth = null, int? preferredHeight = null, bool? ignoreLayout = null)
		{
			LayoutElement val = gameObject.GetComponent<LayoutElement>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<LayoutElement>();
			}
			if (minWidth.HasValue)
			{
				val.minWidth = minWidth.Value;
			}
			if (minHeight.HasValue)
			{
				val.minHeight = minHeight.Value;
			}
			if (flexibleWidth.HasValue)
			{
				val.flexibleWidth = flexibleWidth.Value;
			}
			if (flexibleHeight.HasValue)
			{
				val.flexibleHeight = flexibleHeight.Value;
			}
			if (preferredWidth.HasValue)
			{
				val.preferredWidth = preferredWidth.Value;
			}
			if (preferredHeight.HasValue)
			{
				val.preferredHeight = preferredHeight.Value;
			}
			if (ignoreLayout.HasValue)
			{
				val.ignoreLayout = ignoreLayout.Value;
			}
			return val;
		}

		public static T SetLayoutGroup<T>(GameObject gameObject, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			T val = gameObject.GetComponent<T>();
			if (!Object.op_Implicit((Object)(object)val))
			{
				val = gameObject.AddComponent<T>();
			}
			return SetLayoutGroup(val, forceWidth, forceHeight, childControlWidth, childControlHeight, spacing, padTop, padBottom, padLeft, padRight, childAlignment);
		}

		public static T SetLayoutGroup<T>(T group, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup
		{
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			if (forceWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandWidth = forceWidth.Value;
			}
			if (forceHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childForceExpandHeight = forceHeight.Value;
			}
			if (childControlWidth.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlWidth(childControlWidth.Value);
			}
			if (childControlHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlHeight(childControlHeight.Value);
			}
			if (spacing.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).spacing = spacing.Value;
			}
			if (padTop.HasValue)
			{
				((LayoutGroup)(object)group).padding.top = padTop.Value;
			}
			if (padBottom.HasValue)
			{
				((LayoutGroup)(object)group).padding.bottom = padBottom.Value;
			}
			if (padLeft.HasValue)
			{
				((LayoutGroup)(object)group).padding.left = padLeft.Value;
			}
			if (padRight.HasValue)
			{
				((LayoutGroup)(object)group).padding.right = padRight.Value;
			}
			if (childAlignment.HasValue)
			{
				((LayoutGroup)(object)group).childAlignment = childAlignment.Value;
			}
			return group;
		}

		public static GameObject CreatePanel(string name, GameObject parent, out GameObject contentHolder, Color? bgColor = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)1, (int?)1, (int?)1, (int?)1, (TextAnchor?)null);
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.anchoredPosition = Vector2.zero;
			component.sizeDelta = Vector2.zero;
			((Graphic)val.AddComponent<Image>()).color = Color.black;
			val.AddComponent<RectMask2D>();
			contentHolder = CreateUIObject("Content", val);
			Image val2 = contentHolder.AddComponent<Image>();
			val2.type = (Type)3;
			((Graphic)val2).color = (Color)((!bgColor.HasValue) ? new Color(0.07f, 0.07f, 0.07f) : bgColor.Value);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(contentHolder, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)3, (int?)3, (int?)3, (int?)3, (int?)3, (TextAnchor?)null);
			return val;
		}

		public static GameObject CreateVerticalGroup(GameObject parent, string name, bool forceWidth, bool forceHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)forceWidth, (bool?)forceHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment);
			Image val2 = val.AddComponent<Image>();
			((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static GameObject CreateHorizontalGroup(GameObject parent, string name, bool forceExpandWidth, bool forceExpandHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)forceExpandWidth, (bool?)forceExpandHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment);
			Image val2 = val.AddComponent<Image>();
			((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static GameObject CreateGridGroup(GameObject parent, string name, Vector2 cellSize, Vector2 spacing, Color bgColor = default(Color))
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			GridLayoutGroup val2 = val.AddComponent<GridLayoutGroup>();
			((LayoutGroup)val2).childAlignment = (TextAnchor)0;
			val2.cellSize = cellSize;
			val2.spacing = spacing;
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor);
			return val;
		}

		public static Text CreateLabel(GameObject parent, string name, string defaultText, TextAnchor alignment = 3, Color color = default(Color), bool supportRichText = true, int fontSize = 14)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			Text val2 = val.AddComponent<Text>();
			SetDefaultTextValues(val2);
			val2.text = defaultText;
			((Graphic)val2).color = ((color == default(Color)) ? defaultTextColor : color);
			val2.supportRichText = supportRichText;
			val2.alignment = alignment;
			val2.fontSize = fontSize;
			return val2;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, Color? normalColor = null)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			Color valueOrDefault = normalColor.GetValueOrDefault();
			if (!normalColor.HasValue)
			{
				((Color)(ref valueOrDefault))..ctor(0.25f, 0.25f, 0.25f);
				normalColor = valueOrDefault;
			}
			ButtonRef buttonRef = CreateButton(parent, name, text, default(ColorBlock));
			RuntimeHelper instance = RuntimeHelper.Instance;
			Button component = buttonRef.Component;
			Color? normal = normalColor;
			Color? val = normalColor;
			float num = 1.2f;
			Color? highlighted = (val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null);
			val = normalColor;
			num = 0.7f;
			instance.Internal_SetColorBlock((Selectable)(object)component, normal, highlighted, val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null);
			return buttonRef;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, ColorBlock colors)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Text", val);
			Image val3 = val.AddComponent<Image>();
			val3.type = (Type)1;
			((Graphic)val3).color = new Color(1f, 1f, 1f, 1f);
			Button val4 = val.AddComponent<Button>();
			SetDefaultSelectableValues((Selectable)(object)val4);
			((ColorBlock)(ref colors)).colorMultiplier = 1f;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val4, colors);
			Text val5 = val2.AddComponent<Text>();
			val5.text = text;
			SetDefaultTextValues(val5);
			val5.alignment = (TextAnchor)4;
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.sizeDelta = Vector2.zero;
			SetButtonDeselectListener(val4);
			return new ButtonRef(val4);
		}

		internal static void SetButtonDeselectListener(Button button)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Expected O, but got Unknown
			((UnityEvent)button.onClick).AddListener((UnityAction)delegate
			{
				((Selectable)button).OnDeselect((BaseEventData)null);
			});
		}

		public static GameObject CreateSlider(GameObject parent, string name, out Slider slider)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Unknown result type (might be due to invalid IL or missing references)
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Background", val);
			GameObject val3 = CreateUIObject("Fill Area", val);
			GameObject val4 = CreateUIObject("Fill", val3);
			GameObject val5 = CreateUIObject("Handle Slide Area", val);
			GameObject val6 = CreateUIObject("Handle", val5);
			Image val7 = val2.AddComponent<Image>();
			val7.type = (Type)1;
			((Graphic)val7).color = new Color(0.15f, 0.15f, 0.15f, 1f);
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0.25f);
			component.anchorMax = new Vector2(1f, 0.75f);
			component.sizeDelta = new Vector2(0f, 0f);
			RectTransform component2 = val3.GetComponent<RectTransform>();
			component2.anchorMin = new Vector2(0f, 0.25f);
			component2.anchorMax = new Vector2(1f, 0.75f);
			component2.anchoredPosition = new Vector2(-5f, 0f);
			component2.sizeDelta = new Vector2(-20f, 0f);
			Image val8 = val4.AddComponent<Image>();
			val8.type = (Type)1;
			((Graphic)val8).color = new Color(0.3f, 0.3f, 0.3f, 1f);
			val4.GetComponent<RectTransform>().sizeDelta = new Vector2(10f, 0f);
			RectTransform component3 = val5.GetComponent<RectTransform>();
			component3.sizeDelta = new Vector2(-20f, 0f);
			component3.anchorMin = new Vector2(0f, 0f);
			component3.anchorMax = new Vector2(1f, 1f);
			Image val9 = val6.AddComponent<Image>();
			((Graphic)val9).color = new Color(0.5f, 0.5f, 0.5f, 1f);
			val6.GetComponent<RectTransform>().sizeDelta = new Vector2(20f, 0f);
			slider = val.AddComponent<Slider>();
			slider.fillRect = val4.GetComponent<RectTransform>();
			slider.handleRect = val6.GetComponent<RectTransform>();
			((Selectable)slider).targetGraphic = (Graphic)(object)val9;
			slider.direction = (Direction)0;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)slider, (Color?)new Color(0.4f, 0.4f, 0.4f), (Color?)new Color(0.55f, 0.55f, 0.55f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)null);
			return val;
		}

		public static GameObject CreateScrollbar(GameObject parent, string name, out Scrollbar scrollbar)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Sliding Area", val);
			GameObject val3 = CreateUIObject("Handle", val2);
			Image val4 = val.AddComponent<Image>();
			val4.type = (Type)1;
			((Graphic)val4).color = new Color(0.1f, 0.1f, 0.1f);
			Image val5 = val3.AddComponent<Image>();
			val5.type = (Type)1;
			((Graphic)val5).color = new Color(0.4f, 0.4f, 0.4f);
			RectTransform component = val2.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(-20f, -20f);
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			RectTransform component2 = val3.GetComponent<RectTransform>();
			component2.sizeDelta = new Vector2(20f, 20f);
			scrollbar = val.AddComponent<Scrollbar>();
			scrollbar.handleRect = component2;
			((Selectable)scrollbar).targetGraphic = (Graphic)(object)val5;
			SetDefaultSelectableValues((Selectable)(object)scrollbar);
			return val;
		}

		public static GameObject CreateToggle(GameObject parent, string name, out Toggle toggle, out Text text, Color bgColor = default(Color), int checkWidth = 20, int checkHeight = 20)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)(TextAnchor)3);
			toggle = val.AddComponent<Toggle>();
			toggle.isOn = true;
			SetDefaultSelectableValues((Selectable)(object)toggle);
			Toggle t2 = toggle;
			((UnityEvent<bool>)(object)toggle.onValueChanged).AddListener((UnityAction<bool>)delegate
			{
				((Selectable)t2).OnDeselect((BaseEventData)null);
			});
			GameObject val2 = CreateUIObject("Background", val);
			Image val3 = val2.AddComponent<Image>();
			((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.04f, 0.04f, 0.04f, 0.75f) : bgColor);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val2, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)2, (int?)2, (int?)2, (int?)2, (TextAnchor?)null);
			SetLayoutElement(val2, checkWidth, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0);
			GameObject val4 = CreateUIObject("Checkmark", val2);
			Image val5 = val4.AddComponent<Image>();
			((Graphic)val5).color = new Color(0.8f, 1f, 0.8f, 0.3f);
			GameObject val6 = CreateUIObject("Label", val);
			text = val6.AddComponent<Text>();
			text.text = "";
			text.alignment = (TextAnchor)3;
			SetDefaultTextValues(text);
			SetLayoutElement(val6, 0, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0);
			toggle.graphic = (Graphic)(object)val5;
			((Selectable)toggle).targetGraphic = (Graphic)(object)val3;
			return val;
		}

		public static InputFieldRef CreateInputField(GameObject parent, string name, string placeHolderText)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015c: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_021a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_0289: Unknown result type (might be due to invalid IL or missing references)
			//IL_0296: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			Image val2 = val.AddComponent<Image>();
			val2.type = (Type)1;
			((Graphic)val2).color = new Color(0f, 0f, 0f, 0.5f);
			InputField val3 = val.AddComponent<InputField>();
			Navigation navigation = ((Selectable)val3).navigation;
			((Navigation)(ref navigation)).mode = (Mode)0;
			((Selectable)val3).navigation = navigation;
			val3.lineType = (LineType)0;
			((Selectable)val3).interactable = true;
			((Selectable)val3).transition = (Transition)1;
			((Selectable)val3).targetGraphic = (Graphic)(object)val2;
			RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val3, (Color?)new Color(1f, 1f, 1f, 1f), (Color?)new Color(0.95f, 0.95f, 0.95f, 1f), (Color?)new Color(0.78f, 0.78f, 0.78f, 1f), (Color?)null);
			GameObject val4 = CreateUIObject("TextArea", val);
			val4.AddComponent<RectMask2D>();
			RectTransform component = val4.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.offsetMin = Vector2.zero;
			component.offsetMax = Vector2.zero;
			GameObject val5 = CreateUIObject("Placeholder", val4);
			Text val6 = val5.AddComponent<Text>();
			SetDefaultTextValues(val6);
			val6.text = placeHolderText ?? "...";
			((Graphic)val6).color = new Color(0.5f, 0.5f, 0.5f, 1f);
			val6.horizontalOverflow = (HorizontalWrapMode)0;
			val6.alignment = (TextAnchor)3;
			val6.fontSize = 14;
			RectTransform component2 = val5.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.zero;
			component2.anchorMax = Vector2.one;
			component2.offsetMin = Vector2.zero;
			component2.offsetMax = Vector2.zero;
			val3.placeholder = (Graphic)(object)val6;
			GameObject val7 = CreateUIObject("Text", val4);
			Text val8 = val7.AddComponent<Text>();
			SetDefaultTextValues(val8);
			val8.text = "";
			((Graphic)val8).color = new Color(1f, 1f, 1f, 1f);
			val8.horizontalOverflow = (HorizontalWrapMode)0;
			val8.alignment = (TextAnchor)3;
			val8.fontSize = 14;
			RectTransform component3 = val7.GetComponent<RectTransform>();
			component3.anchorMin = Vector2.zero;
			component3.anchorMax = Vector2.one;
			component3.offsetMin = Vector2.zero;
			component3.offsetMax = Vector2.zero;
			val3.textComponent = val8;
			val3.characterLimit = 16000;
			return new InputFieldRef(val3);
		}

		public static GameObject CreateDropdown(GameObject parent, string name, out Dropdown dropdown, string defaultItemText, int itemFontSize, Action<int> onValueChanged, string[] defaultOptions = null)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Unknown result type (might be due to invalid IL or missing references)
			//IL_027e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be du