Decompiled source of ClientUI v0.3.4

XPRising.ClientUI.dll

Decompiled 12 hours ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using Bloodstone.API;
using Bloodstone.Hooks;
using ClientUI.Hooks;
using ClientUI.UI;
using ClientUI.UI.Panel;
using ClientUI.UI.Util;
using ClientUI.UniverseLib.UI;
using ClientUI.UniverseLib.UI.Models;
using ClientUI.UniverseLib.UI.ObjectPool;
using ClientUI.UniverseLib.UI.Panels;
using ClientUI.UniverseLib.UI.Widgets;
using ClientUI.UniverseLib.UI.Widgets.ScrollView;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppSystem;
using Microsoft.CodeAnalysis;
using ProjectM;
using ProjectM.UI;
using TMPro;
using Unity.Entities;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;
using XPShared;
using XPShared.BloodstoneExtensions;
using XPShared.Transport;
using XPShared.Transport.Messages;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("XPRising.ClientUI")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.3.4.0")]
[assembly: AssemblyInformationalVersion("0.3.4+1.Branch.main.Sha.cc4004fabbd61aa88089f9eaf54b839fcb80fcc5.cc4004fabbd61aa88089f9eaf54b839fcb80fcc5")]
[assembly: AssemblyProduct("XPRising.ClientUI")]
[assembly: AssemblyTitle("XPRising.ClientUI")]
[assembly: AssemblyVersion("0.3.4.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ClientUI
{
	[BepInPlugin("XPRising.ClientUI", "XPRising.ClientUI", "0.3.4")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BasePlugin
	{
		private static ManualLogSource _logger;

		internal static bool LoadUI;

		private static FrameTimer _uiInitialisedTimer;

		private static FrameTimer _connectUiTimer;

		private static Harmony _harmonyBootPatch;

		private static Harmony _harmonyCanvasPatch;

		private static Harmony _harmonyMenuPatch;

		internal static Harmony _harmonyVersionStringPatch;

		internal static Plugin Instance { get; private set; }

		public override void Load()
		{
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: Expected O, but got Unknown
			Instance = this;
			_logger = ((BasePlugin)this).Log;
			if (VWorld.IsServer)
			{
				Log((LogLevel)4, "Plugin XPRising.ClientUI is a client plugin only. Not continuing to load on server.");
				return;
			}
			UIManager.Initialize();
			_harmonyBootPatch = Harmony.CreateAndPatchAll(typeof(GameManangerPatch), (string)null);
			_harmonyMenuPatch = Harmony.CreateAndPatchAll(typeof(EscapeMenuPatch), (string)null);
			_harmonyCanvasPatch = Harmony.CreateAndPatchAll(typeof(UICanvasSystemPatch), (string)null);
			_harmonyVersionStringPatch = Harmony.CreateAndPatchAll(typeof(VersionStringPatch), (string)null);
			_connectUiTimer = new FrameTimer();
			_connectUiTimer.Initialise((Action)delegate
			{
				Utils.SendClientInitialisation();
				Log((LogLevel)16, "Sending client initialisation...");
			}, TimeSpan.FromSeconds(1.0), false);
			MessageUtils.RegisterType<ProgressSerialisedMessage>((Action<ProgressSerialisedMessage>)delegate(ProgressSerialisedMessage message)
			{
				if (UIManager.ContentPanel != null)
				{
					UIManager.ContentPanel.ChangeProgress(message);
				}
				if (LoadUI && UIManager.ContentPanel != null)
				{
					UIManager.SetActive(active: true);
					LoadUI = false;
				}
			});
			MessageUtils.RegisterType<ActionSerialisedMessage>((Action<ActionSerialisedMessage>)delegate(ActionSerialisedMessage message)
			{
				if (UIManager.ContentPanel != null)
				{
					UIManager.ContentPanel.SetButton(message);
				}
				if (LoadUI && UIManager.ContentPanel != null)
				{
					UIManager.SetActive(active: true);
					LoadUI = false;
				}
			});
			MessageUtils.RegisterType<NotificationMessage>((Action<NotificationMessage>)delegate(NotificationMessage message)
			{
				if (UIManager.ContentPanel != null)
				{
					UIManager.ContentPanel.AddMessage(message);
				}
				if (LoadUI && UIManager.ContentPanel != null)
				{
					UIManager.SetActive(active: true);
					LoadUI = false;
				}
			});
			MessageUtils.RegisterType<ConnectedMessage>((Action<ConnectedMessage>)delegate
			{
				_connectUiTimer.Stop();
				Log((LogLevel)16, "Client initialisation successful");
			});
			Log((LogLevel)16, "Plugin XPRising.ClientUI is loaded!");
		}

		public override bool Unload()
		{
			_harmonyBootPatch.UnpatchSelf();
			_harmonyCanvasPatch.UnpatchSelf();
			_harmonyMenuPatch.UnpatchSelf();
			_harmonyVersionStringPatch.UnpatchSelf();
			return true;
		}

		public static void GameDataOnInitialize(World world)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Expected O, but got Unknown
			if (VWorld.IsClient)
			{
				_harmonyBootPatch.UnpatchSelf();
				_uiInitialisedTimer = new FrameTimer();
				_uiInitialisedTimer.Initialise((Action)delegate
				{
					UIManager.OnInitialized();
					_uiInitialisedTimer.Stop();
					Log((LogLevel)32, "UI Manager initialised");
					_connectUiTimer.Start();
				}, TimeSpan.FromSeconds(5.0), true).Start();
			}
		}

		private static void GameDataOnDestroy()
		{
		}

		public static void Log(LogLevel level, string message)
		{
			//IL_0005: 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_000b: 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: Expected O, but got Unknown
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			ManualLogSource logger = _logger;
			bool flag = default(bool);
			BepInExLogInterpolatedStringHandler val = new BepInExLogInterpolatedStringHandler(2, 2, level, ref flag);
			if (flag)
			{
				val.AppendFormatted<DateTime>(DateTime.Now, "u");
				val.AppendLiteral(": ");
				val.AppendFormatted<string>(message);
			}
			logger.Log(level, val);
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "XPRising.ClientUI";

		public const string PLUGIN_NAME = "XPRising.ClientUI";

		public const string PLUGIN_VERSION = "0.3.4";
	}
}
namespace ClientUI.UniverseLib.UI
{
	public static class CoroutineUtility
	{
		private static ConcurrentBag<IEnumerator> _nextFrameRoutines = new ConcurrentBag<IEnumerator>();

		private static ConcurrentBag<IEnumerator> _thisFrameRoutines = new ConcurrentBag<IEnumerator>();

		public static void StartCoroutine(IEnumerator coroutine)
		{
			_nextFrameRoutines.Add(coroutine);
		}

		public static void TickRoutines()
		{
			ConcurrentBag<IEnumerator> nextFrameRoutines = _nextFrameRoutines;
			ConcurrentBag<IEnumerator> thisFrameRoutines = _thisFrameRoutines;
			_thisFrameRoutines = nextFrameRoutines;
			_nextFrameRoutines = thisFrameRoutines;
			while (!_thisFrameRoutines.IsEmpty)
			{
				if (_thisFrameRoutines.TryTake(out var result) && result.MoveNext())
				{
					_nextFrameRoutines.Add(result);
				}
			}
		}
	}
	public static class Il2CppExtensions
	{
		public static void AddListener(this UnityEvent action, Action listener)
		{
			action.AddListener(UnityAction.op_Implicit(listener));
		}

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

		public static void RemoveListener(this UnityEvent action, Action listener)
		{
			action.RemoveListener(UnityAction.op_Implicit(listener));
		}

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

		public static void SetChildControlHeight(this HorizontalOrVerticalLayoutGroup group, bool value)
		{
			group.childControlHeight = value;
		}

		public static void SetChildControlWidth(this HorizontalOrVerticalLayoutGroup group, bool value)
		{
			group.childControlWidth = value;
		}
	}
	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 CanvasScaler Scaler { get; }

		public Action UpdateMethod { get; }

		public PanelManager Panels { get; }

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

		public UIBase(string id, Action updateMethod)
		{
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: 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_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: 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)0;
			Canvas.referencePixelsPerUnit = 100f;
			Canvas.sortingOrder = TOP_SORTORDER;
			Canvas.overrideSorting = true;
			Scaler = RootObject.AddComponent<CanvasScaler>();
			Scaler.referenceResolution = UniversalUI.CanvasDimensions;
			Scaler.uiScaleMode = (ScaleMode)1;
			Scaler.screenMatchMode = (ScreenMatchMode)0;
			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 value)
			{
				Plugin.Log((LogLevel)4, $"Exception invoking update method for {ID}: {value}");
			}
		}
	}
	public static class UIFactory
	{
		internal static Vector2 largeElementSize = new Vector2(100f, 30f);

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

		internal static Vector2 outlineDistance = new Vector2(2f, 2f);

		public static GameObject PlayerHUDCanvas { get; set; }

		public static TMP_FontAsset Font { get; set; }

		public static Material FontMaterial { get; set; }

		public static GameObject CreateUIObject(string name, GameObject parent, Vector2 sizeDelta = default(Vector2))
		{
			//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_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_0036: 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);
			}
			val.AddComponent<RectTransform>().sizeDelta = sizeDelta;
			return val;
		}

		internal static void SetDefaultTextValues(TextMeshProUGUI text)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			((Graphic)text).color = Colour.DefaultText;
			((TMP_Text)text).font = Font;
			((TMP_Text)text).fontSize = 14f;
		}

		internal static void SetDefaultSelectableValues(Selectable selectable)
		{
			//IL_0017: 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_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007b: 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)
			Navigation navigation = selectable.navigation;
			navigation.mode = (Mode)4;
			selectable.navigation = navigation;
			ColorBlock val = default(ColorBlock);
			((ColorBlock)(ref val)).normalColor = new Color(0.2f, 0.2f, 0.2f);
			((ColorBlock)(ref val)).highlightedColor = new Color(0.3f, 0.3f, 0.3f);
			((ColorBlock)(ref val)).pressedColor = new Color(0.15f, 0.15f, 0.15f);
			((ColorBlock)(ref val)).colorMultiplier = 1f;
			ColorBlock colors = val;
			selectable.colors = colors;
		}

		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_0119: 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)group).childControlWidth = childControlWidth.Value;
			}
			if (childControlHeight.HasValue)
			{
				((HorizontalOrVerticalLayoutGroup)group).childControlHeight = 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_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_006d: 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_0083: 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_00a0: 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_0126: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: 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_0142: 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?)null, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.anchoredPosition = Vector2.zero;
			component.sizeDelta = Vector2.zero;
			contentHolder = CreateUIObject("Content", val);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(contentHolder, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			Image obj = contentHolder.AddComponent<Image>();
			obj.type = (Type)3;
			((Graphic)obj).color = (Color)(((??)bgColor) ?? Colour.DarkBackground);
			Outline obj2 = contentHolder.AddComponent<Outline>();
			((Shadow)obj2).effectColor = Colour.DarkBackground;
			((Shadow)obj2).effectDistance = outlineDistance;
			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 = null, TextAnchor? childAlignment = null)
		{
			//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_0032: 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_0059: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(obj, (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);
			((Graphic)obj.AddComponent<Image>()).color = (Color)(((??)bgColor) ?? Colour.PanelBackground);
			return obj;
		}

		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 = null, TextAnchor? childAlignment = null)
		{
			//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_0032: 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_0059: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			GameObject obj = CreateUIObject(name, parent);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(obj, (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);
			((Graphic)obj.AddComponent<Image>()).color = (Color)(((??)bgColor) ?? Colour.PanelBackground);
			return obj;
		}

		public static GameObject CreateGridGroup(GameObject parent, string name, Vector2 cellSize, Vector2 spacing, Color? bgColor = null)
		{
			//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_001e: 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_0045: 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)
			GameObject obj = CreateUIObject(name, parent);
			GridLayoutGroup obj2 = obj.AddComponent<GridLayoutGroup>();
			((LayoutGroup)obj2).childAlignment = (TextAnchor)0;
			obj2.cellSize = cellSize;
			obj2.spacing = spacing;
			((Graphic)obj.AddComponent<Image>()).color = (Color)(((??)bgColor) ?? Colour.PanelBackground);
			return obj;
		}

		public static TextMeshProUGUI CreateLabel(GameObject parent, string name, string defaultText, TextAlignmentOptions alignment = 514, Color? color = null, int fontSize = 14)
		{
			//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_002c: 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)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: 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)
			TextMeshProUGUI val = CreateUIObject(name, parent).AddComponent<TextMeshProUGUI>();
			((Graphic)val).color = (Color)(((??)color) ?? Colour.DefaultText);
			((TMP_Text)val).font = Font;
			((TMP_Text)val).text = defaultText;
			((TMP_Text)val).alignment = alignment;
			((TMP_Text)val).fontSize = fontSize;
			try
			{
				((TMP_Text)val).outlineWidth = 0.15f;
				((TMP_Text)val).outlineColor = Color32.op_Implicit(Color.black);
			}
			catch (Exception)
			{
			}
			return val;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, Color? normalColor = null)
		{
			//IL_0014: 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_0019: 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_0024: 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_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: 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)
			//IL_0062: 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_007e: 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_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: 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 = (Color)(((??)normalColor) ?? Colour.SliderFill);
			ColorBlock val2 = default(ColorBlock);
			((ColorBlock)(ref val2)).normalColor = val;
			((ColorBlock)(ref val2)).highlightedColor = val * 1.2f;
			((ColorBlock)(ref val2)).selectedColor = val * 1.1f;
			((ColorBlock)(ref val2)).pressedColor = val * 0.7f;
			((ColorBlock)(ref val2)).disabledColor = val * 0.4f;
			((ColorBlock)(ref val2)).colorMultiplier = 1f;
			ColorBlock colors = val2;
			val2 = default(ColorBlock);
			ButtonRef buttonRef = CreateButton(parent, name, text, val2);
			((Selectable)buttonRef.Component).colors = colors;
			return buttonRef;
		}

		public static ButtonRef CreateButton(GameObject parent, string name, string text, ColorBlock colors)
		{
			//IL_0002: 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_001b: 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_0040: 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_006d: 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)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject val2 = CreateUIObject("Text", val);
			Image obj = val.AddComponent<Image>();
			obj.type = (Type)1;
			((Graphic)obj).color = Color.white;
			Outline obj2 = val.AddComponent<Outline>();
			((Shadow)obj2).effectColor = Colour.DarkBackground;
			((Shadow)obj2).effectDistance = outlineDistance;
			Button obj3 = val.AddComponent<Button>();
			SetDefaultSelectableValues((Selectable)(object)obj3);
			((ColorBlock)(ref colors)).colorMultiplier = 1f;
			((Selectable)obj3).colors = colors;
			TextMeshProUGUI obj4 = val2.AddComponent<TextMeshProUGUI>();
			((TMP_Text)obj4).text = text;
			SetDefaultTextValues(obj4);
			((TMP_Text)obj4).alignment = (TextAlignmentOptions)514;
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.sizeDelta = Vector2.zero;
			SetButtonDeselectListener(obj3);
			return new ButtonRef(obj3);
		}

		internal static void SetButtonDeselectListener(Button button)
		{
			((UnityEvent)(object)button.onClick).AddListener(delegate
			{
				((Selectable)button).OnDeselect((BaseEventData)null);
			});
		}

		public static GameObject CreateSlider(GameObject parent, string name, out Slider slider)
		{
			//IL_0002: 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_001b: 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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: 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)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: 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_00cb: 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_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: 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_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0185: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_023b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0272: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, smallElementSize);
			GameObject obj = CreateUIObject("Background", val);
			GameObject val2 = CreateUIObject("Fill Area", val);
			GameObject val3 = CreateUIObject("Fill", val2);
			GameObject val4 = CreateUIObject("Handle Slide Area", val);
			GameObject val5 = CreateUIObject("Handle", val4);
			Image obj2 = obj.AddComponent<Image>();
			obj2.type = (Type)1;
			((Graphic)obj2).color = Colour.PanelBackground;
			RectTransform component = obj.GetComponent<RectTransform>();
			component.anchorMin = new Vector2(0f, 0.25f);
			component.anchorMax = new Vector2(1f, 0.75f);
			component.sizeDelta = new Vector2(0f, 0f);
			RectTransform component2 = val2.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 obj3 = val3.AddComponent<Image>();
			obj3.type = (Type)1;
			((Graphic)obj3).color = Colour.SliderFill;
			val3.GetComponent<RectTransform>().sizeDelta = new Vector2(10f, 0f);
			RectTransform component3 = val4.GetComponent<RectTransform>();
			component3.sizeDelta = new Vector2(-20f, 0f);
			component3.anchorMin = new Vector2(0f, 0f);
			component3.anchorMax = new Vector2(1f, 1f);
			Image val6 = val5.AddComponent<Image>();
			((Graphic)val6).color = Colour.SliderHandle;
			val5.GetComponent<RectTransform>().sizeDelta = new Vector2(20f, 0f);
			slider = val.AddComponent<Slider>();
			slider.fillRect = val3.GetComponent<RectTransform>();
			slider.handleRect = val5.GetComponent<RectTransform>();
			((Selectable)slider).targetGraphic = (Graphic)(object)val6;
			slider.direction = (Direction)0;
			ColorBlock val7 = default(ColorBlock);
			((ColorBlock)(ref val7)).normalColor = new Color(0.4f, 0.4f, 0.4f);
			((ColorBlock)(ref val7)).highlightedColor = new Color(0.55f, 0.55f, 0.55f);
			((ColorBlock)(ref val7)).pressedColor = new Color(0.3f, 0.3f, 0.3f);
			((ColorBlock)(ref val7)).colorMultiplier = 1f;
			ColorBlock colors = val7;
			((Selectable)slider).colors = colors;
			return val;
		}

		public static GameObject CreateScrollbar(GameObject parent, string name, out Scrollbar scrollbar)
		{
			//IL_0002: 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_001b: 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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: 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_0079: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: 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 obj = CreateUIObject("Handle", val2);
			Image obj2 = val.AddComponent<Image>();
			obj2.type = (Type)1;
			((Graphic)obj2).color = Colour.DarkBackground;
			Image val3 = obj.AddComponent<Image>();
			val3.type = (Type)1;
			((Graphic)val3).color = Colour.SliderHandle;
			RectTransform component = val2.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(-20f, -20f);
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			RectTransform component2 = obj.GetComponent<RectTransform>();
			component2.sizeDelta = new Vector2(20f, 20f);
			scrollbar = val.AddComponent<Scrollbar>();
			scrollbar.handleRect = component2;
			((Selectable)scrollbar).targetGraphic = (Graphic)(object)val3;
			SetDefaultSelectableValues((Selectable)(object)scrollbar);
			return val;
		}

		public static GameObject CreateToggle(GameObject parent, string name, out Toggle toggle, out TextMeshProUGUI text, Color bgColor = default(Color), int checkWidth = 20, int checkHeight = 20)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: 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_00ab: 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_00b5: 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_00be: 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_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_0174: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Unknown result type (might be due to invalid IL or missing references)
			//IL_018c: 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<bool>(delegate
			{
				((Selectable)t2).OnDeselect((BaseEventData)null);
			});
			GameObject val2 = CreateUIObject("Background", val);
			Image val3 = val2.AddComponent<Image>();
			((Graphic)val3).color = ((bgColor == default(Color)) ? Colour.DarkBackground : 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);
			Image val4 = CreateUIObject("Checkmark", val2).AddComponent<Image>();
			((Graphic)val4).color = Colour.CheckMark;
			GameObject val5 = CreateUIObject("Label", val);
			text = val5.AddComponent<TextMeshProUGUI>();
			((TMP_Text)text).text = "";
			((TMP_Text)text).alignment = (TextAlignmentOptions)4097;
			SetDefaultTextValues(text);
			SetLayoutElement(val5, 0, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0);
			toggle.graphic = (Graphic)(object)val4;
			((Selectable)toggle).targetGraphic = (Graphic)(object)val3;
			return val;
		}

		public static InputFieldRef CreateInputField(GameObject parent, string name, string placeHolderText)
		{
			//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_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: 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_00a0: 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_00d6: 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_00da: 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_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: 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_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: 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_0140: 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_0199: 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_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_022e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_0244: Unknown result type (might be due to invalid IL or missing references)
			//IL_024e: 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 = Colour.DarkBackground;
			TMP_InputField obj = val.AddComponent<TMP_InputField>();
			Navigation navigation = ((Selectable)obj).navigation;
			navigation.mode = (Mode)0;
			((Selectable)obj).navigation = navigation;
			obj.lineType = (LineType)0;
			((Selectable)obj).interactable = true;
			((Selectable)obj).transition = (Transition)1;
			((Selectable)obj).targetGraphic = (Graphic)(object)val2;
			ColorBlock val3 = default(ColorBlock);
			((ColorBlock)(ref val3)).normalColor = new Color(1f, 1f, 1f, 1f);
			((ColorBlock)(ref val3)).highlightedColor = new Color(0.95f, 0.95f, 0.95f, 1f);
			((ColorBlock)(ref val3)).pressedColor = new Color(0.78f, 0.78f, 0.78f, 1f);
			((ColorBlock)(ref val3)).colorMultiplier = 1f;
			ColorBlock colors = val3;
			((Selectable)obj).colors = colors;
			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 obj2 = CreateUIObject("Placeholder", val4);
			TextMeshProUGUI val5 = obj2.AddComponent<TextMeshProUGUI>();
			SetDefaultTextValues(val5);
			((TMP_Text)val5).text = placeHolderText ?? "...";
			((Graphic)val5).color = Colour.PlaceHolderText;
			((TMP_Text)val5).enableWordWrapping = true;
			((TMP_Text)val5).alignment = (TextAlignmentOptions)4097;
			((TMP_Text)val5).fontSize = 14f;
			RectTransform component2 = obj2.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.zero;
			component2.anchorMax = Vector2.one;
			component2.offsetMin = Vector2.zero;
			component2.offsetMax = Vector2.zero;
			obj.placeholder = (Graphic)(object)val5;
			GameObject obj3 = CreateUIObject("Text", val4);
			TextMeshProUGUI val6 = obj3.AddComponent<TextMeshProUGUI>();
			SetDefaultTextValues(val6);
			((TMP_Text)val6).text = "";
			((Graphic)val6).color = Colour.DefaultText;
			((TMP_Text)val6).enableWordWrapping = true;
			((TMP_Text)val6).alignment = (TextAlignmentOptions)4097;
			((TMP_Text)val6).fontSize = 14f;
			RectTransform component3 = obj3.GetComponent<RectTransform>();
			component3.anchorMin = Vector2.zero;
			component3.anchorMax = Vector2.one;
			component3.offsetMin = Vector2.zero;
			component3.offsetMax = Vector2.zero;
			obj.textComponent = (TMP_Text)(object)val6;
			obj.characterLimit = 16000;
			return new InputFieldRef(obj);
		}

		public static GameObject CreateDropdown(GameObject parent, string name, out TMP_Dropdown dropdown, string defaultItemText, int itemFontSize, Action<int> onValueChanged, string[] defaultOptions = null)
		{
			//IL_0008: 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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: 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)
			//IL_005b: 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_0071: 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_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: 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_00a7: 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_00bf: 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_00d6: 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_010e: 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_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: 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_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_024e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0280: Unknown result type (might be due to invalid IL or missing references)
			//IL_029c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_030c: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0413: Unknown result type (might be due to invalid IL or missing references)
			//IL_0427: Unknown result type (might be due to invalid IL or missing references)
			//IL_0442: Unknown result type (might be due to invalid IL or missing references)
			//IL_0457: Unknown result type (might be due to invalid IL or missing references)
			//IL_046c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0481: Unknown result type (might be due to invalid IL or missing references)
			//IL_0495: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_04da: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_050a: Unknown result type (might be due to invalid IL or missing references)
			//IL_051f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0534: Unknown result type (might be due to invalid IL or missing references)
			//IL_0549: Unknown result type (might be due to invalid IL or missing references)
			//IL_055d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0579: Unknown result type (might be due to invalid IL or missing references)
			//IL_058e: Unknown result type (might be due to invalid IL or missing references)
			//IL_05a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_05bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_05db: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_05fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_060f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0654: Unknown result type (might be due to invalid IL or missing references)
			//IL_065e: Expected O, but got Unknown
			GameObject val = CreateUIObject(name, parent, largeElementSize);
			GameObject obj = CreateUIObject("Label", val);
			GameObject obj2 = CreateUIObject("Arrow", val);
			GameObject val2 = CreateUIObject("Template", val);
			GameObject val3 = CreateUIObject("Viewport", val2);
			GameObject val4 = CreateUIObject("Content", val3);
			GameObject val5 = CreateUIObject("Item", val4);
			GameObject val6 = CreateUIObject("Item Background", val5);
			CreateUIObject("Item Checkmark", val5);
			GameObject val7 = CreateUIObject("Item Label", val5);
			Scrollbar scrollbar;
			GameObject obj3 = CreateScrollbar(val2, "DropdownScroll", out scrollbar);
			scrollbar.SetDirection((Direction)2, true);
			ColorBlock val8 = default(ColorBlock);
			((ColorBlock)(ref val8)).normalColor = new Color(0.45f, 0.45f, 0.45f);
			((ColorBlock)(ref val8)).highlightedColor = new Color(0.6f, 0.6f, 0.6f);
			((ColorBlock)(ref val8)).pressedColor = new Color(0.4f, 0.4f, 0.4f);
			((ColorBlock)(ref val8)).colorMultiplier = 1f;
			ColorBlock colors = val8;
			((Selectable)scrollbar).colors = colors;
			RectTransform component = obj3.GetComponent<RectTransform>();
			component.anchorMin = Vector2.right;
			component.anchorMax = Vector2.one;
			component.pivot = Vector2.one;
			component.sizeDelta = new Vector2(component.sizeDelta.x, 0f);
			TextMeshProUGUI val9 = val7.AddComponent<TextMeshProUGUI>();
			SetDefaultTextValues(val9);
			((TMP_Text)val9).alignment = (TextAlignmentOptions)4097;
			((TMP_Text)val9).text = defaultItemText;
			((TMP_Text)val9).fontSize = itemFontSize;
			TextMeshProUGUI obj4 = obj2.AddComponent<TextMeshProUGUI>();
			SetDefaultTextValues(obj4);
			((TMP_Text)obj4).text = "▼";
			RectTransform component2 = obj2.GetComponent<RectTransform>();
			component2.anchorMin = new Vector2(1f, 0.5f);
			component2.anchorMax = new Vector2(1f, 0.5f);
			component2.sizeDelta = new Vector2(20f, 20f);
			component2.anchoredPosition = new Vector2(-15f, 0f);
			Image val10 = val6.AddComponent<Image>();
			((Graphic)val10).color = Colour.SliderFill;
			Toggle itemToggle = val5.AddComponent<Toggle>();
			((Selectable)itemToggle).targetGraphic = (Graphic)(object)val10;
			itemToggle.isOn = true;
			val8 = default(ColorBlock);
			((ColorBlock)(ref val8)).normalColor = new Color(0.35f, 0.35f, 0.35f, 1f);
			((ColorBlock)(ref val8)).highlightedColor = new Color(0.25f, 0.55f, 0.25f, 1f);
			((ColorBlock)(ref val8)).colorMultiplier = 1f;
			ColorBlock colors2 = val8;
			((Selectable)itemToggle).colors = colors2;
			((UnityEvent<bool>)(object)itemToggle.onValueChanged).AddListener<bool>(delegate
			{
				((Selectable)itemToggle).OnDeselect((BaseEventData)null);
			});
			Image obj5 = val2.AddComponent<Image>();
			obj5.type = (Type)1;
			((Graphic)obj5).color = Color.black;
			ScrollRect obj6 = val2.AddComponent<ScrollRect>();
			obj6.scrollSensitivity = 35f;
			obj6.content = val4.GetComponent<RectTransform>();
			obj6.viewport = val3.GetComponent<RectTransform>();
			obj6.horizontal = false;
			obj6.movementType = (MovementType)2;
			obj6.verticalScrollbar = scrollbar;
			obj6.verticalScrollbarVisibility = (ScrollbarVisibility)2;
			obj6.verticalScrollbarSpacing = -3f;
			val3.AddComponent<Mask>().showMaskGraphic = false;
			val3.AddComponent<Image>().type = (Type)1;
			TextMeshProUGUI val11 = obj.AddComponent<TextMeshProUGUI>();
			SetDefaultTextValues(val11);
			((TMP_Text)val11).alignment = (TextAlignmentOptions)4097;
			Image val12 = val.AddComponent<Image>();
			((Graphic)val12).color = Colour.DarkBackground;
			val12.type = (Type)1;
			dropdown = val.AddComponent<TMP_Dropdown>();
			((Selectable)dropdown).targetGraphic = (Graphic)(object)val12;
			dropdown.template = val2.GetComponent<RectTransform>();
			dropdown.captionText = (TMP_Text)(object)val11;
			dropdown.itemText = (TMP_Text)(object)val9;
			dropdown.RefreshShownValue();
			RectTransform component3 = obj.GetComponent<RectTransform>();
			component3.anchorMin = Vector2.zero;
			component3.anchorMax = Vector2.one;
			component3.offsetMin = new Vector2(10f, 2f);
			component3.offsetMax = new Vector2(-28f, -2f);
			RectTransform component4 = val2.GetComponent<RectTransform>();
			component4.anchorMin = new Vector2(0f, 0f);
			component4.anchorMax = new Vector2(1f, 0f);
			component4.pivot = new Vector2(0.5f, 1f);
			component4.anchoredPosition = new Vector2(0f, 2f);
			component4.sizeDelta = new Vector2(0f, 150f);
			RectTransform component5 = val3.GetComponent<RectTransform>();
			component5.anchorMin = new Vector2(0f, 0f);
			component5.anchorMax = new Vector2(1f, 1f);
			component5.sizeDelta = new Vector2(-18f, 0f);
			component5.pivot = new Vector2(0f, 1f);
			RectTransform component6 = val4.GetComponent<RectTransform>();
			component6.anchorMin = new Vector2(0f, 1f);
			component6.anchorMax = new Vector2(1f, 1f);
			component6.pivot = new Vector2(0.5f, 1f);
			component6.anchoredPosition = new Vector2(0f, 0f);
			component6.sizeDelta = new Vector2(0f, 28f);
			RectTransform component7 = val5.GetComponent<RectTransform>();
			component7.anchorMin = new Vector2(0f, 0.5f);
			component7.anchorMax = new Vector2(1f, 0.5f);
			component7.sizeDelta = new Vector2(0f, 25f);
			RectTransform component8 = val6.GetComponent<RectTransform>();
			component8.anchorMin = Vector2.zero;
			component8.anchorMax = Vector2.one;
			component8.sizeDelta = Vector2.zero;
			RectTransform component9 = val7.GetComponent<RectTransform>();
			component9.anchorMin = Vector2.zero;
			component9.anchorMax = Vector2.one;
			component9.offsetMin = new Vector2(20f, 1f);
			component9.offsetMax = new Vector2(-10f, -2f);
			val2.SetActive(false);
			if (onValueChanged != null)
			{
				((UnityEvent<int>)(object)dropdown.onValueChanged).AddListener(UnityAction<int>.op_Implicit(onValueChanged));
			}
			if (defaultOptions != null)
			{
				foreach (string text in defaultOptions)
				{
					dropdown.options.Add(new OptionData(text));
				}
			}
			return val;
		}

		public static ScrollPool<T> CreateScrollPool<T>(GameObject parent, string name, out GameObject uiRoot, out GameObject content, Color? bgColor = null) where T : ICell
		{
			//IL_000c: 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_002a: 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_00fb: 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_016b: 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_0195: 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)
			//IL_01c1: 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_01e1: 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_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0212: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_036f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0386: Unknown result type (might be due to invalid IL or missing references)
			//IL_039c: Unknown result type (might be due to invalid IL or missing references)
			//IL_039e: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a2: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent, new Vector2(1f, 1f));
			((Graphic)val.AddComponent<Image>()).color = (Color)(((??)bgColor) ?? Colour.DarkBackground);
			UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)true, (bool?)true, (bool?)true, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			int? flexibleHeight = 9999;
			int? flexibleWidth = 9999;
			SetLayoutElement(val, null, null, flexibleWidth, flexibleHeight);
			GameObject val2 = CreateUIObject("Viewport", val);
			flexibleWidth = 9999;
			flexibleHeight = 9999;
			SetLayoutElement(val2, null, null, flexibleWidth, flexibleHeight);
			RectTransform component = val2.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.pivot = new Vector2(0f, 1f);
			component.sizeDelta = new Vector2(0f, 0f);
			component.offsetMax = new Vector2(-10f, 0f);
			val2.AddComponent<RectMask2D>();
			((Graphic)val2.AddComponent<Image>()).color = Colour.ViewportBackground;
			val2.AddComponent<Mask>();
			content = CreateUIObject("Content", val2);
			RectTransform component2 = content.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.zero;
			component2.anchorMax = Vector2.one;
			component2.pivot = new Vector2(0.5f, 1f);
			component2.sizeDelta = new Vector2(0f, 0f);
			component2.offsetMax = new Vector2(0f, 0f);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(content, (bool?)true, (bool?)false, (bool?)true, (bool?)true, (int?)0, (int?)2, (int?)2, (int?)2, (int?)2, (TextAnchor?)(TextAnchor)1);
			content.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			ScrollRect obj = val.AddComponent<ScrollRect>();
			obj.movementType = (MovementType)2;
			obj.inertia = true;
			obj.elasticity = 0.125f;
			obj.scrollSensitivity = 25f;
			obj.horizontal = false;
			obj.vertical = true;
			obj.viewport = component;
			obj.content = component2;
			GameObject obj2 = CreateVerticalGroup(val, "SliderContainer", forceWidth: false, forceHeight: false, childControlWidth: true, childControlHeight: true);
			int? minWidth = 25;
			flexibleHeight = 0;
			flexibleWidth = 9999;
			SetLayoutElement(obj2, minWidth, null, flexibleHeight, flexibleWidth);
			obj2.AddComponent<Mask>().showMaskGraphic = false;
			CreateSliderScrollbar(obj2, out var slider);
			ColorBlock val3 = default(ColorBlock);
			((ColorBlock)(ref val3)).disabledColor = new Color(0.1f, 0.1f, 0.1f);
			((ColorBlock)(ref val3)).colorMultiplier = 1f;
			ColorBlock colors = val3;
			((Selectable)slider).colors = colors;
			uiRoot = val;
			return new ScrollPool<T>(obj);
		}

		public static GameObject CreateSliderScrollbar(GameObject parent, out Slider slider)
		{
			//IL_0006: 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)
			//IL_0035: 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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: 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_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: 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_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: 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_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: 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_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: 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_013c: 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_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_026a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0285: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b6: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject("SliderScrollbar", parent, smallElementSize);
			val.AddComponent<Mask>().showMaskGraphic = false;
			((Graphic)val.AddComponent<Image>()).color = Colour.DarkBackground;
			GameObject obj = CreateUIObject("Background", val);
			GameObject val2 = CreateUIObject("Handle Slide Area", val);
			GameObject val3 = CreateUIObject("Handle", val2);
			Image obj2 = obj.AddComponent<Image>();
			obj2.type = (Type)1;
			((Graphic)obj2).color = Colour.DarkBackground;
			obj.AddComponent<Mask>();
			RectTransform component = obj.GetComponent<RectTransform>();
			component.pivot = new Vector2(0f, 1f);
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			component.sizeDelta = Vector2.zero;
			component.offsetMax = new Vector2(0f, 0f);
			RectTransform component2 = val2.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.op_Implicit(Vector3.zero);
			component2.anchorMax = Vector2.op_Implicit(Vector3.one);
			component2.pivot = Vector2.op_Implicit(new Vector3(0.5f, 0.5f));
			Image val4 = val3.AddComponent<Image>();
			((Graphic)val4).color = Colour.SliderHandle;
			val3.GetComponent<RectTransform>().pivot = new Vector2(0.5f, 0.5f);
			int? minWidth = 21;
			int? flexibleWidth = 0;
			SetLayoutElement(val3, minWidth, null, flexibleWidth);
			LayoutElement obj3 = val.AddComponent<LayoutElement>();
			obj3.minWidth = 25f;
			obj3.flexibleWidth = 0f;
			obj3.minHeight = 30f;
			obj3.flexibleHeight = 9999f;
			slider = val.AddComponent<Slider>();
			slider.handleRect = val3.GetComponent<RectTransform>();
			((Selectable)slider).targetGraphic = (Graphic)(object)val4;
			slider.direction = (Direction)3;
			int? minWidth2 = 25;
			flexibleWidth = 0;
			int? flexibleHeight = 9999;
			SetLayoutElement(val, minWidth2, null, flexibleWidth, flexibleHeight);
			Slider obj4 = slider;
			ColorBlock colors = default(ColorBlock);
			((ColorBlock)(ref colors)).normalColor = new Color(0.4f, 0.4f, 0.4f);
			((ColorBlock)(ref colors)).highlightedColor = new Color(0.5f, 0.5f, 0.5f);
			((ColorBlock)(ref colors)).pressedColor = new Color(0.3f, 0.3f, 0.3f);
			((ColorBlock)(ref colors)).disabledColor = new Color(0.5f, 0.5f, 0.5f);
			((ColorBlock)(ref colors)).colorMultiplier = 1f;
			((Selectable)obj4).colors = colors;
			return val;
		}

		public static GameObject CreateScrollView(GameObject parent, string name, out GameObject content, out AutoSliderScrollbar autoScrollbar, Color color = default(Color))
		{
			//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_0019: 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)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: 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)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: 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_00ce: 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_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: 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_0138: 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_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0217: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: 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_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_0276: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e3: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = CreateUIObject(name, parent);
			RectTransform component = val.GetComponent<RectTransform>();
			component.anchorMin = Vector2.zero;
			component.anchorMax = Vector2.one;
			Image obj = val.AddComponent<Image>();
			obj.type = (Type)3;
			((Graphic)obj).color = ((color == default(Color)) ? Colour.DarkBackground : color);
			int? flexibleHeight = 9999;
			int? flexibleWidth = 9999;
			SetLayoutElement(val, null, null, flexibleWidth, flexibleHeight);
			GameObject val2 = CreateUIObject("Viewport", val);
			RectTransform component2 = val2.GetComponent<RectTransform>();
			component2.anchorMin = Vector2.zero;
			component2.anchorMax = Vector2.one;
			component2.pivot = new Vector2(0f, 1f);
			component2.offsetMax = new Vector2(-28f, 0f);
			((Graphic)val2.AddComponent<Image>()).color = Colour.ViewportBackground;
			val2.AddComponent<Mask>().showMaskGraphic = false;
			content = CreateUIObject("Content", val2);
			GameObject gameObject = content;
			bool? forceWidth = true;
			bool? forceHeight = false;
			bool? childControlWidth = true;
			bool? childControlHeight = true;
			TextAnchor? childAlignment = (TextAnchor)0;
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(gameObject, forceWidth, forceHeight, childControlWidth, childControlHeight, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, childAlignment);
			GameObject gameObject2 = content;
			flexibleWidth = 9999;
			SetLayoutElement(gameObject2, null, null, null, flexibleWidth);
			RectTransform component3 = content.GetComponent<RectTransform>();
			component3.anchorMin = Vector2.zero;
			component3.anchorMax = Vector2.one;
			component3.pivot = new Vector2(0f, 1f);
			content.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			GameObject val3 = CreateUIObject("AutoSliderScrollbar", val);
			RectTransform component4 = val3.GetComponent<RectTransform>();
			component4.anchorMin = new Vector2(1f, 0f);
			component4.anchorMax = Vector2.one;
			component4.offsetMin = new Vector2(-25f, 0f);
			UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val3, (bool?)false, (bool?)true, (bool?)true, (bool?)true, (int?)null, (int?)null, (int?)null, (int?)null, (int?)null, (TextAnchor?)null);
			((Graphic)val3.AddComponent<Image>()).color = Colour.PanelBackground;
			val3.AddComponent<Mask>().showMaskGraphic = false;
			Scrollbar scrollbar;
			GameObject val4 = CreateScrollbar(val3, "HiddenScrollviewScroller", out scrollbar);
			scrollbar.SetDirection((Direction)2, true);
			for (int i = 0; i < val4.transform.childCount; i++)
			{
				((Component)val4.transform.GetChild(i)).gameObject.SetActive(false);
			}
			CreateSliderScrollbar(val3, out var slider);
			autoScrollbar = new AutoSliderScrollbar(scrollbar, slider, component3, component2);
			ScrollRect obj2 = val.AddComponent<ScrollRect>();
			obj2.horizontal = false;
			obj2.vertical = true;
			obj2.verticalScrollbar = scrollbar;
			obj2.movementType = (MovementType)2;
			obj2.scrollSensitivity = 35f;
			obj2.horizontalScrollbarVisibility = (ScrollbarVisibility)2;
			obj2.verticalScrollbarVisibility = (ScrollbarVisibility)0;
			obj2.viewport = component2;
			obj2.content = component3;
			return val;
		}
	}
	public static class UniversalUI
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static GameFrameUpdateEventHandler <0>__Update;
		}

		internal static readonly Dictionary<string, UIBase> registeredUIs = new Dictionary<string, UIBase>();

		internal static readonly List<UIBase> uiBases = new List<UIBase>();

		public const int MAX_INPUTFIELD_CHARS = 16000;

		public static Vector2 CanvasDimensions = new Vector2(1920f, 1080f);

		public static bool Initializing { get; internal set; } = true;


		public static bool AnyUIShowing => registeredUIs.Any((KeyValuePair<string, UIBase> it) => it.Value.Enabled);

		public static GameObject CanvasRoot { get; private set; }

		public static GameObject PoolHolder { get; private set; }

		public static Font DefaultFont { get; private set; }

		public static UIBase RegisterUI(string id, Action updateMethod)
		{
			return new UIBase(id, updateMethod);
		}

		public static T RegisterUI<T>(string id, Action updateMethod) where T : UIBase
		{
			return (T)Activator.CreateInstance(typeof(T), id, updateMethod);
		}

		public static void SetUIActive(string id, bool active)
		{
			if (registeredUIs.TryGetValue(id, out var value))
			{
				value.RootObject.SetActive(active);
				if (active)
				{
					value.SetOnTop();
				}
				else if (value != PanelManager.resizeCursorUIBase)
				{
					PanelManager.ForceEndResize();
				}
				return;
			}
			throw new ArgumentException("There is no UI registered with the id '" + id + "'");
		}

		internal static void Init()
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_0048: 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_0053: Expected O, but got Unknown
			CreateRootCanvas();
			PoolHolder = new GameObject("PoolHolder");
			PoolHolder.transform.parent = CanvasRoot.transform;
			PoolHolder.SetActive(false);
			object obj = <>O.<0>__Update;
			if (obj == null)
			{
				GameFrameUpdateEventHandler val = Update;
				<>O.<0>__Update = val;
				obj = (object)val;
			}
			GameFrame.OnUpdate += (GameFrameUpdateEventHandler)obj;
			Initializing = false;
		}

		internal static void Update()
		{
			if (Initializing)
			{
				return;
			}
			CoroutineUtility.TickRoutines();
			if (!AnyUIShowing || !Object.op_Implicit((Object)(object)CanvasRoot))
			{
				return;
			}
			InputManager.Update();
			InputFieldRef.UpdateInstances();
			UIBehaviourModel.UpdateInstances();
			PanelManager.focusHandledThisFrame = false;
			PanelManager.draggerHandledThisFrame = false;
			for (int i = 0; i < uiBases.Count; i++)
			{
				UIBase uIBase = uiBases[i];
				if (uIBase.Enabled)
				{
					uIBase.Update();
				}
			}
		}

		private static void CreateRootCanvas()
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Expected O, but got Unknown
			//IL_001f: 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_0050: Unknown result type (might be due to invalid IL or missing references)
			CanvasRoot = new GameObject("UniverseLibCanvas");
			Object.DontDestroyOnLoad((Object)(object)CanvasRoot);
			GameObject canvasRoot = CanvasRoot;
			((Object)canvasRoot).hideFlags = (HideFlags)(((Object)canvasRoot).hideFlags | 0x3D);
			CanvasRoot.layer = 5;
			CanvasRoot.transform.position = new Vector3(0f, 0f, 1f);
			CanvasRoot.SetActive(false);
			CanvasRoot.SetActive(true);
		}
	}
}
namespace ClientUI.UniverseLib.UI.Widgets
{
	public class AutoSliderScrollbar : UIBehaviourModel
	{
		private float lastAnchorPosition;

		private float lastContentHeight;

		private float lastViewportHeight;

		private bool _refreshWanted;

		public override GameObject UIRoot
		{
			get
			{
				if (Object.op_Implicit((Object)(object)Slider))
				{
					return ((Component)Slider).gameObject;
				}
				return null;
			}
		}

		public Slider Slider { get; }

		public Scrollbar Scrollbar { get; }

		public RectTransform ContentRect { get; }

		public RectTransform ViewportRect { get; }

		public AutoSliderScrollbar(Scrollbar scrollbar, Slider slider, RectTransform contentRect, RectTransform viewportRect)
		{
			Scrollbar = scrollbar;
			Slider = slider;
			ContentRect = contentRect;
			ViewportRect = viewportRect;
			((UnityEvent<float>)(object)Scrollbar.onValueChanged).AddListener<float>(OnScrollbarValueChanged);
			((UnityEvent<float>)(object)Slider.onValueChanged).AddListener<float>(OnSliderValueChanged);
			Slider.Set(0f, false);
			UpdateSliderHandle();
		}

		public override void Update()
		{
			//IL_0016: 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)
			//IL_0050: 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_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: 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)
			if (base.Enabled)
			{
				_refreshWanted = false;
				if (((Transform)ContentRect).localPosition.y != lastAnchorPosition)
				{
					lastAnchorPosition = ((Transform)ContentRect).localPosition.y;
					_refreshWanted = true;
				}
				Rect rect = ContentRect.rect;
				if (((Rect)(ref rect)).height != lastContentHeight)
				{
					rect = ContentRect.rect;
					lastContentHeight = ((Rect)(ref rect)).height;
					_refreshWanted = true;
				}
				rect = ViewportRect.rect;
				if (((Rect)(ref rect)).height != lastViewportHeight)
				{
					rect = ViewportRect.rect;
					lastViewportHeight = ((Rect)(ref rect)).height;
					_refreshWanted = true;
				}
				if (_refreshWanted)
				{
					UpdateSliderHandle();
				}
			}
		}

		public void UpdateSliderHandle()
		{
			//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_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_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: 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_00b8: 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_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0118: Unknown result type (might be due to invalid IL or missing references)
			Rect rect = ContentRect.rect;
			float height = ((Rect)(ref rect)).height;
			rect = ViewportRect.rect;
			float height2 = ((Rect)(ref rect)).height;
			if (height <= height2)
			{
				Slider.handleRect.SetSizeWithCurrentAnchors((Axis)1, 0f);
				Slider.value = 0f;
				((Selectable)Slider).interactable = false;
				return;
			}
			float val = height2 * Math.Min(1f, height2 / height);
			val = Math.Max(15f, val);
			RectTransform handleContainerRect = Slider.m_HandleContainerRect;
			handleContainerRect.offsetMax = new Vector2(handleContainerRect.offsetMax.x, 0f - val * 0.5f);
			handleContainerRect.offsetMin = new Vector2(handleContainerRect.offsetMin.x, val * 0.5f);
			Slider.handleRect.SetSizeWithCurrentAnchors((Axis)1, val);
			((Selectable)Slider).interactable = !Mathf.Approximately(val, height2);
			float value = 0f;
			if (height > 0f)
			{
				decimal num = (decimal)((Transform)ContentRect).localPosition.y;
				rect = ViewportRect.rect;
				value = (float)(num / (decimal)(height - ((Rect)(ref rect)).height));
			}
			Slider.value = value;
		}

		public void OnScrollbarValueChanged(float value)
		{
			value = 1f - value;
			if (Slider.value != value)
			{
				Slider.Set(value, false);
			}
		}

		public void OnSliderValueChanged(float value)
		{
			value = 1f - value;
			Scrollbar.value = value;
		}
	}
}
namespace ClientUI.UniverseLib.UI.Widgets.ScrollView
{
	public class DataHeightCache<T> where T : ICell
	{
		private readonly List<DataViewInfo> heightCache = new List<DataViewInfo>();

		private float totalHeight;

		private float? m_defaultHeight;

		private readonly List<int> rangeCache = new List<int>();

		private ScrollPool<T> ScrollPool { get; }

		public DataViewInfo this[int index]
		{
			get
			{
				return heightCache[index];
			}
			set
			{
				SetIndex(index, value);
			}
		}

		public int Count => heightCache.Count;

		public float TotalHeight => totalHeight;

		public float DefaultHeight
		{
			get
			{
				float? defaultHeight = m_defaultHeight;
				if (!defaultHeight.HasValue)
				{
					float? num = (m_defaultHeight = ScrollPool.PrototypeHeight);
					return num.Value;
				}
				return defaultHeight.GetValueOrDefault();
			}
		}

		public DataHeightCache(ScrollPool<T> scrollPool)
		{
			ScrollPool = scrollPool;
		}

		private int GetRangeCeilingOfPosition(float position)
		{
			return (int)Math.Ceiling((decimal)position / (decimal)DefaultHeight);
		}

		private int GetRangeFloorOfPosition(float position)
		{
			return (int)Math.Floor((decimal)position / (decimal)DefaultHeight);
		}

		public int GetFirstDataIndexAtPosition(float desiredHeight)
		{
			if (!heightCache.Any())
			{
				return 0;
			}
			int rangeFloorOfPosition = GetRangeFloorOfPosition(desiredHeight);
			if (rangeFloorOfPosition < 0)
			{
				return 0;
			}
			if (rangeFloorOfPosition >= rangeCache.Count)
			{
				return ScrollPool.DataSource.ItemCount - 1;
			}
			int num = rangeCache[rangeFloorOfPosition];
			DataViewInfo dataViewInfo = heightCache[num];
			int rangeCeilingOfPosition = GetRangeCeilingOfPosition(dataViewInfo.startPosition);
			int num2 = rangeCeilingOfPosition + dataViewInfo.normalizedSpread - 1;
			if (rangeFloorOfPosition < rangeCeilingOfPosition || rangeFloorOfPosition > num2)
			{
				RecalculateStartPositions(ScrollPool.DataSource.ItemCount - 1);
				rangeFloorOfPosition = GetRangeFloorOfPosition(desiredHeight);
				num = rangeCache[rangeFloorOfPosition];
			}
			return num;
		}

		private int GetRangeSpread(float startPosition, float height)
		{
			float num = startPosition % DefaultHeight;
			if (num != 0f)
			{
				height -= DefaultHeight - num;
			}
			return (int)Math.Ceiling((decimal)height / (decimal)DefaultHeight);
		}

		public void Add(float value)
		{
			value = Math.Max(DefaultHeight, value);
			int rangeSpread = GetRangeSpread(totalHeight, value);
			heightCache.Add(new DataViewInfo(heightCache.Count, value, totalHeight, rangeSpread));
			int item = heightCache.Count - 1;
			for (int i = 0; i < rangeSpread; i++)
			{
				rangeCache.Add(item);
			}
			totalHeight += value;
		}

		public void RemoveLast()
		{
			if (heightCache.Any())
			{
				totalHeight -= heightCache[heightCache.Count - 1];
				heightCache.RemoveAt(heightCache.Count - 1);
				int count = heightCache.Count;
				while (rangeCache.Count > 0 && rangeCache[rangeCache.Count - 1] == count)
				{
					rangeCache.RemoveAt(rangeCache.Count - 1);
				}
			}
		}

		public void SetIndex(int dataIndex, float height)
		{
			height = (float)Math.Floor(height);
			height = Math.Max(DefaultHeight, height);
			if (dataIndex >= ScrollPool.DataSource.ItemCount)
			{
				while (heightCache.Count > dataIndex)
				{
					RemoveLast();
				}
				return;
			}
			if (dataIndex >= heightCache.Count)
			{
				while (dataIndex > heightCache.Count)
				{
					Add(DefaultHeight);
				}
				Add(height);
				return;
			}
			DataViewInfo value = heightCache[dataIndex];
			if (value.height != height)
			{
				float num = height - value.height;
				totalHeight += num;
				value.height = height;
			}
			if (dataIndex > 0)
			{
				DataViewInfo dataViewInfo = heightCache[dataIndex - 1];
				value.startPosition = dataViewInfo.startPosition + dataViewInfo.height;
			}
			int rangeCeilingOfPosition = GetRangeCeilingOfPosition(value.startPosition);
			int rangeSpread = GetRangeSpread(value.startPosition, height);
			if (rangeCache[rangeCeilingOfPosition] != dataIndex)
			{
				RecalculateStartPositions(ScrollPool.DataSource.ItemCount - 1);
				rangeCeilingOfPosition = GetRangeCeilingOfPosition(value.startPosition);
				rangeSpread = GetRangeSpread(value.startPosition, height);
			}
			if (rangeCache[rangeCeilingOfPosition] != dataIndex)
			{
				throw new IndexOutOfRangeException($"Trying to set dataIndex {dataIndex} at rangeIndex {rangeCeilingOfPosition}, but cache is corrupt or invalid!");
			}
			if (rangeSpread != value.normalizedSpread)
			{
				int spreadDiff = rangeSpread - value.normalizedSpread;
				value.normalizedSpread = rangeSpread;
				UpdateSpread(dataIndex, rangeCeilingOfPosition, spreadDiff);
			}
			heightCache[dataIndex] = value;
		}

		private void UpdateSpread(int dataIndex, int rangeIndex, int spreadDiff)
		{
			if (spreadDiff > 0)
			{
				while (rangeCache[rangeIndex] == dataIndex && spreadDiff > 0)
				{
					rangeCache.Insert(rangeIndex, dataIndex);
					spreadDiff--;
				}
			}
			else
			{
				while (rangeCache[rangeIndex] == dataIndex && spreadDiff < 0)
				{
					rangeCache.RemoveAt(rangeIndex);
					spreadDiff++;
				}
			}
		}

		private void RecalculateStartPositions(int toIndex)
		{
			if (heightCache.Count <= 1)
			{
				return;
			}
			rangeCache.Clear();
			DataViewInfo dataViewInfo = DataViewInfo.None;
			for (int i = 0; i <= toIndex && i < heightCache.Count; i++)
			{
				DataViewInfo dataViewInfo2 = heightCache[i];
				if (!dataViewInfo.Equals(DataViewInfo.None))
				{
					dataViewInfo2.startPosition = dataViewInfo.startPosition + dataViewInfo.height;
				}
				else
				{
					dataViewInfo2.startPosition = 0f;
				}
				dataViewInfo2.normalizedSpread = GetRangeSpread(dataViewInfo2.startPosition, dataViewInfo2.height);
				for (int j = 0; j < dataViewInfo2.normalizedSpread; j++)
				{
					rangeCache.Add(dataViewInfo2.dataIndex);
				}
				heightCache[i] = dataViewInfo2;
				dataViewInfo = dataViewInfo2;
			}
		}
	}
	public struct DataViewInfo
	{
		private static DataViewInfo s_default;

		public int dataIndex;

		public int normalizedSpread;

		public float height;

		public float startPosition;

		public static DataViewInfo None => s_default;

		public static implicit operator float(DataViewInfo it)
		{
			return it.height;
		}

		public DataViewInfo(int index, float height, float startPos, int spread)
		{
			dataIndex = index;
			this.height = height;
			startPosition = startPos;
			normalizedSpread = spread;
		}

		public override bool Equals(object obj)
		{
			DataViewInfo dataViewInfo = (DataViewInfo)obj;
			if (dataIndex == dataViewInfo.dataIndex && height == dataViewInfo.height && startPosition == dataViewInfo.startPosition)
			{
				return normalizedSpread == dataViewInfo.normalizedSpread;
			}
			return false;
		}

		public override int GetHashCode()
		{
			return base.GetHashCode();
		}
	}
	public interface ICell : IPooledObject
	{
		bool Enabled { get; }

		RectTransform Rect { get; set; }

		void Enable();

		void Disable();
	}
	public interface ICellPoolDataSource<T> where T : ICell
	{
		int ItemCount { get; }

		void OnCellBorrowed(T cell);

		void SetCell(T cell, int index);
	}
	public struct CellInfo
	{
		public int cellIndex;

		public int dataIndex;
	}
	public class ScrollPool<T> : UIBehaviourModel, IEnumerable<CellInfo>, IEnumerable where T : ICell
	{
		internal DataHeightCache<T> HeightCache;

		internal Slider slider;

		internal ScrollRect ScrollRect;

		internal VerticalLayoutGroup contentLayout;

		internal float? _protoHeight;

		private Vector2 RecycleViewBounds;

		private Vector2 NormalizedScrollBounds;

		private int bottomDataIndex;

		private int topPoolIndex;

		private int bottomPoolIndex;

		private Vector2 prevAnchoredPos;

		private float prevViewportHeight;

		private float prevContentHeight = 1f;

		private bool writingLocked;

		private float timeofLastWriteLock;

		private CellInfo _current;

		public ICellPoolDataSource<T> DataSource { get; set; }

		public List<T> CellPool { get; } = new List<T>();


		public override GameObject UIRoot
		{
			get
			{
				if ((Object)(object)ScrollRect != (Object)null)
				{
					return ((Component)ScrollRect).gameObject;
				}
				return null;
			}
		}

		public RectTransform Viewport => ScrollRect.viewport;

		public RectTransform Content => ScrollRect.content;

		internal float PrototypeHeight
		{
			get
			{
				float? protoHeight = _protoHeight;
				if (!protoHeight.HasValue)
				{
					float? num = (_protoHeight = Pool<T>.Instance.DefaultHeight);
					return num.Value;
				}
				return protoHeight.GetValueOrDefault();
			}
		}

		internal int ExtraPoolCells => 10;

		internal float RecycleThreshold => PrototypeHeight * (float)ExtraPoolCells;

		internal float HalfThreshold => RecycleThreshold * 0.5f;

		private int TopDataIndex => Math.Max(0, bottomDataIndex - CellPool.Count + 1);

		private int CurrentDataCount => bottomDataIndex + 1;

		private float TotalDataHeight => HeightCache.TotalHeight + (float)((LayoutGroup)contentLayout).padding.top + (float)((LayoutGroup)contentLayout).padding.bottom;

		public bool WritingLocked
		{
			get
			{
				if (!writingLocked)
				{
					return PanelManager.Resizing;
				}
				return true;
			}
			internal set
			{
				if (writingLocked != value)
				{
					timeofLastWriteLock = Time.realtimeSinceStartup;
					writingLocked = value;
				}
			}
		}

		private bool ShouldRecycleTop
		{
			get
			{
				if (GetCellExtent(CellPool[topPoolIndex].Rect) > RecycleViewBounds.x)
				{
					return GetCellExtent(CellPool[bottomPoolIndex].Rect) > RecycleViewBounds.y;
				}
				return false;
			}
		}

		private bool ShouldRecycleBottom
		{
			get
			{
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0055: Unknown result type (might be due to invalid IL or missing references)
				if (((Transform)CellPool[bottomPoolIndex].Rect).position.y < RecycleViewBounds.y)
				{
					return ((Transform)CellPool[topPoolIndex].Rect).position.y < RecycleViewBounds.x;
				}
				return false;
			}
		}

		private event Action OnHeightChanged;

		public ScrollPool(ScrollRect scrollRect)
		{
			ScrollRect = scrollRect;
		}

		public override void Update()
		{
			//IL_0049: 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_005c: 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_0032: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)ScrollRect) || DataSource == null || writingLocked)
			{
				return;
			}
			Rect rect;
			if (!CheckRecycleViewBounds(extendPoolIfGrown: true))
			{
				rect = Content.rect;
				if (((Rect)(ref rect)).height == prevContentHeight)
				{
					return;
				}
			}
			rect = Content.rect;
			prevContentHeight = ((Rect)(ref rect)).height;
			OnValueChangedListener(Vector2.zero);
			this.OnHeightChanged?.Invoke();
		}

		public void Refresh(bool setCellData, bool jumpToTop = false)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			if (jumpToTop)
			{
				bottomDataIndex = CellPool.Count - 1;
				Content.anchoredPosition = Vector2.zero;
			}
			RefreshCells(setCellData, setSlider: true);
		}

		public void JumpToIndex(int index, Action<T> onJumped)
		{
			CheckDataSourceCountChange();
			if (HeightCache.Count <= index)
			{
				throw new IndexOutOfRangeException($"Requested jump index {index} is out of bounds. Data count: {HeightCache.Count}");
			}
			DataViewInfo dataViewInfo = HeightCache[index];
			float num = dataViewInfo.height * (float)((decimal)dataViewInfo.dataIndex / (decimal)HeightCache.Count);
			float normalizedPos = (dataViewInfo.startPosition + num) / HeightCache.TotalHeight;
			CoroutineUtility.StartCoroutine(ForceDelayedJump(index, normalizedPos, onJumped));
		}

		private IEnumerator ForceDelayedJump(int dataIndex, float normalizedPos, Action<T> onJumped)
		{
			yield return null;
			yield return null;
			slider.value = normalizedPos;
			yield return null;
			RefreshCells(andReloadFromDataSource: true, setSlider: false);
			using IEnumerator<CellInfo> enumerator = GetEnumerator();
			while (enumerator.MoveNext())
			{
				CellInfo current = enumerator.Current;
				if (current.dataIndex == dataIndex)
				{
					onJumped?.Invoke(CellPool[current.cellIndex]);
					break;
				}
			}
		}

		public IEnumerator<CellInfo> GetEnumerator()
		{
			return EnumerateCellPool();
		}

		IEnumerator IEnumerable.GetEnumerator()
		{
			return EnumerateCellPool();
		}

		public void Initialize(ICellPoolDataSource<T> dataSource, Action onHeightChangedListener = null)
		{
			DataSource = dataSource;
			HeightCache = new DataHeightCache<T>(this);
			Pool<T>.GetPool();
			contentLayout = ((Component)ScrollRect.content).GetComponent<VerticalLayoutGroup>();
			slider = ((Component)ScrollRect).GetComponentInChildren<Slider>();
			((UnityEvent<float>)(object)slider.onValueChanged).AddListener<float>(OnSliderValueChanged);
			ScrollRect.vertical = true;
			ScrollRect.horizontal = false;
			CoroutineUtility.StartCoroutine(InitCoroutine(onHeightChangedListener));
		}

		private IEnumerator InitCoroutine(Action onHeightChangedListener)
		{
			ScrollRect.content.anchoredPosition = Vector2.zero;
			yield return null;
			yield return null;
			LayoutRebuilder.ForceRebuildLayoutImmediate(Content);
			prevAnchoredPos = Content.anchoredPosition;
			CheckRecycleViewBounds(extendPoolIfGrown: false);
			CreateCellPool();
			using (IEnumerator<CellInfo> enumerator = GetEnumerator())
			{
				while (enumerator.MoveNext())
				{
					CellInfo current = enumerator.Current;
					SetCell(CellPool[current.cellIndex], current.dataIndex);
				}
			}
			LayoutRebuilder.ForceRebuildLayoutImmediate(Content);
			ScrollPool<T> scrollPool = this;
			Rect rect = Content.rect;
			scrollPool.prevContentHeight = ((Rect)(ref rect)).height;
			SetScrollBounds();
			UpdateSliderHandle();
			((UnityEvent<Vector2>)(object)ScrollRect.onValueChanged).AddListener<Vector2>(OnValueChangedListener);
			OnHeightChanged += onHeightChangedListener;
			onHeightChangedListener?.Invoke();
		}

		private void SetScrollBounds()
		{
			//IL_0007: 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_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_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)
			Rect rect = Viewport.rect;
			float num = ((Rect)(ref rect)).height * 0.5f;
			float totalDataHeight = TotalDataHeight;
			rect = Viewport.rect;
			NormalizedScrollBounds = new Vector2(num, totalDataHeight - ((Rect)(ref rect)).height * 0.5f);
		}

		private bool CheckRecycleViewBounds(bool extendPoolIfGrown)
		{
			//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_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_0083: 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_003e: 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)
			RecycleViewBounds = new Vector2(Viewport.MinY() + HalfThreshold, Viewport.MaxY() - HalfThreshold);
			Rect rect;
			if (extendPoolIfGrown)
			{
				float num = prevViewportHeight;
				rect = Viewport.rect;
				if (num < ((Rect)(ref rect)).height && prevViewportHeight != 0f)
				{
					CheckExtendCellPool();
				}
			}
			float num2 = prevViewportHeight;
			rect = Viewport.rect;
			bool result = num2 == ((Rect)(ref rect)).height;
			rect = Viewport.rect;
			prevViewportHeight = ((Rect)(ref rect)).height;
			return result;
		}

		private IEnumerator<CellInfo> EnumerateCellPool()
		{
			int cellIdx = topPoolIndex;
			int dataIndex = TopDataIndex;
			for (int iterated = 0; iterated < CellPool.Count; iterated++)
			{
				_current.cellIndex = cellIdx;
				_current.dataIndex = dataIndex;
				yield return _current;
				cellIdx++;
				if (cellIdx >= CellPool.Count)
				{
					cellIdx = 0;
				}
				dataIndex++;
			}
		}

		private void CreateCellPool()
		{
			//IL_001a: 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)
			CheckDataSourceCountChange(out var _);
			float num = 0f;
			Rect rect = ScrollRect.viewport.rect;
			float num2 = ((Rect)(ref rect)).height + RecycleThreshold;
			topPoolIndex = 0;
			bottomPoolIndex = -1;
			for (WritingLocked = true; num <= num2; num += PrototypeHeight)
			{
				bottomPoolIndex++;
				T val = Pool<T>.Borrow();
				CellPool.Add(val);
				DataSource.OnCellBorrowed(val);
				((Transform)val.Rect).SetParent((Transform)(object)ScrollRect.content, false);
			}
			bottomDataIndex = CellPool.Count - 1;
			LayoutRebuilder.ForceRebuildLayoutImmediate(Content);
		}

		private bool CheckExtendCellPool()
		{
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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_01ba: 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_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: 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)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
			CheckDataSourceCountChange();
			float num = Math.Abs(RecycleViewBounds.y - RecycleViewBounds.x);
			float num2 = (float)CellPool.Count * PrototypeHeight;
			int num3 = (int)Math.Floor((decimal)(num - num2) / (decimal)PrototypeHeight);
			if (num3 > 0)
			{
				WritingLocked = true;
				bottomDataIndex += num3;
				float y = ((Transform)Content).localPosition.y;
				Rect rect = Content.rect;
				float height = ((Rect)(ref rect)).height;
				for (int i = 0; i < num3; i++)
				{
					T val = Pool<T>.Borrow();
					DataSource.OnCellBorrowed(val);
					((Transform)val.Rect).SetParent((Transform)(object)ScrollRect.content, false);
					CellPool.Add(val);
					if (CellPool.Count > 1)
					{
						int num4 = CellPool.Count - 1 - topPoolIndex % (CellPool.Count - 1);
						((Transform)val.Rect).SetSiblingIndex(num4 + 1);
						if (bottomPoolIndex == num4 - 1)
						{
							bottomPoolIndex++;
						}
					}
				}
				RefreshCells(andReloadFromDataSource: true, setSlider: tru