Decompiled source of RuntimeInspector v4.0.1

plugins/RuntimeInspector/DynamicPanels.Runtime.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: InternalsVisibleTo("DynamicPanels.Editor")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace DynamicPanels;

[DisallowMultipleComponent]
public abstract class AnchorZoneBase : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, IPointerDownHandler, IPointerExitHandler
{
	protected Panel m_panel;

	private Graphic raycastZone;

	private int hoveredPointerId = -98765;

	public Panel Panel => m_panel;

	public RectTransform RectTransform { get; private set; }

	public DynamicPanelsCanvas Canvas => m_panel.Canvas;

	protected void Awake()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		RectTransform = (RectTransform)((Component)this).transform;
		raycastZone = (Graphic)(object)((Component)this).gameObject.AddComponent<NonDrawingGraphic>();
	}

	protected void OnEnable()
	{
		hoveredPointerId = -98765;
	}

	public abstract bool Execute(PanelTab panelTab, PointerEventData eventData);

	public abstract bool GetAnchoredPreviewRectangleAt(PointerEventData eventData, out Rect rect);

	public void Initialize(Panel panel)
	{
		m_panel = panel;
	}

	public void SetActive(bool value)
	{
		hoveredPointerId = -98765;
		raycastZone.raycastTarget = value;
	}

	public void OnPointerEnter(PointerEventData eventData)
	{
		if (PanelManager.Instance.AnchorPreviewPanelTo(this))
		{
			hoveredPointerId = eventData.pointerId;
		}
	}

	public void OnPointerDown(PointerEventData eventData)
	{
		PanelManager.Instance.CancelDraggingPanel();
	}

	public void OnPointerExit(PointerEventData eventData)
	{
		if (eventData.pointerId == hoveredPointerId)
		{
			hoveredPointerId = -98765;
			PanelManager.Instance.StopAnchorPreviewPanelTo(this);
		}
	}
}
public class CanvasAnchorZone : AnchorZoneBase
{
	private Direction direction;

	public void SetDirection(Direction direction)
	{
		this.direction = direction;
	}

	public override bool Execute(PanelTab panelTab, PointerEventData eventData)
	{
		Panel source = PanelManager.Instance.DetachPanelTab(panelTab.Panel, panelTab.Panel.GetTabIndex(panelTab));
		PanelManager.Instance.AnchorPanel(source, m_panel.Canvas, direction);
		return true;
	}

	public override bool GetAnchoredPreviewRectangleAt(PointerEventData eventData, out Rect rect)
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: 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_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//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_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: 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_00eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f6: 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_00c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: 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_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
		Vector2 size = m_panel.Canvas.Size;
		if (direction == Direction.Left)
		{
			rect = new Rect(0f, 0f, size.x * 0.2f, size.y);
		}
		else if (direction == Direction.Top)
		{
			rect = new Rect(0f, size.y * 0.8f, size.x, size.y * 0.2f);
		}
		else if (direction == Direction.Right)
		{
			rect = new Rect(size.x * 0.8f, 0f, size.x * 0.2f, size.y);
		}
		else
		{
			rect = new Rect(0f, 0f, size.x, size.y * 0.2f);
		}
		((Rect)(ref rect)).position = ((Rect)(ref rect)).position + (((Rect)(ref rect)).size - size) * 0.5f;
		return true;
	}
}
public class PanelAnchorZone : AnchorZoneBase
{
	public override bool Execute(PanelTab panelTab, PointerEventData eventData)
	{
		Direction anchorDirection = GetAnchorDirection(eventData);
		if (anchorDirection == Direction.None)
		{
			return false;
		}
		Panel source = PanelManager.Instance.DetachPanelTab(panelTab.Panel, panelTab.Panel.GetTabIndex(panelTab));
		PanelManager.Instance.AnchorPanel(source, m_panel, anchorDirection);
		return true;
	}

	public override bool GetAnchoredPreviewRectangleAt(PointerEventData eventData, out Rect rect)
	{
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: 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_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: 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_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: 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_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_0134: Unknown result type (might be due to invalid IL or missing references)
		//IL_013a: Unknown result type (might be due to invalid IL or missing references)
		//IL_014a: Unknown result type (might be due to invalid IL or missing references)
		//IL_014f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0159: 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_0163: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: 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_00e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		Direction anchorDirection = GetAnchorDirection(eventData);
		if (anchorDirection == Direction.None)
		{
			rect = default(Rect);
			return false;
		}
		Vector2 sizeDelta = m_panel.RectTransform.sizeDelta;
		sizeDelta.y -= m_panel.Internal.HeaderHeight;
		float num = Mathf.Min(m_panel.Canvas.PanelAnchorZoneLength, sizeDelta.x * m_panel.Canvas.PanelAnchorZoneLengthRatio);
		float num2 = Mathf.Min(m_panel.Canvas.PanelAnchorZoneLength, sizeDelta.y * m_panel.Canvas.PanelAnchorZoneLengthRatio);
		switch (anchorDirection)
		{
		case Direction.Left:
			rect = new Rect(0f, 0f, num, sizeDelta.y);
			break;
		case Direction.Top:
			rect = new Rect(0f, sizeDelta.y - num2, sizeDelta.x, num2);
			break;
		case Direction.Right:
			rect = new Rect(sizeDelta.x - num, 0f, num, sizeDelta.y);
			break;
		default:
			rect = new Rect(0f, 0f, sizeDelta.x, num2);
			break;
		}
		((Rect)(ref rect)).position = ((Rect)(ref rect)).position + (m_panel.RectTransform.anchoredPosition + (((Rect)(ref rect)).size - m_panel.Canvas.Size) * 0.5f);
		return true;
	}

	private Direction GetAnchorDirection(PointerEventData eventData)
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: 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_00b4: 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_00c5: 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_00dc: 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)
		Vector2 val = default(Vector2);
		RectTransformUtility.ScreenPointToLocalPointInRectangle(m_panel.RectTransform, eventData.position, m_panel.Canvas.Internal.worldCamera, ref val);
		Vector2 sizeDelta = m_panel.RectTransform.sizeDelta;
		sizeDelta.y -= m_panel.Internal.HeaderHeight;
		float num = Mathf.Min(m_panel.Canvas.PanelAnchorZoneLength, sizeDelta.x * m_panel.Canvas.PanelAnchorZoneLengthRatio);
		float num2 = Mathf.Min(m_panel.Canvas.PanelAnchorZoneLength, sizeDelta.y * m_panel.Canvas.PanelAnchorZoneLengthRatio);
		if (val.y < num2)
		{
			return Direction.Bottom;
		}
		if (val.y > sizeDelta.y - num2)
		{
			return Direction.Top;
		}
		if (val.x < num)
		{
			return Direction.Left;
		}
		if (val.x > sizeDelta.x - num)
		{
			return Direction.Right;
		}
		return Direction.None;
	}
}
public class PanelHeaderAnchorZone : AnchorZoneBase
{
	public override bool Execute(PanelTab panelTab, PointerEventData eventData)
	{
		Vector2 tabPreviewRect;
		int tabIndexAt = m_panel.Internal.GetTabIndexAt(eventData, out tabPreviewRect);
		m_panel.AddTab(panelTab.Content, tabIndexAt);
		return true;
	}

	public override bool GetAnchoredPreviewRectangleAt(PointerEventData eventData, out Rect rect)
	{
		//IL_0015: 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_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: 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_0073: 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_0089: 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_0098: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		m_panel.Internal.GetTabIndexAt(eventData, out var tabPreviewRect);
		rect = new Rect(tabPreviewRect.x, m_panel.RectTransform.sizeDelta.y - m_panel.Internal.HeaderHeight, tabPreviewRect.y, m_panel.Internal.HeaderHeight);
		((Rect)(ref rect)).position = ((Rect)(ref rect)).position + (m_panel.RectTransform.anchoredPosition + (((Rect)(ref rect)).size - m_panel.Canvas.Size) * 0.5f);
		return true;
	}
}
[DisallowMultipleComponent]
public class DynamicPanelsCanvas : MonoBehaviour, IPointerEnterHandler, IEventSystemHandler, ISerializationCallbackReceiver
{
	internal class InternalSettings
	{
		private readonly DynamicPanelsCanvas canvas;

		public readonly Camera worldCamera;

		public Panel DummyPanel => canvas.dummyPanel;

		public List<PanelProperties> InitialPanelsUnanchored
		{
			get
			{
				if (canvas.initialPanelsUnanchored == null)
				{
					canvas.initialPanelsUnanchored = new List<PanelProperties>();
				}
				return canvas.initialPanelsUnanchored;
			}
		}

		public AnchoredPanelProperties InitialPanelsAnchored
		{
			get
			{
				if (canvas.initialPanelsAnchored == null)
				{
					canvas.initialPanelsAnchored = new AnchoredPanelProperties();
				}
				return canvas.initialPanelsAnchored;
			}
		}

		public InternalSettings(DynamicPanelsCanvas canvas)
		{
			//IL_0013: 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_0026: Invalid comparison between Unknown and I4
			this.canvas = canvas;
			if ((int)canvas.UnityCanvas.renderMode == 0 || ((int)canvas.UnityCanvas.renderMode == 1 && !Object.op_Implicit((Object)(object)canvas.UnityCanvas.worldCamera)))
			{
				worldCamera = null;
			}
			else
			{
				worldCamera = (Object.op_Implicit((Object)(object)canvas.UnityCanvas.worldCamera) ? canvas.UnityCanvas.worldCamera : Camera.main);
			}
		}

		public bool IsLastDockedPanel(Panel panel)
		{
			if (panel.IsDocked)
			{
				return !PanelGroupHasAnyOtherPanels(canvas.RootPanelGroup, panel);
			}
			return false;
		}

		private bool PanelGroupHasAnyOtherPanels(PanelGroup group, Panel panel)
		{
			for (int i = 0; i < group.Count; i++)
			{
				if (group[i] is Panel)
				{
					Panel panel2 = (Panel)group[i];
					if ((Object)(object)panel2 != (Object)(object)panel && (Object)(object)panel2 != (Object)(object)canvas.dummyPanel)
					{
						return true;
					}
				}
				else if (PanelGroupHasAnyOtherPanels((PanelGroup)group[i], panel))
				{
					return true;
				}
			}
			return false;
		}

		public void OnApplicationQuit()
		{
			canvas.OnApplicationQuitting();
		}

		public void AnchorZonesSetActive(bool value)
		{
			canvas.AnchorZonesSetActive(value);
		}

		public void ReceiveRaycasts(bool value)
		{
			canvas.background.raycastTarget = value;
		}
	}

	[Serializable]
	public class PanelProperties
	{
		public List<PanelTabProperties> tabs = new List<PanelTabProperties>();
	}

	public class AnchoredPanelProperties
	{
		public PanelProperties panel = new PanelProperties();

		public Direction anchorDirection;

		public Vector2 initialSize;

		public List<AnchoredPanelProperties> subPanels = new List<AnchoredPanelProperties>();
	}

	[Serializable]
	public struct SerializableAnchoredPanelProperties
	{
		public PanelProperties panel;

		public Direction anchorDirection;

		public Vector2 initialSize;

		public int childCount;

		public int indexOfFirstChild;
	}

	[Serializable]
	public class PanelTabProperties : ISerializationCallbackReceiver
	{
		public RectTransform content;

		public string id;

		public Vector2 minimumSize = new Vector2(250f, 300f);

		public string tabLabel = "Panel";

		public Sprite tabIcon;

		void ISerializationCallbackReceiver.OnBeforeSerialize()
		{
			if (string.IsNullOrEmpty(id))
			{
				id = Guid.NewGuid().ToString();
			}
		}

		void ISerializationCallbackReceiver.OnAfterDeserialize()
		{
		}
	}

	[SerializeField]
	[HideInInspector]
	private string m_id;

	private Panel dummyPanel;

	private Graphic background;

	private RectTransform anchorZonesParent;

	private readonly CanvasAnchorZone[] anchorZones = new CanvasAnchorZone[4];

	[SerializeField]
	private bool m_leaveFreeSpace = true;

	[SerializeField]
	private Vector2 minimumFreeSpace = new Vector2(50f, 50f);

	[SerializeField]
	private RectTransform freeSpaceTargetTransform;

	private Vector2 freeSpacePrevPos;

	private Vector2 freeSpacePrevSize;

	public bool PreventDetachingLastDockedPanel;

	[SerializeField]
	private float m_panelResizableAreaLength = 12f;

	[SerializeField]
	private float m_canvasAnchorZoneLength = 20f;

	[SerializeField]
	private float m_panelAnchorZoneLength = 100f;

	private const float m_panelAnchorZoneLengthRatio = 0.31f;

	[SerializeField]
	private List<PanelProperties> initialPanelsUnanchored;

	[SerializeField]
	[HideInInspector]
	private List<SerializableAnchoredPanelProperties> initialPanelsAnchoredSerialized;

	private AnchoredPanelProperties initialPanelsAnchored;

	private bool updateBounds = true;

	private bool isDirty;

	private bool isQuitting;

	public RectTransform RectTransform { get; private set; }

	public Canvas UnityCanvas { get; private set; }

	internal InternalSettings Internal { get; private set; }

	public string ID
	{
		get
		{
			return m_id;
		}
		set
		{
			m_id = value;
		}
	}

	public UnanchoredPanelGroup UnanchoredPanelGroup { get; private set; }

	public PanelGroup RootPanelGroup { get; private set; }

	public Vector2 Size { get; private set; }

	public bool LeaveFreeSpace
	{
		get
		{
			return m_leaveFreeSpace;
		}
		set
		{
			m_leaveFreeSpace = value;
			if (!m_leaveFreeSpace)
			{
				dummyPanel.Detach();
			}
			else if (!dummyPanel.IsDocked)
			{
				if (RootPanelGroup.Count <= 1)
				{
					RootPanelGroup.AddElement(dummyPanel);
				}
				else
				{
					RootPanelGroup.AddElementBefore(RootPanelGroup[RootPanelGroup.Count / 2], dummyPanel);
				}
			}
		}
	}

	public float PanelResizableAreaLength => m_panelResizableAreaLength;

	public float CanvasAnchorZoneLength => m_canvasAnchorZoneLength;

	public float PanelAnchorZoneLength => m_panelAnchorZoneLength;

	public float PanelAnchorZoneLengthRatio => 0.31f;

	private void Awake()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: 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)
		RectTransform = (RectTransform)((Component)this).transform;
		UnityCanvas = ((Component)this).GetComponentInParent<Canvas>();
		Internal = new InternalSettings(this);
		UnanchoredPanelGroup = new UnanchoredPanelGroup(this);
		RectTransform.ChangePivotWithoutAffectingPosition(new Vector2(0.5f, 0.5f));
		if (!Object.op_Implicit((Object)(object)((Component)this).GetComponent<RectMask2D>()))
		{
			((Component)this).gameObject.AddComponent<RectMask2D>();
		}
		Rect rect = RectTransform.rect;
		Size = ((Rect)(ref rect)).size;
		InitializeRootGroup();
		InitializeAnchorZones();
		background = ((Component)this).GetComponent<Graphic>();
		if (!Object.op_Implicit((Object)(object)background))
		{
			background = (Graphic)(object)((Component)this).gameObject.AddComponent<NonDrawingGraphic>();
			background.raycastTarget = false;
		}
		PanelManager.Instance.RegisterCanvas(this);
		Application.quitting -= OnApplicationQuitting;
		Application.quitting += OnApplicationQuitting;
	}

	private void Start()
	{
		//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_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_015d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_011e: Unknown result type (might be due to invalid IL or missing references)
		Rect rect = RectTransform.rect;
		Size = ((Rect)(ref rect)).size;
		HashSet<Transform> hashSet = new HashSet<Transform>();
		Transform val = ((Component)this).transform;
		while (Object.op_Implicit((Object)(object)val))
		{
			hashSet.Add(val);
			val = val.parent;
		}
		Dictionary<Panel, Vector2> dictionary = null;
		if (initialPanelsAnchored != null)
		{
			dictionary = new Dictionary<Panel, Vector2>(initialPanelsAnchoredSerialized.Count);
			CreateAnchoredPanelsRecursively(initialPanelsAnchored.subPanels, dummyPanel, hashSet, dictionary);
		}
		if (initialPanelsUnanchored != null)
		{
			for (int i = 0; i < initialPanelsUnanchored.Count; i++)
			{
				CreateInitialPanel(initialPanelsUnanchored[i], null, Direction.None, hashSet);
			}
		}
		initialPanelsUnanchored = null;
		initialPanelsAnchored = null;
		initialPanelsAnchoredSerialized = null;
		if (Object.op_Implicit((Object)(object)freeSpaceTargetTransform))
		{
			if ((Object)(object)((Transform)freeSpaceTargetTransform).parent != (Object)(object)RectTransform)
			{
				((Transform)freeSpaceTargetTransform).SetParent((Transform)(object)RectTransform, false);
			}
			freeSpaceTargetTransform.anchorMin = Vector2.zero;
			freeSpaceTargetTransform.anchorMax = Vector2.zero;
			freeSpaceTargetTransform.pivot = Vector2.zero;
			((Transform)freeSpaceTargetTransform).SetAsFirstSibling();
		}
		LeaveFreeSpace = m_leaveFreeSpace;
		LateUpdate();
		if (m_leaveFreeSpace)
		{
			dummyPanel.ResizeTo(new Vector2(99999f, 99999f));
		}
		if (dictionary != null)
		{
			ResizeAnchoredPanelsRecursively(RootPanelGroup, dictionary);
		}
	}

	private void OnDestroy()
	{
		Application.quitting -= OnApplicationQuitting;
		if (!isQuitting)
		{
			PanelManager.Instance.UnregisterCanvas(this);
		}
	}

	private void OnApplicationQuitting()
	{
		isQuitting = true;
	}

	private void LateUpdate()
	{
		//IL_00a6: 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_00b2: 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_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dd: 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_00f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		if (isDirty)
		{
			PanelManager.Instance.StopCanvasOperations(this);
			RootPanelGroup.Internal.UpdateLayout();
			UnanchoredPanelGroup.Internal.UpdateLayout();
			RootPanelGroup.Internal.UpdateSurroundings(null, null, null, null);
		}
		if (updateBounds)
		{
			UpdateBounds();
			updateBounds = false;
		}
		if (isDirty)
		{
			RootPanelGroup.Internal.EnsureMinimumSize();
			UnanchoredPanelGroup.Internal.EnsureMinimumSize();
			isDirty = false;
		}
		if (m_leaveFreeSpace && Object.op_Implicit((Object)(object)freeSpaceTargetTransform))
		{
			Vector2 position = dummyPanel.Position;
			Vector2 size = dummyPanel.Size;
			if (position != freeSpacePrevPos || size != freeSpacePrevSize)
			{
				freeSpacePrevPos = position;
				freeSpacePrevSize = size;
				freeSpaceTargetTransform.anchoredPosition = position;
				freeSpaceTargetTransform.sizeDelta = size;
			}
		}
	}

	public void SetDirty()
	{
		isDirty = true;
		updateBounds = true;
	}

	public void ForceRebuildLayoutImmediate()
	{
		LateUpdate();
	}

	void IPointerEnterHandler.OnPointerEnter(PointerEventData eventData)
	{
		PanelManager.Instance.OnPointerEnteredCanvas(this, eventData);
	}

	private void OnRectTransformDimensionsChange()
	{
		updateBounds = true;
	}

	private void UpdateBounds()
	{
		//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_000f: 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_002a: 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_0045: Unknown result type (might be due to invalid IL or missing references)
		Rect rect = RectTransform.rect;
		Size = ((Rect)(ref rect)).size;
		RootPanelGroup.Internal.UpdateBounds(Vector2.zero, Size);
		UnanchoredPanelGroup.Internal.UpdateBounds(Vector2.zero, Size);
	}

	private void CreateAnchoredPanelsRecursively(List<AnchoredPanelProperties> anchoredPanels, Panel rootPanel, HashSet<Transform> createdTabs, Dictionary<Panel, Vector2> initialSizes)
	{
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		if (anchoredPanels == null)
		{
			return;
		}
		for (int i = 0; i < anchoredPanels.Count; i++)
		{
			Panel panel = CreateInitialPanel(anchoredPanels[i].panel, rootPanel, anchoredPanels[i].anchorDirection, createdTabs);
			if ((Object)(object)panel == (Object)null)
			{
				panel = rootPanel;
			}
			else if (anchoredPanels[i].initialSize != Vector2.zero)
			{
				initialSizes[panel] = anchoredPanels[i].initialSize;
			}
			CreateAnchoredPanelsRecursively(anchoredPanels[i].subPanels, panel, createdTabs, initialSizes);
		}
	}

	private void ResizeAnchoredPanelsRecursively(PanelGroup group, Dictionary<Panel, Vector2> initialSizes)
	{
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		if (group == null)
		{
			return;
		}
		int count = group.Count;
		for (int i = 0; i < count; i++)
		{
			Panel panel = group[i] as Panel;
			if ((Object)(object)panel != (Object)null)
			{
				if (initialSizes.TryGetValue(panel, out var value))
				{
					panel.ResizeTo(value, Direction.Right, Direction.Top);
				}
			}
			else
			{
				ResizeAnchoredPanelsRecursively(group[i] as PanelGroup, initialSizes);
			}
		}
	}

	private Panel CreateInitialPanel(PanelProperties properties, Panel anchor, Direction anchorDirection, HashSet<Transform> createdTabs)
	{
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		Panel panel = null;
		for (int i = 0; i < properties.tabs.Count; i++)
		{
			PanelTabProperties panelTabProperties = properties.tabs[i];
			if (Object.op_Implicit((Object)(object)panelTabProperties.content) && !createdTabs.Contains((Transform)(object)panelTabProperties.content))
			{
				if ((Object)(object)((Transform)panelTabProperties.content).parent != (Object)(object)RectTransform)
				{
					((Transform)panelTabProperties.content).SetParent((Transform)(object)RectTransform, false);
				}
				PanelTab panelTab;
				if ((Object)(object)panel == (Object)null)
				{
					panel = PanelUtils.CreatePanelFor(panelTabProperties.content, this);
					panelTab = panel[0];
				}
				else
				{
					panelTab = panel.AddTab(panelTabProperties.content);
				}
				panelTab.Icon = panelTabProperties.tabIcon;
				panelTab.Label = panelTabProperties.tabLabel;
				panelTab.MinSize = panelTabProperties.minimumSize;
				panelTab.ID = panelTabProperties.id;
				createdTabs.Add((Transform)(object)panelTabProperties.content);
			}
		}
		if ((Object)(object)panel != (Object)null)
		{
			panel.ActiveTab = 0;
			if ((Object)(object)anchor != (Object)null && anchorDirection != Direction.None)
			{
				panel.DockToPanel(anchor, anchorDirection);
			}
		}
		return panel;
	}

	private void InitializeRootGroup()
	{
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		dummyPanel = PanelUtils.Internal.CreatePanel(null, this);
		((Object)((Component)dummyPanel).gameObject).name = "DummyPanel";
		dummyPanel.CanvasGroup.alpha = 0f;
		dummyPanel.Internal.SetDummy(minimumFreeSpace);
		RootPanelGroup = new PanelGroup(this, Direction.Right);
		RootPanelGroup.AddElement(dummyPanel);
	}

	private void InitializeAnchorZones()
	{
		//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_002d: Expected O, but got Unknown
		//IL_0045: 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)
		//IL_0065: 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_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b0: 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_00cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0104: Unknown result type (might be due to invalid IL or missing references)
		//IL_011a: 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_0139: Unknown result type (might be due to invalid IL or missing references)
		anchorZonesParent = (RectTransform)new GameObject("CanvasAnchorZone", new Type[1] { typeof(RectTransform) }).transform;
		((Transform)anchorZonesParent).SetParent((Transform)(object)RectTransform, false);
		anchorZonesParent.anchorMin = Vector2.zero;
		anchorZonesParent.anchorMax = Vector2.one;
		anchorZonesParent.sizeDelta = Vector2.zero;
		CreateAnchorZone(Direction.Left, new Vector2(0f, 0f), new Vector2(0f, 1f), new Vector2(m_canvasAnchorZoneLength, 0f));
		CreateAnchorZone(Direction.Top, new Vector2(0f, 1f), new Vector2(1f, 1f), new Vector2(0f, m_canvasAnchorZoneLength));
		CreateAnchorZone(Direction.Right, new Vector2(1f, 0f), new Vector2(1f, 1f), new Vector2(m_canvasAnchorZoneLength, 0f));
		CreateAnchorZone(Direction.Bottom, new Vector2(0f, 0f), new Vector2(1f, 0f), new Vector2(0f, m_canvasAnchorZoneLength));
		for (int i = 0; i < anchorZones.Length; i++)
		{
			anchorZones[i].SetActive(value: false);
		}
	}

	private void CreateAnchorZone(Direction direction, Vector2 anchorMin, Vector2 anchorMax, Vector2 sizeDelta)
	{
		//IL_002a: 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_006c: 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_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		CanvasAnchorZone canvasAnchorZone = new GameObject("AnchorZone" + direction, new Type[1] { typeof(RectTransform) }).AddComponent<CanvasAnchorZone>();
		canvasAnchorZone.Initialize(dummyPanel);
		canvasAnchorZone.SetDirection(direction);
		((Transform)canvasAnchorZone.RectTransform).SetParent((Transform)(object)anchorZonesParent, false);
		canvasAnchorZone.RectTransform.pivot = anchorMin;
		canvasAnchorZone.RectTransform.anchorMin = anchorMin;
		canvasAnchorZone.RectTransform.anchorMax = anchorMax;
		canvasAnchorZone.RectTransform.anchoredPosition = Vector2.zero;
		canvasAnchorZone.RectTransform.sizeDelta = sizeDelta;
		anchorZones[(int)direction] = canvasAnchorZone;
	}

	private void AnchorZonesSetActive(bool value)
	{
		if (((Behaviour)this).enabled)
		{
			if (value)
			{
				((Transform)anchorZonesParent).SetAsLastSibling();
			}
			for (int i = 0; i < anchorZones.Length; i++)
			{
				anchorZones[i].SetActive(value);
			}
		}
	}

	[ContextMenu("Save Layout")]
	public void SaveLayout()
	{
		PanelSerialization.SerializeCanvas(this);
	}

	[ContextMenu("Load Layout")]
	public void LoadLayout()
	{
		PanelSerialization.DeserializeCanvas(this);
	}

	void ISerializationCallbackReceiver.OnBeforeSerialize()
	{
		if (initialPanelsAnchoredSerialized == null)
		{
			initialPanelsAnchoredSerialized = new List<SerializableAnchoredPanelProperties>();
		}
		else
		{
			initialPanelsAnchoredSerialized.Clear();
		}
		if (initialPanelsAnchored == null)
		{
			initialPanelsAnchored = new AnchoredPanelProperties();
		}
		if (string.IsNullOrEmpty(m_id))
		{
			m_id = Guid.NewGuid().ToString();
		}
		AddToSerializedAnchoredPanelProperties(initialPanelsAnchored);
	}

	void ISerializationCallbackReceiver.OnAfterDeserialize()
	{
		if (initialPanelsAnchoredSerialized != null && initialPanelsAnchoredSerialized.Count > 0)
		{
			ReadFromSerializedAnchoredPanelProperties(0, out initialPanelsAnchored);
		}
		else
		{
			initialPanelsAnchored = new AnchoredPanelProperties();
		}
	}

	private void AddToSerializedAnchoredPanelProperties(AnchoredPanelProperties props)
	{
		//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)
		SerializableAnchoredPanelProperties serializableAnchoredPanelProperties = default(SerializableAnchoredPanelProperties);
		serializableAnchoredPanelProperties.panel = props.panel;
		serializableAnchoredPanelProperties.anchorDirection = props.anchorDirection;
		serializableAnchoredPanelProperties.initialSize = props.initialSize;
		serializableAnchoredPanelProperties.childCount = props.subPanels.Count;
		serializableAnchoredPanelProperties.indexOfFirstChild = initialPanelsAnchoredSerialized.Count + 1;
		SerializableAnchoredPanelProperties item = serializableAnchoredPanelProperties;
		initialPanelsAnchoredSerialized.Add(item);
		for (int i = 0; i < props.subPanels.Count; i++)
		{
			AddToSerializedAnchoredPanelProperties(props.subPanels[i]);
		}
	}

	private int ReadFromSerializedAnchoredPanelProperties(int index, out AnchoredPanelProperties props)
	{
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		SerializableAnchoredPanelProperties serializableAnchoredPanelProperties = initialPanelsAnchoredSerialized[index];
		AnchoredPanelProperties anchoredPanelProperties = new AnchoredPanelProperties
		{
			panel = serializableAnchoredPanelProperties.panel,
			anchorDirection = serializableAnchoredPanelProperties.anchorDirection,
			initialSize = serializableAnchoredPanelProperties.initialSize,
			subPanels = new List<AnchoredPanelProperties>()
		};
		for (int i = 0; i != serializableAnchoredPanelProperties.childCount; i++)
		{
			index = ReadFromSerializedAnchoredPanelProperties(++index, out var props2);
			anchoredPanelProperties.subPanels.Add(props2);
		}
		props = anchoredPanelProperties;
		return index;
	}
}
public interface IPanelGroupElement
{
	DynamicPanelsCanvas Canvas { get; }

	PanelGroup Group { get; }

	Vector2 Position { get; }

	Vector2 Size { get; }

	Vector2 MinSize { get; }

	void ResizeTo(Vector2 newSize, Direction horizontalDir = Direction.Right, Direction verticalDir = Direction.Bottom);

	void DockToRoot(Direction direction);

	void DockToPanel(IPanelGroupElement anchor, Direction direction);

	IPanelGroupElement GetSurroundingElement(Direction direction);
}
public class PanelGroup : IPanelGroupElement
{
	internal class InternalSettings
	{
		private readonly PanelGroup group;

		public InternalSettings(PanelGroup group)
		{
			this.group = group;
		}

		public void SetDirty()
		{
			group.SetDirty();
		}

		public void UpdateBounds(Vector2 position, Vector2 size)
		{
			//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)
			group.UpdateBounds(position, size);
		}

		public void UpdateLayout()
		{
			group.UpdateLayout();
		}

		public void UpdateSurroundings(IPanelGroupElement left, IPanelGroupElement top, IPanelGroupElement right, IPanelGroupElement bottom)
		{
			group.UpdateSurroundings(left, top, right, bottom);
		}

		public void TryChangeSizeOf(IPanelGroupElement element, Direction direction, float deltaSize)
		{
			group.TryChangeSizeOf(element, direction, deltaSize);
		}

		public void ResizeElementTo(IPanelGroupElement element, Vector2 newSize, Direction horizontalDir, Direction verticalDir)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			group.ResizeElementTo(element, newSize, horizontalDir, verticalDir);
		}

		public void ReplaceElement(IPanelGroupElement beforeElement, IPanelGroupElement afterElement)
		{
			group.ReplaceElement(beforeElement, afterElement);
		}

		public void EnsureMinimumSize()
		{
			for (int i = 0; i < group.elements.Count; i++)
			{
				group.EnsureMinimumSizeOf(group.elements[i]);
			}
		}
	}

	private class ElementDirtyProperties
	{
		public IPanelGroupElement element;

		public float posX;

		public float posY;

		public float sizeX;

		public float sizeY;

		public ElementDirtyProperties()
		{
		}

		public ElementDirtyProperties(IPanelGroupElement element)
		{
			this.element = element;
		}

		public void Reset(IPanelGroupElement element)
		{
			this.element = element;
			posX = (posY = (sizeX = (sizeY = 0f)));
		}
	}

	protected const float MIN_SIZE_TOLERANCE = 0.0001f;

	protected readonly Direction direction;

	protected readonly List<IPanelGroupElement> elements;

	protected readonly IPanelGroupElement[] surroundings;

	private List<ElementDirtyProperties> resizeProperties;

	private int resizePropsIndex;

	protected bool isDirty;

	public DynamicPanelsCanvas Canvas { get; private set; }

	public PanelGroup Group { get; protected set; }

	internal InternalSettings Internal { get; private set; }

	public Vector2 Position { get; protected set; }

	public Vector2 Size { get; protected set; }

	public Vector2 MinSize { get; protected set; }

	public int Count => elements.Count;

	public IPanelGroupElement this[int index] => elements[index];

	public PanelGroup(DynamicPanelsCanvas canvas, Direction direction)
	{
		Canvas = canvas;
		Internal = new InternalSettings(this);
		this.direction = direction;
		elements = new List<IPanelGroupElement>(2);
		surroundings = new IPanelGroupElement[4];
	}

	public bool IsInSameDirection(Direction direction)
	{
		switch (direction)
		{
		case Direction.None:
			return false;
		case Direction.Left:
		case Direction.Right:
			if (this.direction != 0)
			{
				return this.direction == Direction.Right;
			}
			return true;
		default:
			if (this.direction != Direction.Top)
			{
				return this.direction == Direction.Bottom;
			}
			return true;
		}
	}

	public IPanelGroupElement GetSurroundingElement(Direction direction)
	{
		return surroundings[(int)direction];
	}

	protected void SetDirty()
	{
		isDirty = true;
		for (PanelGroup group = Group; group != null; group = group.Group)
		{
			group.isDirty = true;
		}
		Canvas.SetDirty();
	}

	protected virtual void UpdateBounds(Vector2 position, Vector2 size)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: 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_0147: 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_008b: 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_0054: 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_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00af: 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_0119: Unknown result type (might be due to invalid IL or missing references)
		//IL_011a: 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_00c1: 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_00da: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		Position = position;
		if (elements.Count == 1)
		{
			UpdateBoundsOf(elements[0], position, size);
		}
		else
		{
			bool flag = IsInSameDirection(Direction.Right);
			float num = (flag ? ((Size.x != 0f) ? (size.x / Size.x) : size.x) : ((Size.y != 0f) ? (size.y / Size.y) : size.y));
			for (int i = 0; i < elements.Count; i++)
			{
				Vector2 size2 = elements[i].Size;
				if (flag)
				{
					size2.x *= num;
					size2.y = size.y;
					UpdateBoundsOf(elements[i], position, size2);
					position.x += size2.x;
				}
				else
				{
					size2.x = size.x;
					size2.y *= num;
					UpdateBoundsOf(elements[i], position, size2);
					position.y += size2.y;
				}
			}
		}
		Size = size;
	}

	protected virtual void UpdateLayout()
	{
		//IL_011c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0121: 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_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_0147: Unknown result type (might be due to invalid IL or missing references)
		//IL_014c: Unknown result type (might be due to invalid IL or missing references)
		//IL_015b: 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_0165: Unknown result type (might be due to invalid IL or missing references)
		//IL_019c: 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_03ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_03d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0322: Unknown result type (might be due to invalid IL or missing references)
		//IL_0327: Unknown result type (might be due to invalid IL or missing references)
		//IL_0329: Unknown result type (might be due to invalid IL or missing references)
		//IL_0330: 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_0188: Unknown result type (might be due to invalid IL or missing references)
		//IL_0367: Unknown result type (might be due to invalid IL or missing references)
		//IL_036e: Unknown result type (might be due to invalid IL or missing references)
		//IL_033f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0349: Unknown result type (might be due to invalid IL or missing references)
		//IL_0358: 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_01f7: 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_03bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_03c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_037d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0387: Unknown result type (might be due to invalid IL or missing references)
		//IL_0396: 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_0204: Unknown result type (might be due to invalid IL or missing references)
		//IL_0205: Unknown result type (might be due to invalid IL or missing references)
		//IL_0207: Unknown result type (might be due to invalid IL or missing references)
		//IL_0279: Unknown result type (might be due to invalid IL or missing references)
		//IL_028b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0294: Unknown result type (might be due to invalid IL or missing references)
		//IL_029b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0219: Unknown result type (might be due to invalid IL or missing references)
		//IL_022b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0234: 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_02b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0251: Unknown result type (might be due to invalid IL or missing references)
		//IL_0258: Unknown result type (might be due to invalid IL or missing references)
		//IL_0245: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c2: 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)
		if (!isDirty)
		{
			return;
		}
		elements.RemoveAll((IPanelGroupElement element) => element.IsNull() || element.Group != this);
		for (int num = elements.Count - 1; num >= 0; num--)
		{
			if (elements[num] is PanelGroup panelGroup)
			{
				panelGroup.UpdateLayout();
				int count = panelGroup.Count;
				switch (count)
				{
				case 0:
					elements.RemoveAt(num);
					break;
				case 1:
					elements[num] = panelGroup.elements[0];
					SetGroupFor(elements[num], this);
					num++;
					break;
				default:
					if (panelGroup.IsInSameDirection(direction))
					{
						elements.RemoveAt(num);
						elements.InsertRange(num, panelGroup.elements);
						int num2 = 0;
						while (num2 < count)
						{
							SetGroupFor(elements[num], this);
							num2++;
							num++;
						}
					}
					break;
				}
			}
		}
		Vector2 val = Vector2.zero;
		Vector2 val2 = Vector2.zero;
		bool flag = IsInSameDirection(Direction.Right);
		int num3 = -1;
		for (int i = 0; i < elements.Count; i++)
		{
			Vector2 size = elements[i].Size;
			Vector2 minSize = elements[i].MinSize;
			bool flag2 = false;
			if (size.x == 0f && minSize.x > 0f)
			{
				size.x = Mathf.Min(1f, minSize.x);
				flag2 = true;
			}
			if (size.y == 0f && minSize.y > 0f)
			{
				size.y = Mathf.Min(1f, minSize.y);
				flag2 = true;
			}
			if (flag2)
			{
				UpdateBoundsOf(elements[i], elements[i].Position, size);
			}
			if (i == 0)
			{
				val = size;
				val2 = minSize;
			}
			else if (flag)
			{
				val.x += size.x;
				val2.x += minSize.x;
				if (size.y < val.y)
				{
					val.y = size.y;
				}
				if (minSize.y > val2.y)
				{
					val2.y = minSize.y;
				}
			}
			else
			{
				val.y += size.y;
				val2.y += minSize.y;
				if (size.x < val.x)
				{
					val.x = size.x;
				}
				if (minSize.x > val2.x)
				{
					val2.x = minSize.x;
				}
			}
			if (elements[i] is Panel && ((Panel)elements[i]).Internal.IsDummy)
			{
				num3 = i;
			}
		}
		if (num3 >= 0)
		{
			Vector2 zero = Vector2.zero;
			if (val.x < Size.x)
			{
				zero.x = Size.x - val.x;
				val.x = Size.x;
			}
			if (val.y < Size.y)
			{
				zero.y = Size.y - val.y;
				val.y = Size.y;
			}
			RectTransform rectTransform = ((Panel)elements[num3]).RectTransform;
			rectTransform.sizeDelta += zero;
		}
		Size = val;
		MinSize = val2;
		isDirty = false;
	}

	protected void UpdateSurroundings(IPanelGroupElement left, IPanelGroupElement top, IPanelGroupElement right, IPanelGroupElement bottom)
	{
		surroundings[0] = left;
		surroundings[1] = top;
		surroundings[2] = right;
		surroundings[3] = bottom;
		bool flag = IsInSameDirection(Direction.Right);
		for (int i = 0; i < elements.Count; i++)
		{
			if (flag)
			{
				left = ((i > 0) ? elements[i - 1] : surroundings[0]);
				right = ((i < elements.Count - 1) ? elements[i + 1] : surroundings[2]);
			}
			else
			{
				bottom = ((i > 0) ? elements[i - 1] : surroundings[3]);
				top = ((i < elements.Count - 1) ? elements[i + 1] : surroundings[1]);
			}
			if (elements[i] is PanelGroup panelGroup)
			{
				panelGroup.UpdateSurroundings(left, top, right, bottom);
			}
			else
			{
				((Panel)elements[i]).Internal.UpdateSurroundings(left, top, right, bottom);
			}
		}
	}

	protected void ResizeElementTo(IPanelGroupElement element, Vector2 newSize, Direction horizontalDir, Direction verticalDir)
	{
		//IL_0026: 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_004a: 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_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: 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_008f: 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_00df: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: 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)
		if (horizontalDir != 0 && horizontalDir != Direction.Right)
		{
			horizontalDir = Direction.Right;
		}
		if (verticalDir != Direction.Bottom && verticalDir != Direction.Top)
		{
			verticalDir = Direction.Bottom;
		}
		Direction direction = horizontalDir.Opposite();
		Direction direction2 = verticalDir.Opposite();
		float num = newSize.x - element.Size.x;
		if (num > 0.0001f)
		{
			TryChangeSizeOf(element, horizontalDir, num);
			num = newSize.x - element.Size.x;
			if (num > 0.0001f)
			{
				TryChangeSizeOf(element, direction, num);
			}
		}
		else if (num < -0.0001f)
		{
			TryChangeSizeOf(element.GetSurroundingElement(horizontalDir), direction, 0f - num);
			num = newSize.x - element.Size.x;
			if (num < -0.0001f)
			{
				TryChangeSizeOf(element.GetSurroundingElement(direction), horizontalDir, 0f - num);
			}
		}
		float num2 = newSize.y - element.Size.y;
		if (num2 > 0.0001f)
		{
			TryChangeSizeOf(element, verticalDir, num2);
			num2 = newSize.y - element.Size.y;
			if (num2 > 0.0001f)
			{
				TryChangeSizeOf(element, direction2, num2);
			}
		}
		else if (num2 < -0.0001f)
		{
			TryChangeSizeOf(element.GetSurroundingElement(verticalDir), direction2, 0f - num2);
			num2 = newSize.y - element.Size.y;
			if (num2 < -0.0001f)
			{
				TryChangeSizeOf(element.GetSurroundingElement(direction2), verticalDir, 0f - num2);
			}
		}
	}

	protected virtual void EnsureMinimumSizeOf(IPanelGroupElement element)
	{
		//IL_0001: 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_0055: 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_002b: 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_007f: 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)
		float num = element.Size.x - element.MinSize.x;
		if (num < -0.0001f)
		{
			TryChangeSizeOf(element, Direction.Right, 0f - num);
			num = element.Size.x - element.MinSize.x;
			if (num < -0.0001f)
			{
				TryChangeSizeOf(element, Direction.Left, 0f - num);
			}
		}
		float num2 = element.Size.y - element.MinSize.y;
		if (num2 < -0.0001f)
		{
			TryChangeSizeOf(element, Direction.Bottom, 0f - num2);
			num2 = element.Size.y - element.MinSize.y;
			if (num2 < -0.0001f)
			{
				TryChangeSizeOf(element, Direction.Top, 0f - num2);
			}
		}
		if (element is PanelGroup panelGroup)
		{
			panelGroup.Internal.EnsureMinimumSize();
		}
	}

	protected void TryChangeSizeOf(IPanelGroupElement element, Direction direction, float deltaSize)
	{
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: 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_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00af: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bd: 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)
		if (element.IsNull() || deltaSize <= 0.0001f || element.GetSurroundingElement(direction).IsNull())
		{
			return;
		}
		resizePropsIndex = 0;
		IPanelGroupElement surroundingElement = element.GetSurroundingElement(direction);
		element = surroundingElement.GetSurroundingElement(direction.Opposite());
		AddResizeProperty(element);
		float deltaSize2 = TryChangeSizeOfInternal(surroundingElement, direction, deltaSize);
		if (resizePropsIndex > 1)
		{
			ResizeElementHelper(0, direction, deltaSize2);
			for (int i = 0; i < resizePropsIndex; i++)
			{
				ElementDirtyProperties elementDirtyProperties = resizeProperties[i];
				Vector2 position = elementDirtyProperties.element.Position + new Vector2(elementDirtyProperties.posX, elementDirtyProperties.posY);
				Vector2 size = elementDirtyProperties.element.Size + new Vector2(elementDirtyProperties.sizeX, elementDirtyProperties.sizeY);
				UpdateBoundsOf(elementDirtyProperties.element, position, size);
			}
		}
	}

	protected float TryChangeSizeOfInternal(IPanelGroupElement element, Direction direction, float deltaSize)
	{
		//IL_0016: 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_003b: Unknown result type (might be due to invalid IL or missing references)
		int num = resizePropsIndex;
		AddResizeProperty(element);
		float num2 = ((direction != 0 && direction != Direction.Right) ? (element.Size.y - element.MinSize.y) : (element.Size.x - element.MinSize.x));
		if (num2 > 0.0001f)
		{
			if (num2 >= deltaSize)
			{
				num2 = deltaSize;
				deltaSize = 0f;
			}
			else
			{
				deltaSize -= num2;
			}
			ResizeElementHelper(num, direction.Opposite(), 0f - num2);
		}
		else
		{
			num2 = 0f;
		}
		if (deltaSize > 0.0001f)
		{
			IPanelGroupElement surroundingElement = element.GetSurroundingElement(direction);
			if (!surroundingElement.IsNull())
			{
				if (surroundingElement.Group != element.Group)
				{
					AddResizeProperty(surroundingElement.GetSurroundingElement(direction.Opposite()));
				}
				float num3 = TryChangeSizeOfInternal(surroundingElement, direction, deltaSize);
				if (num3 > 0.0001f)
				{
					if (surroundingElement.Group == element.Group)
					{
						switch (direction)
						{
						case Direction.Left:
							resizeProperties[num].posX -= num3;
							break;
						case Direction.Top:
							resizeProperties[num].posY += num3;
							break;
						case Direction.Right:
							resizeProperties[num].posX += num3;
							break;
						default:
							resizeProperties[num].posY -= num3;
							break;
						}
						num2 += num3;
					}
					else
					{
						ResizeElementHelper(num + 1, direction, num3);
					}
				}
				else if (num2 == 0f)
				{
					resizePropsIndex = num;
				}
				else
				{
					resizePropsIndex = num + 1;
				}
			}
			else if (num2 == 0f)
			{
				resizePropsIndex = num;
			}
		}
		return num2;
	}

	private void AddResizeProperty(IPanelGroupElement element)
	{
		if (resizeProperties == null)
		{
			resizeProperties = new List<ElementDirtyProperties>
			{
				new ElementDirtyProperties(element),
				new ElementDirtyProperties()
			};
		}
		else if (resizePropsIndex == resizeProperties.Count)
		{
			resizeProperties.Add(new ElementDirtyProperties(element));
		}
		else
		{
			resizeProperties[resizePropsIndex].Reset(element);
		}
		resizePropsIndex++;
	}

	private void ResizeElementHelper(int resizePropsIndex, Direction direction, float deltaSize)
	{
		ElementDirtyProperties elementDirtyProperties = resizeProperties[resizePropsIndex];
		switch (direction)
		{
		case Direction.Left:
			elementDirtyProperties.posX -= deltaSize;
			elementDirtyProperties.sizeX += deltaSize;
			break;
		case Direction.Top:
			elementDirtyProperties.sizeY += deltaSize;
			break;
		case Direction.Right:
			elementDirtyProperties.sizeX += deltaSize;
			break;
		default:
			elementDirtyProperties.posY -= deltaSize;
			elementDirtyProperties.sizeY += deltaSize;
			break;
		}
	}

	protected void ReplaceElement(IPanelGroupElement beforeElement, IPanelGroupElement afterElement)
	{
		if (beforeElement == afterElement)
		{
			return;
		}
		if (beforeElement.IsNull() || afterElement.IsNull())
		{
			Debug.LogError((object)"Invalid argument!");
			return;
		}
		int num = elements.IndexOf(beforeElement);
		if (num < 0)
		{
			Debug.LogError((object)"Invalid index!");
			return;
		}
		if (beforeElement.Group == this)
		{
			Canvas.UnanchoredPanelGroup.AddElement(beforeElement);
		}
		AddElementAt(num, afterElement);
	}

	public void ResizeTo(Vector2 newSize, Direction horizontalDir = Direction.Right, Direction verticalDir = Direction.Bottom)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		if (Group != null)
		{
			Group.ResizeElementTo(this, newSize, horizontalDir, verticalDir);
		}
	}

	public void DockToRoot(Direction direction)
	{
		PanelManager.Instance.AnchorPanel(this, Canvas, direction);
	}

	public void DockToPanel(IPanelGroupElement anchor, Direction direction)
	{
		PanelManager.Instance.AnchorPanel(this, anchor, direction);
	}

	public void AddElement(IPanelGroupElement element)
	{
		AddElementAt(elements.Count, element);
	}

	public void AddElementBefore(IPanelGroupElement pivot, IPanelGroupElement element)
	{
		AddElementAt(elements.IndexOf(pivot), element);
	}

	public void AddElementAfter(IPanelGroupElement pivot, IPanelGroupElement element)
	{
		AddElementAt(elements.IndexOf(pivot) + 1, element);
	}

	protected void AddElementAt(int index, IPanelGroupElement element)
	{
		if (element.IsNull())
		{
			Debug.LogError((object)"Invalid argument!");
			return;
		}
		if (index < 0 || index > elements.Count)
		{
			Debug.LogError((object)"Invalid index!");
			return;
		}
		int num = elements.IndexOf(element);
		if (num >= 0 && element.Group != this)
		{
			if (index > num)
			{
				index--;
			}
			elements.RemoveAt(num);
			num = -1;
		}
		if (num == index)
		{
			return;
		}
		if (element.Group != null)
		{
			element.Group.SetDirty();
		}
		if (num < 0)
		{
			elements.Insert(index, element);
			SetGroupFor(element, this);
		}
		else if (num != index)
		{
			if (num > index)
			{
				num++;
			}
			elements.Insert(index, element);
			elements.RemoveAt(num);
		}
		SetDirty();
	}

	protected void SetGroupFor(IPanelGroupElement element, PanelGroup group)
	{
		Panel panel = element as Panel;
		if ((Object)(object)panel != (Object)null)
		{
			panel.Internal.Group = group;
			if ((Object)(object)((Transform)panel.RectTransform).parent != (Object)(object)group.Canvas.RectTransform)
			{
				((Transform)panel.RectTransform).SetParent((Transform)(object)group.Canvas.RectTransform, false);
			}
		}
		else
		{
			((PanelGroup)element).Group = group;
		}
	}

	protected void UpdateBoundsOf(IPanelGroupElement element, Vector2 position, Vector2 size)
	{
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		if (element is Panel)
		{
			((Panel)element).Internal.UpdateBounds(position, size);
		}
		else
		{
			((PanelGroup)element).UpdateBounds(position, size);
		}
	}

	public override string ToString()
	{
		if (direction == Direction.Left || direction == Direction.Right)
		{
			return "Horizontal Group";
		}
		return "Vertical Group";
	}

	public void PrintHierarchy()
	{
		Debug.Log((object)ToTree(0, new StringBuilder(500)));
	}

	private string ToTree(int depth, StringBuilder treeBuilder)
	{
		string text = string.Empty;
		for (int i = 0; i <= depth; i++)
		{
			text += "-";
		}
		treeBuilder.Append(depth).Append(text).Append(' ')
			.Append(this)
			.Append(Environment.NewLine);
		foreach (IPanelGroupElement element in elements)
		{
			if (element is Panel)
			{
				treeBuilder.Append(depth + 1).Append(text).Append("- ")
					.Append(element)
					.Append(Environment.NewLine);
			}
			else
			{
				((PanelGroup)element).ToTree(depth + 1, treeBuilder);
			}
		}
		if (depth != 0)
		{
			return null;
		}
		return treeBuilder.ToString();
	}
}
public class UnanchoredPanelGroup : PanelGroup
{
	public UnanchoredPanelGroup(DynamicPanelsCanvas canvas)
		: base(canvas, Direction.None)
	{
	}

	protected override void UpdateBounds(Vector2 position, Vector2 size)
	{
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		for (int i = 0; i < elements.Count; i++)
		{
			if (elements[i] is Panel)
			{
				RestrictPanelToBounds((Panel)elements[i], size);
			}
		}
	}

	protected override void UpdateLayout()
	{
		bool num = isDirty;
		base.UpdateLayout();
		if (!num)
		{
			return;
		}
		for (int num2 = elements.Count - 1; num2 >= 0; num2--)
		{
			if (elements[num2] is PanelGroup panelGroup)
			{
				elements.RemoveAt(num2);
				int num3 = 0;
				while (num3 < panelGroup.Count)
				{
					elements.Insert(num2, panelGroup[num3]);
					SetGroupFor(elements[num2], this);
					num3++;
					num2++;
				}
			}
		}
	}

	protected override void EnsureMinimumSizeOf(IPanelGroupElement element)
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: 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_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: 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)
		Panel panel = element as Panel;
		if (Object.op_Implicit((Object)(object)panel))
		{
			Vector2 position = panel.Position;
			Vector2 size = panel.Size;
			Vector2 minSize = panel.MinSize;
			bool flag = false;
			float num = size.x - minSize.x;
			if (num < -0.0001f)
			{
				size.x -= num;
				position.x += num * 0.5f;
				flag = true;
			}
			float num2 = size.y - minSize.y;
			if (num2 < -0.0001f)
			{
				size.y -= num2;
				position.y += num2 * 0.5f;
				flag = true;
			}
			if (flag)
			{
				panel.Internal.UpdateBounds(position, size);
				RestrictPanelToBounds(panel);
			}
		}
	}

	public void RestrictPanelToBounds(Panel panel)
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		RestrictPanelToBounds(panel, base.Canvas.Size);
	}

	protected void RestrictPanelToBounds(Panel panel, Vector2 canvasSize)
	{
		//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_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: 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_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: 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_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_00b2: 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)
		Vector2 anchoredPosition = panel.RectTransform.anchoredPosition;
		Vector2 sizeDelta = panel.RectTransform.sizeDelta;
		if (anchoredPosition.y + sizeDelta.y < 50f)
		{
			anchoredPosition.y = 50f - sizeDelta.y;
		}
		else if (anchoredPosition.y + sizeDelta.y > canvasSize.y)
		{
			anchoredPosition.y = canvasSize.y - sizeDelta.y;
		}
		if (anchoredPosition.x < 0f)
		{
			anchoredPosition.x = 0f;
		}
		else if (canvasSize.x - anchoredPosition.x < 125f)
		{
			anchoredPosition.x = canvasSize.x - 125f;
		}
		panel.RectTransform.anchoredPosition = anchoredPosition;
	}

	public override string ToString()
	{
		return "Unanchored Panel Group";
	}
}
[RequireComponent(typeof(CanvasRenderer))]
public class NonDrawingGraphic : Graphic
{
	public override void SetMaterialDirty()
	{
	}

	public override void SetVerticesDirty()
	{
	}

	protected override void OnPopulateMesh(VertexHelper vh)
	{
		vh.Clear();
	}
}
public class PanelCursorHandler : MonoBehaviour
{
	private static PanelCursorHandler instance;

	private PanelResizeHelper activeResizeHelper;

	private PointerEventData activeEventData;

	private bool isResizing;

	private Vector2 prevPointerPos;

	[SerializeField]
	private Texture2D horizontalCursor;

	[SerializeField]
	private Texture2D verticalCursor;

	[SerializeField]
	private Texture2D diagonalCursorTopLeft;

	[SerializeField]
	private Texture2D diagonalCursorTopRight;

	private void Awake()
	{
		instance = this;
	}

	public static void OnPointerEnter(PanelResizeHelper resizeHelper, PointerEventData eventData)
	{
		if (!((Object)(object)instance == (Object)null))
		{
			instance.activeResizeHelper = resizeHelper;
			instance.activeEventData = eventData;
		}
	}

	public static void OnPointerExit(PanelResizeHelper resizeHelper)
	{
		if (!((Object)(object)instance == (Object)null) && (Object)(object)instance.activeResizeHelper == (Object)(object)resizeHelper)
		{
			instance.activeResizeHelper = null;
			instance.activeEventData = null;
			if (!instance.isResizing)
			{
				SetDefaultCursor();
			}
		}
	}

	public static void OnBeginResize(Direction primary, Direction secondary)
	{
		if (!((Object)(object)instance == (Object)null))
		{
			instance.isResizing = true;
			instance.UpdateCursor(primary, secondary);
		}
	}

	public static void OnEndResize()
	{
		//IL_0040: 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)
		if (!((Object)(object)instance == (Object)null))
		{
			instance.isResizing = false;
			if ((Object)(object)instance.activeResizeHelper == (Object)null)
			{
				SetDefaultCursor();
			}
			else
			{
				instance.prevPointerPos = new Vector2(-1f, -1f);
			}
		}
	}

	private void Update()
	{
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_0028: 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_009c: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		if (isResizing || !((Object)(object)activeResizeHelper != (Object)null))
		{
			return;
		}
		Vector2 position = activeEventData.position;
		if (!(position != prevPointerPos))
		{
			return;
		}
		if (activeEventData.dragging)
		{
			SetDefaultCursor();
		}
		else
		{
			Direction direction = activeResizeHelper.Direction;
			Direction secondDirection = activeResizeHelper.GetSecondDirection(activeEventData.position);
			if (activeResizeHelper.Panel.CanResizeInDirection(direction))
			{
				UpdateCursor(direction, secondDirection);
			}
			else if (secondDirection != Direction.None)
			{
				UpdateCursor(secondDirection, Direction.None);
			}
			else
			{
				SetDefaultCursor();
			}
		}
		prevPointerPos = position;
	}

	private static void SetDefaultCursor()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		Cursor.SetCursor((Texture2D)null, Vector2.zero, (CursorMode)0);
	}

	private void UpdateCursor(Direction primary, Direction secondary)
	{
		//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
		Texture2D val = (Texture2D)(primary switch
		{
			Direction.Left => secondary switch
			{
				Direction.Top => diagonalCursorTopLeft, 
				Direction.Bottom => diagonalCursorTopRight, 
				_ => horizontalCursor, 
			}, 
			Direction.Right => secondary switch
			{
				Direction.Top => diagonalCursorTopRight, 
				Direction.Bottom => diagonalCursorTopLeft, 
				_ => horizontalCursor, 
			}, 
			Direction.Top => secondary switch
			{
				Direction.Left => diagonalCursorTopLeft, 
				Direction.Right => diagonalCursorTopRight, 
				_ => verticalCursor, 
			}, 
			_ => secondary switch
			{
				Direction.Left => diagonalCursorTopRight, 
				Direction.Right => diagonalCursorTopLeft, 
				_ => verticalCursor, 
			}, 
		});
		Cursor.SetCursor(val, new Vector2((float)((Texture)val).width * 0.5f, (float)((Texture)val).height * 0.5f), (CursorMode)0);
	}
}
[DisallowMultipleComponent]
public class PanelHeader : MonoBehaviour, IBeginDragHandler, IEventSystemHandler, IDragHandler, IEndDragHandler
{
	[SerializeField]
	private Panel m_panel;

	private int pointerId = -98765;

	private Vector2 m_initialTouchPos;

	public Panel Panel => m_panel;

	internal Vector2 InitialTouchPos => m_initialTouchPos;

	private void OnEnable()
	{
		pointerId = -98765;
	}

	public void OnBeginDrag(PointerEventData eventData)
	{
		//IL_0032: Unknown result type (might be due to invalid IL or missing references)
		if (!PanelManager.Instance.OnBeginPanelTranslate(m_panel))
		{
			eventData.pointerDrag = null;
			return;
		}
		pointerId = eventData.pointerId;
		RectTransformUtility.ScreenPointToLocalPointInRectangle(m_panel.RectTransform, eventData.position, m_panel.Canvas.Internal.worldCamera, ref m_initialTouchPos);
	}

	public void OnDrag(PointerEventData eventData)
	{
		if (eventData.pointerId != pointerId)
		{
			eventData.pointerDrag = null;
		}
		else
		{
			PanelManager.Instance.OnPanelTranslate(this, eventData);
		}
	}

	public void OnEndDrag(PointerEventData eventData)
	{
		if (eventData.pointerId == pointerId)
		{
			pointerId = -98765;
			PanelManager.Instance.OnEndPanelTranslate(m_panel);
		}
	}

	public void Stop()
	{
		pointerId = -98765;
	}
}
public static class PanelNotificationCenter
{
	internal static class Internal
	{
		public static void PanelCreated(Panel panel)
		{
			if (IsPanelRegistered(panel))
			{
				return;
			}
			panels.Add(panel);
			panel.Internal.ChangeCloseButtonVisibility(m_onPanelClosed != null);
			if (PanelNotificationCenter.OnPanelCreated != null)
			{
				PanelNotificationCenter.OnPanelCreated(panel);
			}
			if (((Component)panel).gameObject.activeInHierarchy)
			{
				if (PanelNotificationCenter.OnPanelBecameActive != null)
				{
					PanelNotificationCenter.OnPanelBecameActive(panel);
				}
			}
			else if (PanelNotificationCenter.OnPanelBecameInactive != null)
			{
				PanelNotificationCenter.OnPanelBecameInactive(panel);
			}
		}

		public static void PanelDestroyed(Panel panel)
		{
			if (panels.Remove(panel) && PanelNotificationCenter.OnPanelDestroyed != null)
			{
				PanelNotificationCenter.OnPanelDestroyed(panel);
			}
		}

		public static void PanelBecameActive(Panel panel)
		{
			if (IsPanelRegistered(panel) && PanelNotificationCenter.OnPanelBecameActive != null)
			{
				PanelNotificationCenter.OnPanelBecameActive(panel);
			}
		}

		public static void PanelBecameInactive(Panel panel)
		{
			if (IsPanelRegistered(panel) && PanelNotificationCenter.OnPanelBecameInactive != null)
			{
				PanelNotificationCenter.OnPanelBecameInactive(panel);
			}
		}

		public static void PanelClosed(Panel panel)
		{
			if (m_onPanelClosed != null)
			{
				m_onPanelClosed(panel);
			}
		}

		public static void TabDragStateChanged(PanelTab tab, bool isDragging)
		{
			if (isDragging)
			{
				if (PanelNotificationCenter.OnStartedDraggingTab != null)
				{
					PanelNotificationCenter.OnStartedDraggingTab(tab);
				}
			}
			else if (PanelNotificationCenter.OnStoppedDraggingTab != null)
			{
				PanelNotificationCenter.OnStoppedDraggingTab(tab);
			}
		}

		public static void ActiveTabChanged(PanelTab tab)
		{
			if (PanelNotificationCenter.OnActiveTabChanged != null)
			{
				PanelNotificationCenter.OnActiveTabChanged(tab);
			}
		}

		public static void TabIDChanged(PanelTab tab, string previousID, string newID)
		{
			if (!idToTab.ContainsValue(tab))
			{
				tab.Internal.ChangeCloseButtonVisibility(m_onTabClosed != null);
				if (PanelNotificationCenter.OnTabCreated != null)
				{
					PanelNotificationCenter.OnTabCreated(tab);
				}
			}
			if (!string.IsNullOrEmpty(previousID) && idToTab.TryGetValue(previousID, out var value) && (Object)(object)value == (Object)(object)tab)
			{
				idToTab.Remove(previousID);
			}
			if (!string.IsNullOrEmpty(newID))
			{
				idToTab[newID] = tab;
			}
			else if (PanelNotificationCenter.OnTabDestroyed != null)
			{
				PanelNotificationCenter.OnTabDestroyed(tab);
			}
		}

		public static void TabClosed(PanelTab tab)
		{
			if (m_onTabClosed != null)
			{
				m_onTabClosed(tab);
			}
		}

		private static bool IsPanelRegistered(Panel panel)
		{
			for (int num = panels.Count - 1; num >= 0; num--)
			{
				if ((Object)(object)panels[num] == (Object)(object)panel)
				{
					return true;
				}
			}
			return false;
		}
	}

	public delegate void PanelDelegate(Panel panel);

	public delegate void TabDelegate(PanelTab tab);

	private static PanelDelegate m_onPanelClosed;

	private static TabDelegate m_onTabClosed;

	private static readonly List<Panel> panels = new List<Panel>(32);

	private static readonly Dictionary<string, PanelTab> idToTab = new Dictionary<string, PanelTab>(32);

	public static int NumberOfPanels => panels.Count;

	public static event PanelDelegate OnPanelCreated;

	public static event PanelDelegate OnPanelDestroyed;

	public static event PanelDelegate OnPanelBecameActive;

	public static event PanelDelegate OnPanelBecameInactive;

	public static event TabDelegate OnTabCreated;

	public static event TabDelegate OnTabDestroyed;

	public static event TabDelegate OnActiveTabChanged;

	public static event TabDelegate OnStartedDraggingTab;

	public static event TabDelegate OnStoppedDraggingTab;

	public static event PanelDelegate OnPanelClosed
	{
		add
		{
			if (value == null)
			{
				return;
			}
			if (m_onPanelClosed == null)
			{
				for (int num = panels.Count - 1; num >= 0; num--)
				{
					panels[num].Internal.ChangeCloseButtonVisibility(isVisible: true);
				}
			}
			m_onPanelClosed = (PanelDelegate)Delegate.Combine(m_onPanelClosed, value);
		}
		remove
		{
			if (value == null || m_onPanelClosed == null)
			{
				return;
			}
			m_onPanelClosed = (PanelDelegate)Delegate.Remove(m_onPanelClosed, value);
			if (m_onPanelClosed == null)
			{
				for (int num = panels.Count - 1; num >= 0; num--)
				{
					panels[num].Internal.ChangeCloseButtonVisibility(isVisible: false);
				}
			}
		}
	}

	public static event TabDelegate OnTabClosed
	{
		add
		{
			if (value == null)
			{
				return;
			}
			if (m_onTabClosed == null)
			{
				foreach (PanelTab value2 in idToTab.Values)
				{
					value2.Internal.ChangeCloseButtonVisibility(isVisible: true);
				}
			}
			m_onTabClosed = (TabDelegate)Delegate.Combine(m_onTabClosed, value);
		}
		remove
		{
			if (value == null || m_onTabClosed == null)
			{
				return;
			}
			m_onTabClosed = (TabDelegate)Delegate.Remove(m_onTabClosed, value);
			if (m_onTabClosed != null)
			{
				return;
			}
			foreach (PanelTab value2 in idToTab.Values)
			{
				value2.Internal.ChangeCloseButtonVisibility(isVisible: false);
			}
		}
	}

	public static Panel GetPanel(int panelIndex)
	{
		if (panelIndex >= 0 && panelIndex < panels.Count)
		{
			return panels[panelIndex];
		}
		return null;
	}

	public static bool TryGetTab(string tabID, out PanelTab tab)
	{
		if (string.IsNullOrEmpty(tabID))
		{
			tab = null;
			return false;
		}
		return idToTab.TryGetValue(tabID, out tab);
	}
}
[DisallowMultipleComponent]
public class PanelResizeHelper : MonoBehaviour, IBeginDragHandler, IEventSystemHandler, IDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler
{
	private Panel m_panel;

	private Direction m_direction;

	private Direction secondDirection;

	private PanelResizeHelper helperBefore;

	private PanelResizeHelper helperAfter;

	private int pointerId = -98765;

	public Panel Panel => m_panel;

	public RectTransform RectTransform { get; private set; }

	public Direction Direction => m_direction;

	private void Awake()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		RectTransform = (RectTransform)((Component)this).transform;
	}

	private void OnEnable()
	{
		pointerId = -98765;
	}

	public void Initialize(Panel panel, Direction direction, PanelResizeHelper helperBefore, PanelResizeHelper helperAfter)
	{
		m_panel = panel;
		m_direction = direction;
		this.helperBefore = helperBefore;
		this.helperAfter = helperAfter;
	}

	public void OnPointerEnter(PointerEventData eventData)
	{
		PanelCursorHandler.OnPointerEnter(this, eventData);
	}

	public void OnPointerExit(PointerEventData eventData)
	{
		PanelCursorHandler.OnPointerExit(this);
	}

	public void OnBeginDrag(PointerEventData eventData)
	{
		//IL_002a: Unknown result type (might be due to invalid IL or missing references)
		if (!m_panel.CanResizeInDirection(m_direction))
		{
			eventData.pointerDrag = null;
			return;
		}
		pointerId = eventData.pointerId;
		secondDirection = GetSecondDirection(eventData.pressPosition);
		PanelCursorHandler.OnBeginResize(m_direction, secondDirection);
	}

	public void OnDrag(PointerEventData eventData)
	{
		//IL_0021: 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)
		if (eventData.pointerId == pointerId)
		{
			m_panel.Internal.OnResize(m_direction, eventData.position);
			if (secondDirection != Direction.None)
			{
				m_panel.Internal.OnResize(secondDirection, eventData.position);
			}
		}
	}

	public void OnEndDrag(PointerEventData eventData)
	{
		if (eventData.pointerId == pointerId)
		{
			if (!m_panel.IsDocked)
			{
				((UnanchoredPanelGroup)m_panel.Group).RestrictPanelToBounds(m_panel);
			}
			pointerId = -98765;
			PanelCursorHandler.OnEndResize();
		}
	}

	public Direction GetSecondDirection(Vector2 pointerPosition)
	{
		//IL_001a: 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)
		if (m_panel.IsDocked)
		{
			return Direction.None;
		}
		Direction direction = (RectTransformUtility.RectangleContainsScreenPoint(helperBefore.RectTransform, pointerPosition, m_panel.Canvas.Internal.worldCamera) ? helperBefore.m_direction : ((!RectTransformUtility.RectangleContainsScreenPoint(helperAfter.RectTransform, pointerPosition, m_panel.Canvas.Internal.worldCamera)) ? Direction.None : helperAfter.m_direction));
		if (!m_panel.CanResizeInDirection(direction))
		{
			direction = Direction.None;
		}
		return direction;
	}

	public void Stop()
	{
		if (pointerId != -98765)
		{
			if (!m_panel.IsDocked)
			{
				((UnanchoredPanelGroup)m_panel.Group).RestrictPanelToBounds(m_panel);
			}
			pointerId = -98765;
			PanelCursorHandler.OnEndResize();
		}
	}
}
public static class PanelSerialization
{
	[Serializable]
	private class SerializedCanvas
	{
		public bool active;

		public bool useFreeSpace;

		public SerializedPanelGroup rootPanelGroup;

		public SerializedPanelGroup unanchoredPanelGroup;
	}

	[Serializable]
	private abstract class ISerializedElement
	{
		public SerializedVector2 size;
	}

	[Serializable]
	private class SerializedPanelGroup : ISerializedElement
	{
		public bool horizontal;

		public ISerializedElement[] children;
	}

	[Serializable]
	private class SerializedDummyPanel : ISerializedElement
	{
	}

	[Serializable]
	private class SerializedPanel : ISerializedElement
	{
		public int activeTab;

		public SerializedPanelTab[] tabs;

		public SerializedVector2 floatingSize;
	}

	[Serializable]
	private class SerializedUnanchoredPanel : SerializedPanel
	{
		public bool active;

		public SerializedVector2 position;
	}

	[Serializable]
	private class SerializedPanelTab
	{
		public string id;
	}

	[Serializable]
	private struct SerializedVector2
	{
		public float x;

		public float y;

		public static implicit operator Vector2(SerializedVector2 v)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			return new Vector2(v.x, v.y);
		}

		public static implicit operator SerializedVector2(Vector2 v)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			SerializedVector2 result = default(SerializedVector2);
			result.x = v.x;
			result.y = v.y;
			return result;
		}
	}

	private struct GroupElementSizeHolder
	{
		public IPanelGroupElement element;

		public Vector2 size;

		public GroupElementSizeHolder(IPanelGroupElement element, Vector2 size)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			this.element = element;
			this.size = size;
		}
	}

	private static readonly List<SerializedPanelTab> tabsTemp = new List<SerializedPanelTab>(4);

	private static readonly List<GroupElementSizeHolder> sizesHolder = new List<GroupElementSizeHolder>(4);

	public static void SerializeCanvas(DynamicPanelsCanvas canvas)
	{
		byte[] array = SerializeCanvasToArray(canvas);
		if (array == null || array.Length == 0)
		{
			Debug.LogError((object)"Couldn't serialize!");
			return;
		}
		PlayerPrefs.SetString(canvas.ID, Convert.ToBase64String(array));
		PlayerPrefs.Save();
	}

	public static void DeserializeCanvas(DynamicPanelsCanvas canvas)
	{
		DeserializeCanvasFromArray(canvas, Convert.FromBase64String(PlayerPrefs.GetString(canvas.ID, string.Empty)));
	}

	public static byte[] SerializeCanvasToArray(DynamicPanelsCanvas canvas)
	{
		canvas.ForceRebuildLayoutImmediate();
		BinaryFormatter binaryFormatter = new BinaryFormatter();
		using MemoryStream memoryStream = new MemoryStream();
		binaryFormatter.Serialize(memoryStream, new SerializedCanvas
		{
			active = ((Component)canvas).gameObject.activeSelf,
			useFreeSpace = canvas.LeaveFreeSpace,
			rootPanelGroup = (Serialize(canvas.RootPanelGroup) as SerializedPanelGroup),
			unanchoredPanelGroup = (Serialize(canvas.UnanchoredPanelGroup) as SerializedPanelGroup)
		});
		return memoryStream.ToArray();
	}

	public static void DeserializeCanvasFromArray(DynamicPanelsCanvas canvas, byte[] data)
	{
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		if (data == null || data.Length == 0)
		{
			Debug.LogError((object)"Data is null!");
			return;
		}
		BinaryFormatter binaryFormatter = new BinaryFormatter();
		SerializedCanvas serializedCanvas;
		using (MemoryStream serializationStream = new MemoryStream(data))
		{
			serializedCanvas = binaryFormatter.Deserialize(serializationStream) as SerializedCanvas;
		}
		if (serializedCanvas == null)
		{
			return;
		}
		sizesHolder.Clear();
		canvas.LeaveFreeSpace = serializedCanvas.useFreeSpace;
		if (serializedCanvas.rootPanelGroup != null)
		{
			PanelGroup rootPanelGroup = canvas.RootPanelGroup;
			ISerializedElement[] children = serializedCanvas.rootPanelGroup.children;
			for (int num = children.Length - 1; num >= 0; num--)
			{
				IPanelGroupElement panelGroupElement = Deserialize(canvas, children[num]);
				if (panelGroupElement != null)
				{
					if (rootPanelGroup.Count == 0)
					{
						rootPanelGroup.AddElement(panelGroupElement);
					}
					else
					{
						rootPanelGroup.AddElementBefore(rootPanelGroup[0], panelGroupElement);
					}
					sizesHolder.Insert(0, new GroupElementSizeHolder(panelGroupElement, children[num].size));
				}
			}
		}
		if (sizesHolder.Count > 0)
		{
			canvas.ForceRebuildLayoutImmediate();
			for (int i = 0; i < sizesHolder.Count; i++)
			{
				sizesHolder[i].element.ResizeTo(sizesHolder[i].size, Direction.Right, Direction.Top);
			}
		}
		if (serializedCanvas.unanchoredPanelGroup != null)
		{
			ISerializedElement[] children2 = serializedCanvas.unanchoredPanelGroup.children;
			for (int j = 0; j < children2.Length; j++)
			{
				if (children2[j] is SerializedUnanchoredPanel element)
				{
					Panel panel = Deserialize(canvas, element) as Panel;
					if ((Object)(object)panel != (Object)null)
					{
						panel.Detach();
						canvas.UnanchoredPanelGroup.RestrictPanelToBounds(panel);
					}
				}
			}
		}
		for (int k = 0; k < canvas.UnanchoredPanelGroup.Count; k++)
		{
			Panel panel2 = canvas.UnanchoredPanelGroup[k] as Panel;
			if ((Object)(object)panel2 != (Object)null)
			{
				((Transform)panel2.RectTransform).SetAsLastSibling();
			}
		}
		((Component)canvas).gameObject.SetActive(serializedCanvas.active);
	}

	private static ISerializedElement Serialize(IPanelGroupElement element)
	{
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_018f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		//IL_011a: Unknown result type (might be due to invalid IL or missing references)
		//IL_012b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
		if (element == null)
		{
			return null;
		}
		if (element is Panel)
		{
			Panel panel = (Panel)element;
			if (panel.Internal.IsDummy)
			{
				return new SerializedDummyPanel
				{
					size = panel.Size
				};
			}
			tabsTemp.Clear();
			for (int i = 0; i < panel.NumberOfTabs; i++)
			{
				PanelTab panelTab = panel[i];
				tabsTemp.Add(new SerializedPanelTab
				{
					id = panelTab.ID
				});
			}
			if (tabsTemp.Count == 0)
			{
				return null;
			}
			if (panel.IsDocked)
			{
				return new SerializedPanel
				{
					activeTab = panel.ActiveTab,
					tabs = tabsTemp.ToArray(),
					size = panel.Size,
					floatingSize = panel.FloatingSize
				};
			}
			return new SerializedUnanchoredPanel
			{
				active = ((Component)panel).gameObject.activeSelf,
				activeTab = panel.ActiveTab,
				tabs = tabsTemp.ToArray(),
				position = panel.Position,
				size = panel.Size,
				floatingSize = panel.Size
			};
		}
		PanelGroup panelGroup = (PanelGroup)element;
		ISerializedElement[] array = new ISerializedElement[panelGroup.Count];
		for (int j = 0; j < panelGroup.Count; j++)
		{
			array[j] = Serialize(panelGroup[j]);
		}
		return new SerializedPanelGroup
		{
			horizontal = panelGroup.IsInSameDirection(Direction.Right),
			children = array,
			size = panelGroup.Size
		};
	}

	private static IPanelGroupElement Deserialize(DynamicPanelsCanvas canvas, ISerializedElement element)
	{
		//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_0171: Unknown result type (might be due to invalid IL or missing references)
		if (element == null)
		{
			return null;
		}
		if (element is SerializedDummyPanel)
		{
			return canvas.Internal.DummyPanel;
		}
		if (element is SerializedPanel)
		{
			SerializedPanel serializedPanel = (SerializedPanel)element;
			Panel panel = null;
			SerializedPanelTab[] tabs = serializedPanel.tabs;
			for (int i = 0; i < tabs.Length; i++)
			{
				if (PanelNotificationCenter.TryGetTab(tabs[i].id, out var tab))
				{
					if ((Object)(object)panel == (Object)null)
					{
						panel = tab.Detach();
						canvas.UnanchoredPanelGroup.AddElement(panel);
					}
					else
					{
						panel.AddTab(tab);
					}
				}
			}
			if ((Object)(object)panel != (Object)null)
			{
				if (serializedPanel.activeTab < tabs.Length)
				{
					int tabIndex = panel.GetTabIndex(tabs[serializedPanel.activeTab].id);
					if (tabIndex >= 0)
					{
						panel.ActiveTab = tabIndex;
					}
				}
				if (serializedPanel is SerializedUnanchoredPanel)
				{
					SerializedUnanchoredPanel serializedUnanchoredPanel = (SerializedUnanchoredPanel)serializedPanel;
					panel.RectTransform.anchoredPosition = serializedUnanchoredPanel.position;
					((Component)panel).gameObject.SetActive(serializedUnanchoredPanel.active);
				}
				panel.FloatingSize = serializedPanel.floatingSize;
			}
			return panel;
		}
		if (element is SerializedPanelGroup)
		{
			SerializedPanelGroup serializedPanelGroup = (SerializedPanelGroup)element;
			ISerializedElement[] children = serializedPanelGroup.children;
			if (children == null || children.Length == 0)
			{
				return null;
			}
			PanelGroup panelGroup = new PanelGroup(canvas, (!serializedPanelGroup.horizontal) ? Direction.Top : Direction.Right);
			for (int j = 0; j < children.Length; j++)
			{
				if (children[j] != null)
				{
					IPanelGroupElement panelGroupElement = Deserialize(canvas, children[j]);
					if (panelGroupElement != null)
					{
						panelGroup.AddElement(panelGroupElement);
						sizesHolder.Add(new GroupElementSizeHolder(panelGroupElement, children[j].size));
					}
				}
			}
			if (panelGroup.Count > 0)
			{
				return panelGroup;
			}
		}
		return null;
	}
}
[DisallowMultipleComponent]
public class PanelTab : MonoBehaviour, IPointerClickHandler, IEventSystemHandler, IBeginDragHandler, IDragHandler, IEndDragHandler
{
	internal class InternalSettings
	{
		private readonly PanelTab tab;

		public readonly RectTransform RectTransform;

		public bool IsBeingDetached => tab.pointerId != -98765;

		public InternalSettings(PanelTab tab)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected O, but got Unknown
			this.tab = tab;
			RectTransform = (RectTransform)((Component)tab).transform;
		}

		public void Initialize(Panel panel, RectTransform content)
		{
			tab.m_panel = panel;
			tab.Content = content;
		}

		public void ChangeCloseButtonVisibility(bool isVisible)
		{
			if (Object.op_Implicit((Object)(object)tab.closeButton) && isVisible != ((Component)tab.closeButton).gameObject.activeSelf)
			{
				((Component)tab.closeButton).gameObject.SetActive(isVisible);
				float preferredWidth = ((Component)tab.closeButton).GetComponent<LayoutElement>().preferredWidth;
				LayoutElement component = ((Component)tab).GetComponent<LayoutElement>();
				component.preferredWidth += (isVisible ? preferredWidth : (0f - preferredWidth));
			}
		}

		public void Stop()
		{
			if (tab.pointerId != -98765)
			{
				tab.ResetBackgroundColor();
				tab.pointerId = -98765;
				PanelNotificationCenter.Internal.TabDragStateChanged(tab, isDragging: false);
			}
		}

		public void SetActive(bool activeState)
		{
			tab.SetActive(activeState);
		}
	}

	[SerializeField]
	private Image background;

	[SerializeField]
	private Image iconHolder;

	[SerializeField]
	private Text nameHolder;

	[SerializeField]
	private Button closeButton;

	private string m_id;

	private Panel m_panel;

	private Vector2 m_minSize;

	private int pointerId = -98765;

	internal InternalSettings Internal { get; private set; }

	public string ID
	{
		get
		{
			return m_id;
		}
		set
		{
			if (!string.IsNullOrEmpty(value) && m_id != value)
			{
				PanelNotificationCenter.Internal.TabIDChanged(this, m_id, value);
				m_id = value;
			}
		}
	}

	public Panel Panel => m_panel;

	public int Index
	{
		get
		{
			return m_panel.GetTabIndex(this);
		}
		set
		{
			m_panel.AddTab(this, value);
		}
	}

	public RectTransform Content { get; private set; }

	public Vector2 MinSize
	{
		get
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return m_minSize;
		}
		set
		{
			//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_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			if (m_minSize != value)
			{
				m_minSize = value;
				m_panel.Internal.RecalculateMinSize();
			}
		}
	}

	public Sprite Icon
	{
		get
		{
			if (!((Object)(object)iconHolder != (Object)null))
			{
				return null;
			}
			return iconHolder.sprite;
		}
		set
		{
			if ((Object)(object)iconHolder != (Object)null)
			{
				((Component)iconHolder).gameObject.SetActive((Object)(object)value != (Object)null);
				iconHolder.sprite = value;
			}
		}
	}

	public string Label
	{
		get
		{
			if (!((Object)(object)nameHolder != (Object)null))
			{
				return null;
			}
			return nameHolder.text;
		}
		set
		{
			if ((Object)(object)nameHolder != (Object)null && value != null)
			{
				nameHolder.text = value;
			}
		}
	}

	private void Awake()
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: Expected O, but got Unknown
		m_minSize = new Vector2(100f, 100f);
		Internal = new InternalSettings(this);
		iconHolder.preserveAspect = true;
		((UnityEvent)closeButton.onClick).AddListener((UnityAction)delegate
		{
			PanelNotificationCenter.Internal.TabClosed(this);
		});
	}

	private void Start()
	{
		if (string.IsNullOrEmpty(m_id))
		{
			ID = Guid.NewGuid().ToString();
		}
	}

	private void OnEnable()
	{
		pointerId = -98765;
	}

	private void OnDestroy()
	{
		PanelNotificationCenter.Internal.TabIDChanged(this, m_id, null);
	}

	public void AttachTo(Panel panel, int tabIndex = -1)
	{
		panel.AddTab(Content, tabIndex);
	}

	public Panel Detach()
	{
		return m_panel.DetachTab(this);
	}

	public void Destroy()
	{
		m_panel.RemoveTab(this);
	}

	private void SetActive(bool activeState)
	{
		//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_003a: 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)
		if (!Object.op_Implicit((Object)(object)Content))
		{
			m_panel.Internal.RemoveTab(m_panel.GetTabIndex(this), destroyTabObject: true);
			return;
		}
		if (activeState)
		{
			((Graphic)background).color = m_panel.TabSelectedColor;
			((Graphic)nameHolder).color = m_panel.TabSelectedTextColor;
		}
		else
		{
			((Graphic)background).color = m_panel.TabNormalColor;
			((Graphic)nameHolder).color = m_panel.TabNormalTextColor;
		}
		((Component)Content).gameObject.SetActive(activeState);
	}

	void IPointerClickHandler.OnPointerClick(PointerEventData eventData)
	{
		if (!Object.op_Implicit((Object)(object)Content))
		{
			m_panel.Internal.RemoveTab(m_panel.GetTabIndex(this), destroyTabObject: true);
		}
		else
		{
			m_panel.ActiveTab = m_panel.GetTabIndex(this);
		}
	}

	void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
	{
		//IL_002e: 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)
		if (!PanelManager.Instance.OnBeginPanelTabTranslate(this, eventData))
		{
			eventData.pointerDrag = null;
			return;
		}
		pointerId = eventData.pointerId;
		((Graphic)background).color = m_panel.TabDetachingColor;
		((Graphic)nameHolder).color = m_panel.TabDetachingTextColor;
		PanelNotificationCenter.Internal.TabDragStateChanged(this, isDragging: true);
	}

	void IDragHandler.OnDrag(PointerEventData eventData)
	{
		if (eventData.pointerId != pointerId)
		{
			eventData.pointerDrag = null;
		}
		else
		{
			PanelManager.Instance.OnPanelTabTranslate(this, eventData);
		}
	}

	void IEndDragHandler.OnEndDrag(PointerEventData eventData)
	{
		if (eventData.pointerId == pointerId)
		{
			pointerId = -98765;
			ResetBackgroundColor();
			PanelManager.Instance.OnEndPanelTabTranslate(this, eventData);
			PanelNotificationCenter.Internal.TabDragStateChanged(this, isDragging: false);
		}
	}

	private void ResetBackgroundColor()
	{
		//IL_0052: 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_0025: 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)
		if (m_panel.ActiveTab == m_panel.GetTabIndex(this))
		{
			((Graphic)background).color = m_panel.TabSelectedColor;
			((Graphic)nameHolder).color = m_panel.TabSelectedTextColor;
		}
		else
		{
			((Graphic)background).color = m_panel.TabNormalColor;
			((Graphic)nameHolder).color = m_panel.TabNormalTextColor;
		}
	}
}
public static class PanelUtils
{
	internal static class Internal
	{
		public static Panel CreatePanel(RectTransform content, DynamicPanelsCanvas canvas)
		{
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown res

plugins/RuntimeInspector/RIRPlugin.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using BepInEx;
using BepInEx.Configuration;
using DynamicPanels;
using RuntimeInspectorNamespace;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace PassivePicasso.RuntimeInspectorPlugin;

[BepInPlugin("com.PassivePicasso.RuntimeInspectorPlugin", "RuntimeInspectorPlugin", "4.0.1")]
public class RuntimeInspectorPlugin : BaseUnityPlugin
{
	private static FieldInfo m_typeField = typeof(VariableSet).GetField("m_type", BindingFlags.Instance | BindingFlags.NonPublic);

	private static FieldInfo m_variablesField = typeof(VariableSet).GetField("m_variables", BindingFlags.Instance | BindingFlags.NonPublic);

	private static FieldInfo m_hiddenVariablesField = typeof(RuntimeInspectorSettings).GetField("m_hiddenVariables", BindingFlags.Instance | BindingFlags.NonPublic);

	private static FieldInfo m_exposedVariablesField = typeof(RuntimeInspectorSettings).GetField("m_exposedVariables", BindingFlags.Instance | BindingFlags.NonPublic);

	private VariableSet[] hiddenVariables;

	private VariableSet[] exposedVariables;

	private Panel inspetorPanel;

	private Panel hierarchyPanel;

	private PanelTab inspectorTab;

	private PanelTab hierarchyTab;

	private AssetBundle sceneBundle;

	private AssetBundle inspectorBundle;

	private string inspectorScenePath;

	private RuntimeInspector inspector;

	private RuntimeHierarchy hierarchy;

	private RuntimeInspectorSettings settings;

	private Canvas canvas;

	private DynamicPanelsCanvas dynamicPanelCanvas;

	private bool initialized;

	public ConfigEntry<KeyCode> ShowInspectorKey { get; set; }

	public ConfigEntry<float> DefaultInspectorWidth { get; set; }

	public ConfigEntry<float> DefaultHierarchyWidth { get; set; }

	private void Awake()
	{
		ShowInspectorKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Key Bindings", "ShowInspector", (KeyCode)105, "Keycode needed to press for runtime inspector window to appear");
		DefaultInspectorWidth = ((BaseUnityPlugin)this).Config.Bind<float>("Dock Settings", "DefaultInspectorWidth", 300f, "Default width of the Inspector Panels");
		DefaultHierarchyWidth = ((BaseUnityPlugin)this).Config.Bind<float>("Dock Settings", "DefaultHierarchyWidth", 300f, "Default width of the Hierarchy Panels");
	}

	private void Start()
	{
		string? directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
		string text = Path.Combine(directoryName, "RIRSceneBundle");
		string text2 = Path.Combine(directoryName, "RuntimeInspector");
		inspectorBundle = AssetBundle.LoadFromFile(text2);
		InitializeSettings();
		IEnumerable<GameObject> allGameObjects = inspectorBundle.LoadAllAssets().OfType<GameObject>();
		RuntimeInspectorUtils.LoadObjRefPicker = () => Retrieve<ObjectReferencePicker>(allGameObjects, "ObjectReferencePicker");
		RuntimeInspectorUtils.LoadColorPicker = () => Retrieve<ColorPicker>(allGameObjects, "ColorPicker");
		RuntimeInspectorUtils.LoadDraggedReferenceItem = () => Retrieve<DraggedReferenceItem>(allGameObjects, "DraggedReferenceItem");
		RuntimeInspectorUtils.LoadTooltip = () => Retrieve<Tooltip>(allGameObjects, "Tooltip");
		PanelUtils.LoadPanel = () => Retrieve<Panel>(allGameObjects, "DynamicPanel");
		PanelUtils.LoadTab = () => Retrieve<PanelTab>(allGameObjects, "DynamicPanelTab");
		PanelUtils.LoadPanelPreview = () => Retrieve<RectTransform>(allGameObjects, "DynamicPanelPreview");
		sceneBundle = AssetBundle.LoadFromFile(text);
		inspectorScenePath = sceneBundle.GetAllScenePaths()[0];
		SceneManager.sceneLoaded += SceneManager_sceneLoaded;
		SceneManager.LoadScene(inspectorScenePath, (LoadSceneMode)1);
	}

	private void Update()
	{
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: 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_0063: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)canvas) && ((Component)canvas).gameObject.activeSelf && !initialized)
		{
			Panel obj = inspetorPanel;
			float value = DefaultInspectorWidth.Value;
			Resolution currentResolution = Screen.currentResolution;
			obj.ResizeTo(new Vector2(value, (float)((Resolution)(ref currentResolution)).height), (Direction)2, (Direction)3);
			Panel obj2 = hierarchyPanel;
			float value2 = DefaultHierarchyWidth.Value;
			currentResolution = Screen.currentResolution;
			obj2.ResizeTo(new Vector2(value2, (float)((Resolution)(ref currentResolution)).height), (Direction)2, (Direction)3);
			initialized = true;
		}
		if (Input.GetKeyDown(ShowInspectorKey.Value) && Object.op_Implicit((Object)(object)canvas))
		{
			if (!((Component)canvas).GetComponentsInChildren<InputField>().Any((InputField input) => input.isFocused))
			{
				((Component)canvas).gameObject.SetActive(!((Component)canvas).gameObject.activeSelf);
			}
			if (!Object.op_Implicit((Object)(object)inspetorPanel))
			{
				inspetorPanel = ConfigureTab(((Component)inspector).gameObject, (Direction)2, "Inspector", out inspectorTab);
			}
			if (!Object.op_Implicit((Object)(object)hierarchyPanel))
			{
				hierarchyPanel = ConfigureTab(((Component)hierarchy).gameObject, (Direction)0, "Hierarchy", out hierarchyTab);
			}
		}
	}

	private T Retrieve<T>(IEnumerable<GameObject> gameObjects, string name) where T : Component
	{
		GameObject? obj = gameObjects.FirstOrDefault((Func<GameObject, bool>)((GameObject asset) => ((Object)asset).name == name && Object.op_Implicit((Object)(object)asset.GetComponent<T>())));
		if (obj == null)
		{
			return default(T);
		}
		return obj.GetComponent<T>();
	}

	private IEnumerable<VariableSet> GetVariableSet(params (Type type, string[] variables)[] setData)
	{
		for (int i = 0; i < setData.Length; i++)
		{
			(Type, string[]) tuple = setData[i];
			VariableSet val = new VariableSet();
			m_typeField.SetValue(val, tuple.Item1.AssemblyQualifiedName);
			m_variablesField.SetValue(val, tuple.Item2);
			yield return val;
		}
	}

	private void InitializeSettings()
	{
		settings = inspectorBundle.LoadAllAssets<RuntimeInspectorSettings>().FirstOrDefault() ?? ScriptableObject.CreateInstance<RuntimeInspectorSettings>();
		if (settings.HiddenVariables == null)
		{
			hiddenVariables = GetVariableSet((typeof(Object), new string[6] { "hideFlags", "useGUILayout", "runInEditMode", "m_CachedPtr", "m_InstanceID", "m_UnityRuntimeErrorString" }), (typeof(Renderer), new string[2] { "material", "materials" }), (typeof(MeshFilter), new string[1] { "mesh" }), (typeof(Transform), new string[1] { "*" }), (typeof(Component), new string[2] { "name", "tag" }), (typeof(Collider), new string[1] { "material" }), (typeof(Collider2D), new string[1] { "material" }), (typeof(CanvasRenderer), new string[1] { "*" }), (typeof(Animator), new string[3] { "bodyPosition", "bodyRotation", "playbackTime" })).ToArray();
			m_hiddenVariablesField.SetValue(settings, hiddenVariables);
		}
		if (settings.ExposedVariables == null)
		{
			exposedVariables = GetVariableSet((typeof(Transform), new string[3] { "localPosition", "localEulerAngles", "localScale" })).ToArray();
			m_exposedVariablesField.SetValue(settings, exposedVariables);
		}
	}

	private void SceneManager_sceneLoaded(Scene loadedScene, LoadSceneMode arg1)
	{
		//IL_010d: 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_011b: Unknown result type (might be due to invalid IL or missing references)
		//IL_015b: 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_0169: Unknown result type (might be due to invalid IL or missing references)
		if (!(((Scene)(ref loadedScene)).path != inspectorScenePath))
		{
			SceneManager.sceneLoaded -= SceneManager_sceneLoaded;
			inspector = ((Scene)(ref loadedScene)).GetRootGameObjects().SelectMany((GameObject rgo) => rgo.GetComponentsInChildren<RuntimeInspector>()).First();
			hierarchy = ((Scene)(ref loadedScene)).GetRootGameObjects().SelectMany((GameObject rgo) => rgo.GetComponentsInChildren<RuntimeHierarchy>()).First();
			canvas = ((Scene)(ref loadedScene)).GetRootGameObjects().SelectMany((GameObject rgo) => rgo.GetComponentsInChildren<Canvas>()).First();
			dynamicPanelCanvas = ((Component)canvas).GetComponent<DynamicPanelsCanvas>();
			inspetorPanel = ConfigureTab(((Component)inspector).gameObject, (Direction)2, "Inspector", out inspectorTab);
			Panel obj = inspetorPanel;
			float value = DefaultInspectorWidth.Value;
			Resolution currentResolution = Screen.currentResolution;
			obj.ResizeTo(new Vector2(value, (float)((Resolution)(ref currentResolution)).height), (Direction)2, (Direction)3);
			hierarchyPanel = ConfigureTab(((Component)hierarchy).gameObject, (Direction)0, "Hierarchy", out hierarchyTab);
			Panel obj2 = hierarchyPanel;
			float value2 = DefaultHierarchyWidth.Value;
			currentResolution = Screen.currentResolution;
			obj2.ResizeTo(new Vector2(value2, (float)((Resolution)(ref currentResolution)).height), (Direction)2, (Direction)3);
			Object.DontDestroyOnLoad((Object)(object)canvas);
			InitializeSettings();
			hierarchy.Refresh();
			((Component)canvas).gameObject.SetActive(false);
		}
	}

	private Panel ConfigureTab(GameObject target, Direction direction, string title, out PanelTab tab)
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		Panel val = PanelUtils.CreatePanelFor(target.GetComponent<RectTransform>(), dynamicPanelCanvas);
		val.DockToRoot(direction);
		tab = val.GetTab(target.GetComponent<RectTransform>());
		tab.Label = title;
		return val;
	}

	private void OnDoubleClickedEntry(Transform selection)
	{
		GameObject val = Object.Instantiate<GameObject>(inspectorBundle.LoadAsset<GameObject>("RuntimeInspector"));
		val.GetComponent<RuntimeInspector>().Inspect((object)selection);
		ConfigureTab(val, (Direction)2, ((Object)((Component)selection).gameObject).name, out var _);
	}

	private void OnPanelClosed(Panel panel)
	{
		if (!((Object)(object)panel == (Object)(object)hierarchyPanel) && !((Object)(object)panel == (Object)(object)inspetorPanel))
		{
			panel.Detach();
			Object.Destroy((Object)(object)((Component)panel).gameObject);
		}
	}

	private void OnTabClosed(PanelTab tab)
	{
		if ((Object)(object)tab == (Object)(object)inspectorTab || (Object)(object)tab == (Object)(object)hierarchyTab)
		{
			return;
		}
		if (tab.Panel.NumberOfTabs == 1)
		{
			if (!((Object)(object)tab.Panel == (Object)(object)inspetorPanel) && !((Object)(object)tab.Panel == (Object)(object)hierarchyPanel))
			{
				Object.Destroy((Object)(object)((Component)tab.Panel).gameObject);
			}
		}
		else
		{
			Object.Destroy((Object)(object)((Component)tab).gameObject);
		}
	}
}

plugins/RuntimeInspector/RuntimeInspector.Runtime.dll

Decompiled 2 months ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Text;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.Scripting;
using UnityEngine.Serialization;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace RuntimeInspectorNamespace;

public class ColorWheelControl : MonoBehaviour, IPointerDownHandler, IEventSystemHandler, IDragHandler, IPointerUpHandler
{
	public delegate void OnColorChangedDelegate(Color32 color);

	private const float RGB_CONST = 2f / (float)Math.PI;

	private const float G_CONST = (float)Math.PI * 2f / 3f;

	private const float B_CONST = 4.1887903f;

	private Color m_color;

	private RectTransform rectTransform;

	[SerializeField]
	private RectTransform SelectorOut;

	[SerializeField]
	private RectTransform SelectorIn;

	[SerializeField]
	private WindowDragHandler colorPickerWindow;

	private float outer;

	private Vector2 inner;

	private Material mat;

	private bool draggingOuter;

	private bool draggingInner;

	private float halfSize;

	private float halfSizeSqr;

	private float outerCirclePaddingSqr;

	private float innerSquareHalfSize;

	private int pointerId = -98765;

	public Color Color
	{
		get
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return m_color;
		}
		private set
		{
			//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_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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)
			if (m_color != value)
			{
				m_color = value;
				m_color.a = Alpha;
				if (this.OnColorChanged != null)
				{
					this.OnColorChanged(Color32.op_Implicit(m_color));
				}
			}
		}
	}

	public float Alpha { get; set; }

	public event OnColorChangedDelegate OnColorChanged;

	private void Awake()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Expected O, but got Unknown
		rectTransform = (RectTransform)((Component)this).transform;
		Image component = ((Component)this).GetComponent<Image>();
		mat = new Material(((Graphic)component).material);
		((Graphic)component).material = mat;
		UpdateProperties();
	}

	private void OnRectTransformDimensionsChange()
	{
		if (!((Object)(object)rectTransform == (Object)null))
		{
			UpdateProperties();
			UpdateSelectors();
		}
	}

	private void UpdateProperties()
	{
		//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_000f: Unknown result type (might be due to invalid IL or missing references)
		Rect rect = rectTransform.rect;
		halfSize = ((Rect)(ref rect)).size.x * 0.5f;
		halfSizeSqr = halfSize * halfSize;
		outerCirclePaddingSqr = halfSizeSqr * 0.75f * 0.75f;
		innerSquareHalfSize = halfSize * 0.5f;
	}

	public void PickColor(Color c)
	{
		//IL_0001: 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_0056: 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)
		Alpha = c.a;
		float num = default(float);
		float num2 = default(float);
		float num3 = default(float);
		Color.RGBToHSV(c, ref num, ref num2, ref num3);
		outer = num * 2f * (float)Math.PI;
		inner.x = 1f - num2;
		inner.y = 1f - num3;
		UpdateSelectors();
		Color = c;
		mat.SetColor("_Color", GetCurrentBaseColor());
	}

	public void OnPointerDown(PointerEventData eventData)
	{
		//IL_0007: 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_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		Vector2 val = default(Vector2);
		if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, ref val))
		{
			return;
		}
		float sqrMagnitude = ((Vector2)(ref val)).sqrMagnitude;
		if (sqrMagnitude <= halfSizeSqr && sqrMagnitude >= outerCirclePaddingSqr)
		{
			draggingOuter = true;
		}
		else
		{
			if (!(Mathf.Abs(val.x) <= innerSquareHalfSize) || !(Mathf.Abs(val.y) <= innerSquareHalfSize))
			{
				return;
			}
			draggingInner = true;
		}
		GetSelectedColor(val);
		pointerId = eventData.pointerId;
	}

	public void OnDrag(PointerEventData eventData)
	{
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		if (pointerId != eventData.pointerId)
		{
			eventData.pointerDrag = ((Component)colorPickerWindow).gameObject;
			colorPickerWindow.OnBeginDrag(eventData);
		}
		else
		{
			Vector2 pointerPos = default(Vector2);
			RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, ref pointerPos);
			GetSelectedColor(pointerPos);
		}
	}

	public void OnPointerUp(PointerEventData eventData)
	{
		//IL_0016: 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)
		if (pointerId == eventData.pointerId)
		{
			Vector2 pointerPos = default(Vector2);
			RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, eventData.position, eventData.pressEventCamera, ref pointerPos);
			GetSelectedColor(pointerPos);
			draggingOuter = false;
			draggingInner = false;
			pointerId = -98765;
		}
	}

	private void GetSelectedColor(Vector2 pointerPos)
	{
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: 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_003f: 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_0047: 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_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		if (draggingOuter)
		{
			Vector2 val = -((Vector2)(ref pointerPos)).normalized;
			outer = Mathf.Atan2(0f - val.x, 0f - val.y);
			UpdateColor();
		}
		else if (draggingInner)
		{
			Vector2 val2 = -pointerPos;
			val2.x = Mathf.Clamp(val2.x, 0f - innerSquareHalfSize, innerSquareHalfSize) + innerSquareHalfSize;
			val2.y = Mathf.Clamp(val2.y, 0f - innerSquareHalfSize, innerSquareHalfSize) + innerSquareHalfSize;
			inner = val2 / halfSize;
			UpdateColor();
		}
		UpdateSelectors();
	}

	private void UpdateColor()
	{
		//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_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: 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_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_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		Color currentBaseColor = GetCurrentBaseColor();
		mat.SetColor("_Color", currentBaseColor);
		currentBaseColor = Color.Lerp(currentBaseColor, Color.white, inner.x);
		currentBaseColor = Color.Lerp(currentBaseColor, Color.black, inner.y);
		Color = currentBaseColor;
	}

	private Color GetCurrentBaseColor()
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
		Color white = Color.white;
		white.r = Mathf.Clamp(2f / (float)Math.PI * Mathf.Asin(Mathf.Cos(outer)) * 1.5f + 0.5f, 0f, 1f);
		white.g = Mathf.Clamp(2f / (float)Math.PI * Mathf.Asin(Mathf.Cos((float)Math.PI * 2f / 3f - outer)) * 1.5f + 0.5f, 0f, 1f);
		white.b = Mathf.Clamp(2f / (float)Math.PI * Mathf.Asin(Mathf.Cos(4.1887903f - outer)) * 1.5f + 0.5f, 0f, 1f);
		return white;
	}

	private void UpdateSelectors()
	{
		//IL_0036: 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)
		SelectorOut.anchoredPosition = new Vector2(Mathf.Sin(outer) * halfSize * 0.85f, Mathf.Cos(outer) * halfSize * 0.85f);
		SelectorIn.anchoredPosition = new Vector2(innerSquareHalfSize - inner.x * halfSize, innerSquareHalfSize - inner.y * halfSize);
	}
}
public class RuntimeHierarchy : SkinnedWindow, IListViewAdapter, ITooltipManager
{
	[Flags]
	public enum SelectOptions
	{
		None = 0,
		Additive = 1,
		FocusOnSelection = 2,
		ForceRevealSelection = 4
	}

	public enum LongPressAction
	{
		None,
		CreateDraggedReferenceItem,
		ShowMultiSelectionToggles,
		ShowMultiSelectionTogglesThenCreateDraggedReferenceItem
	}

	public delegate void SelectionChangedDelegate(ReadOnlyCollection<Transform> selection);

	public delegate void DoubleClickDelegate(HierarchyData clickedItem);

	public delegate bool GameObjectFilterDelegate(Transform transform);

	[SerializeField]
	private float m_refreshInterval;

	[SerializeField]
	private float m_objectNamesRefreshInterval = 10f;

	[SerializeField]
	private float m_searchRefreshInterval = 5f;

	private float nextHierarchyRefreshTime = -1f;

	private float nextObjectNamesRefreshTime = -1f;

	private float nextSearchRefreshTime = -1f;

	[Space]
	[SerializeField]
	private bool m_allowMultiSelection = true;

	private bool m_multiSelectionToggleSelectionMode;

	private bool justActivatedMultiSelectionToggleSelectionMode;

	[Space]
	[SerializeField]
	private bool m_exposeUnityScenes = true;

	[SerializeField]
	[FormerlySerializedAs("exposedScenes")]
	private string[] exposedUnityScenesSubset;

	[SerializeField]
	private bool m_exposeDontDestroyOnLoadScene = true;

	[SerializeField]
	private string[] pseudoScenesOrder;

	[Space]
	[SerializeField]
	private LongPressAction m_pointerLongPressAction = LongPressAction.CreateDraggedReferenceItem;

	[SerializeField]
	[FormerlySerializedAs("m_draggedReferenceHoldTime")]
	private float m_pointerLongPressDuration = 0.4f;

	[SerializeField]
	private float m_doubleClickThreshold = 0.5f;

	[Space]
	[SerializeField]
	private bool m_canReorganizeItems;

	[SerializeField]
	private bool m_canDropDraggedParentOnChild;

	[SerializeField]
	private bool m_canDropDraggedObjectsToPseudoScenes;

	[Space]
	[SerializeField]
	private bool m_showTooltips;

	[SerializeField]
	private float m_tooltipDelay = 0.5f;

	[Space]
	[SerializeField]
	private bool m_showHorizontalScrollbar;

	private bool m_isInSearchMode;

	[SerializeField]
	private RuntimeInspector m_connectedInspector;

	private bool m_isLocked;

	[Header("Internal Variables")]
	[SerializeField]
	private ScrollRect scrollView;

	[SerializeField]
	private RectTransform drawArea;

	[SerializeField]
	private RecycledListView listView;

	[SerializeField]
	private Image background;

	[SerializeField]
	private Image verticalScrollbar;

	[SerializeField]
	private Image horizontalScrollbar;

	[SerializeField]
	private InputField searchInputField;

	[SerializeField]
	private Image searchIcon;

	[SerializeField]
	private Image searchInputFieldBackground;

	[SerializeField]
	private LayoutElement searchBarLayoutElement;

	[SerializeField]
	private Button deselectAllButton;

	[SerializeField]
	private LayoutElement deselectAllLayoutElement;

	[SerializeField]
	private Text deselectAllLabel;

	[SerializeField]
	private Image selectedPathBackground;

	[SerializeField]
	private Text selectedPathText;

	[SerializeField]
	private HierarchyDragDropListener dragDropListener;

	[SerializeField]
	private HierarchyField drawerPrefab;

	[SerializeField]
	private Sprite m_sceneDrawerBackground;

	[SerializeField]
	private Sprite m_transformDrawerBackground;

	private static int aliveHierarchies;

	private bool initialized;

	private readonly List<HierarchyField> drawers = new List<HierarchyField>(32);

	private readonly List<HierarchyDataRoot> sceneData = new List<HierarchyDataRoot>(8);

	private readonly List<HierarchyDataRoot> searchSceneData = new List<HierarchyDataRoot>(8);

	private readonly Dictionary<string, HierarchyDataRootPseudoScene> pseudoSceneDataLookup = new Dictionary<string, HierarchyDataRootPseudoScene>();

	private readonly List<Transform> m_currentSelection = new List<Transform>(16);

	private readonly HashSet<int> currentSelectionSet = new HashSet<int>();

	private readonly HashSet<int> newSelectionSet = new HashSet<int>();

	private Transform multiSelectionPivotTransform;

	private HierarchyDataRoot multiSelectionPivotSceneData;

	private readonly List<int> multiSelectionPivotSiblingIndexTraversalList = new List<int>(8);

	private readonly Transform[] singleTransformSelection = (Transform[])(object)new Transform[1];

	private int totalItemCount;

	private bool selectLock;

	private bool isListViewDirty = true;

	private bool shouldRecalculateContentWidth;

	private float lastClickTime;

	private HierarchyField lastClickedDrawer;

	private HierarchyField currentlyPressedDrawer;

	private float pressedDrawerDraggedReferenceCreateTime;

	private PointerEventData pressedDrawerActivePointer;

	private Canvas m_canvas;

	private float m_autoScrollSpeed;

	private PointerEventData nullPointerEventData;

	public SelectionChangedDelegate OnSelectionChanged;

	public DoubleClickDelegate OnItemDoubleClicked;

	private GameObjectFilterDelegate m_gameObjectDelegate;

	public float RefreshInterval
	{
		get
		{
			return m_refreshInterval;
		}
		set
		{
			m_refreshInterval = value;
		}
	}

	public float ObjectNamesRefreshInterval
	{
		get
		{
			return m_objectNamesRefreshInterval;
		}
		set
		{
			m_objectNamesRefreshInterval = value;
		}
	}

	public float SearchRefreshInterval
	{
		get
		{
			return m_searchRefreshInterval;
		}
		set
		{
			m_searchRefreshInterval = value;
		}
	}

	public bool AllowMultiSelection
	{
		get
		{
			return m_allowMultiSelection;
		}
		set
		{
			if (m_allowMultiSelection == value)
			{
				return;
			}
			m_allowMultiSelection = value;
			if (value)
			{
				return;
			}
			MultiSelectionToggleSelectionMode = false;
			if (m_currentSelection.Count <= 1)
			{
				return;
			}
			for (int num = m_currentSelection.Count - 1; num >= 0; num--)
			{
				if (Object.op_Implicit((Object)(object)m_currentSelection[num]))
				{
					singleTransformSelection[0] = m_currentSelection[num];
					SelectInternal(singleTransformSelection);
					return;
				}
			}
			DeselectInternal(null);
		}
	}

	public bool MultiSelectionToggleSelectionMode
	{
		get
		{
			return m_multiSelectionToggleSelectionMode;
		}
		set
		{
			if (!m_allowMultiSelection)
			{
				value = false;
			}
			if (m_multiSelectionToggleSelectionMode == value)
			{
				return;
			}
			m_multiSelectionToggleSelectionMode = value;
			shouldRecalculateContentWidth = true;
			for (int num = drawers.Count - 1; num >= 0; num--)
			{
				if (((Component)drawers[num]).gameObject.activeSelf)
				{
					drawers[num].MultiSelectionToggleVisible = value;
				}
			}
			((Component)deselectAllButton).gameObject.SetActive(value);
			if (!value)
			{
				EnsureScrollViewIsWithinBounds();
			}
		}
	}

	public bool ExposeUnityScenes
	{
		get
		{
			return m_exposeUnityScenes;
		}
		set
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			if (m_exposeUnityScenes == value)
			{
				return;
			}
			m_exposeUnityScenes = value;
			for (int i = 0; i < SceneManager.sceneCount; i++)
			{
				if (value)
				{
					OnSceneLoaded(SceneManager.GetSceneAt(i), (LoadSceneMode)0);
				}
				else
				{
					OnSceneUnloaded(SceneManager.GetSceneAt(i));
				}
			}
		}
	}

	public bool ExposeDontDestroyOnLoadScene
	{
		get
		{
			return m_exposeDontDestroyOnLoadScene;
		}
		set
		{
			//IL_0023: 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)
			if (m_exposeDontDestroyOnLoadScene != value)
			{
				m_exposeDontDestroyOnLoadScene = value;
				if (value)
				{
					OnSceneLoaded(GetDontDestroyOnLoadScene(), (LoadSceneMode)0);
				}
				else
				{
					OnSceneUnloaded(GetDontDestroyOnLoadScene());
				}
			}
		}
	}

	public LongPressAction PointerLongPressAction
	{
		get
		{
			return m_pointerLongPressAction;
		}
		set
		{
			m_pointerLongPressAction = value;
		}
	}

	public float PointerLongPressDuration
	{
		get
		{
			return m_pointerLongPressDuration;
		}
		set
		{
			m_pointerLongPressDuration = value;
		}
	}

	public float DoubleClickThreshold
	{
		get
		{
			return m_doubleClickThreshold;
		}
		set
		{
			m_doubleClickThreshold = value;
		}
	}

	public bool CanReorganizeItems
	{
		get
		{
			return m_canReorganizeItems;
		}
		set
		{
			m_canReorganizeItems = value;
		}
	}

	public bool CanDropDraggedParentOnChild
	{
		get
		{
			return m_canDropDraggedParentOnChild;
		}
		set
		{
			m_canDropDraggedParentOnChild = value;
		}
	}

	public bool CanDropDraggedObjectsToPseudoScenes
	{
		get
		{
			return m_canDropDraggedObjectsToPseudoScenes;
		}
		set
		{
			m_canDropDraggedObjectsToPseudoScenes = value;
		}
	}

	public bool ShowTooltips => m_showTooltips;

	public float TooltipDelay
	{
		get
		{
			return m_tooltipDelay;
		}
		set
		{
			m_tooltipDelay = value;
		}
	}

	internal TooltipListener TooltipListener { get; private set; }

	public bool ShowHorizontalScrollbar
	{
		get
		{
			return m_showHorizontalScrollbar;
		}
		set
		{
			//IL_0031: 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)
			if (m_showHorizontalScrollbar == value)
			{
				return;
			}
			m_showHorizontalScrollbar = value;
			if (!value)
			{
				scrollView.content.sizeDelta = new Vector2(0f, scrollView.content.sizeDelta.y);
				scrollView.horizontalNormalizedPosition = 0f;
			}
			else
			{
				for (int num = drawers.Count - 1; num >= 0; num--)
				{
					if (((Component)drawers[num]).gameObject.activeSelf)
					{
						drawers[num].RefreshName();
					}
				}
				shouldRecalculateContentWidth = true;
			}
			scrollView.horizontal = value;
		}
	}

	public string SearchTerm
	{
		get
		{
			return searchInputField.text;
		}
		set
		{
			searchInputField.text = value;
		}
	}

	public bool IsInSearchMode => m_isInSearchMode;

	public RuntimeInspector ConnectedInspector
	{
		get
		{
			return m_connectedInspector;
		}
		set
		{
			if (!((Object)(object)m_connectedInspector != (Object)(object)value))
			{
				return;
			}
			m_connectedInspector = value;
			for (int num = m_currentSelection.Count - 1; num >= 0; num--)
			{
				if (Object.op_Implicit((Object)(object)m_currentSelection[num]))
				{
					m_connectedInspector.Inspect(((Component)m_currentSelection[num]).gameObject);
					break;
				}
			}
		}
	}

	public bool IsLocked
	{
		get
		{
			return m_isLocked;
		}
		set
		{
			m_isLocked = value;
		}
	}

	internal Sprite SceneDrawerBackground => m_sceneDrawerBackground;

	internal Sprite TransformDrawerBackground => m_transformDrawerBackground;

	public ReadOnlyCollection<Transform> CurrentSelection => m_currentSelection.AsReadOnly();

	internal int ItemCount => totalItemCount;

	public Canvas Canvas => m_canvas;

	internal float AutoScrollSpeed
	{
		set
		{
			m_autoScrollSpeed = value;
		}
	}

	public GameObjectFilterDelegate GameObjectFilter
	{
		get
		{
			return m_gameObjectDelegate;
		}
		set
		{
			m_gameObjectDelegate = value;
			for (int i = 0; i < sceneData.Count; i++)
			{
				if (sceneData[i].IsExpanded)
				{
					sceneData[i].IsExpanded = false;
					sceneData[i].IsExpanded = true;
				}
			}
			if (!m_isInSearchMode)
			{
				return;
			}
			for (int j = 0; j < searchSceneData.Count; j++)
			{
				if (searchSceneData[j].IsExpanded)
				{
					searchSceneData[j].IsExpanded = false;
					searchSceneData[j].IsExpanded = true;
				}
			}
		}
	}

	int IListViewAdapter.Count => totalItemCount;

	float IListViewAdapter.ItemHeight => base.Skin.LineHeight;

	protected override void Awake()
	{
		base.Awake();
		Initialize();
	}

	private void Initialize()
	{
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Expected O, but got Unknown
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Expected O, but got Unknown
		if (!initialized)
		{
			initialized = true;
			listView.SetAdapter(this);
			aliveHierarchies++;
			m_canvas = ((Component)this).GetComponentInParent<Canvas>();
			nullPointerEventData = new PointerEventData((EventSystem)null);
			((UnityEvent<string>)(object)searchInputField.onValueChanged).AddListener((UnityAction<string>)OnSearchTermChanged);
			((UnityEvent)deselectAllButton.onClick).AddListener((UnityAction)delegate
			{
				DeselectInternal(null);
				MultiSelectionToggleSelectionMode = false;
			});
			m_showHorizontalScrollbar = !m_showHorizontalScrollbar;
			ShowHorizontalScrollbar = !m_showHorizontalScrollbar;
			if (m_showTooltips)
			{
				TooltipListener = ((Component)this).gameObject.AddComponent<TooltipListener>();
				TooltipListener.Initialize(this);
			}
			RuntimeInspectorUtils.IgnoredTransformsInHierarchy.Add((Transform)(object)drawArea);
		}
	}

	private void Start()
	{
		//IL_0051: 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)
		SceneManager.sceneLoaded += OnSceneLoaded;
		SceneManager.sceneUnloaded += OnSceneUnloaded;
		if (ExposeUnityScenes)
		{
			for (int i = 0; i < SceneManager.sceneCount; i++)
			{
				OnSceneLoaded(SceneManager.GetSceneAt(i), (LoadSceneMode)0);
			}
		}
		if (ExposeDontDestroyOnLoadScene)
		{
			OnSceneLoaded(GetDontDestroyOnLoadScene(), (LoadSceneMode)0);
		}
	}

	private void OnDestroy()
	{
		SceneManager.sceneLoaded -= OnSceneLoaded;
		SceneManager.sceneUnloaded -= OnSceneUnloaded;
		if (--aliveHierarchies == 0)
		{
			HierarchyData.ClearPool();
		}
		RuntimeInspectorUtils.IgnoredTransformsInHierarchy.Remove((Transform)(object)drawArea);
	}

	private void OnRectTransformDimensionsChange()
	{
		shouldRecalculateContentWidth = true;
	}

	private void OnTransformParentChanged()
	{
		m_canvas = ((Component)this).GetComponentInParent<Canvas>();
	}

	protected override void Update()
	{
		//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0207: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cc: 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)
		base.Update();
		float realtimeSinceStartup = Time.realtimeSinceStartup;
		if (realtimeSinceStartup > nextHierarchyRefreshTime)
		{
			Refresh();
		}
		if (m_isInSearchMode && realtimeSinceStartup > nextSearchRefreshTime)
		{
			RefreshSearchResults();
		}
		if (isListViewDirty)
		{
			RefreshListView();
		}
		if (realtimeSinceStartup > nextObjectNamesRefreshTime)
		{
			nextObjectNamesRefreshTime = realtimeSinceStartup + m_objectNamesRefreshInterval;
			for (int num = sceneData.Count - 1; num >= 0; num--)
			{
				sceneData[num].ResetCachedNames();
			}
			for (int num2 = searchSceneData.Count - 1; num2 >= 0; num2--)
			{
				searchSceneData[num2].ResetCachedNames();
			}
			for (int num3 = drawers.Count - 1; num3 >= 0; num3--)
			{
				if (((Component)drawers[num3]).gameObject.activeSelf)
				{
					drawers[num3].RefreshName();
				}
			}
			shouldRecalculateContentWidth = true;
		}
		if (m_showHorizontalScrollbar && shouldRecalculateContentWidth)
		{
			shouldRecalculateContentWidth = false;
			float num4 = 0f;
			for (int num5 = drawers.Count - 1; num5 >= 0; num5--)
			{
				if (((Component)drawers[num5]).gameObject.activeSelf)
				{
					float preferredWidth = drawers[num5].PreferredWidth;
					if (preferredWidth > num4)
					{
						num4 = preferredWidth;
					}
				}
			}
			if (m_multiSelectionToggleSelectionMode && drawers.Count > 0)
			{
				num4 += (float)base.Skin.LineHeight;
			}
			float num6 = listView.ViewportWidth + scrollView.verticalScrollbarSpacing;
			if (num4 > num6)
			{
				scrollView.content.sizeDelta = new Vector2(num4 - num6, scrollView.content.sizeDelta.y);
			}
			else
			{
				scrollView.content.sizeDelta = new Vector2(0f, scrollView.content.sizeDelta.y);
			}
			EnsureScrollViewIsWithinBounds();
		}
		if (m_pointerLongPressAction != 0 && Object.op_Implicit((Object)(object)currentlyPressedDrawer) && realtimeSinceStartup > pressedDrawerDraggedReferenceCreateTime)
		{
			if (((Component)currentlyPressedDrawer).gameObject.activeSelf && Object.op_Implicit((Object)(object)currentlyPressedDrawer.Data.BoundTransform))
			{
				if (m_pointerLongPressAction == LongPressAction.CreateDraggedReferenceItem || (m_pointerLongPressAction == LongPressAction.ShowMultiSelectionTogglesThenCreateDraggedReferenceItem && (!m_allowMultiSelection || m_multiSelectionToggleSelectionMode)))
				{
					Transform[] array = (Transform[])(currentlyPressedDrawer.IsSelected ? ((Array)m_currentSelection.ToArray()) : ((Array)new Transform[1] { currentlyPressedDrawer.Data.BoundTransform }));
					if (array.Length > 1)
					{
						int num7 = Array.IndexOf(array, currentlyPressedDrawer.Data.BoundTransform);
						if (num7 > 0)
						{
							for (int num8 = num7; num8 > 0; num8--)
							{
								array[num8] = array[num8 - 1];
							}
							array[0] = currentlyPressedDrawer.Data.BoundTransform;
						}
					}
					Object[] references = (Object[])(object)array;
					if (Object.op_Implicit((Object)(object)RuntimeInspectorUtils.CreateDraggedReferenceItem(references, pressedDrawerActivePointer, base.Skin, m_canvas)))
					{
						((IPointerEnterHandler)dragDropListener).OnPointerEnter(pressedDrawerActivePointer);
					}
				}
				else if (m_allowMultiSelection && !m_multiSelectionToggleSelectionMode)
				{
					if (currentSelectionSet.Add(((object)currentlyPressedDrawer.Data.BoundTransform).GetHashCode()))
					{
						m_currentSelection.Add(currentlyPressedDrawer.Data.BoundTransform);
						currentlyPressedDrawer.IsSelected = true;
						OnCurrentSelectionChanged();
					}
					MultiSelectionToggleSelectionMode = true;
					justActivatedMultiSelectionToggleSelectionMode = true;
					if (Object.op_Implicit((Object)(object)TooltipListener))
					{
						TooltipListener.OnDrawerHovered(null, null, isHovering: false);
					}
				}
			}
			currentlyPressedDrawer = null;
			pressedDrawerActivePointer = null;
		}
		if (m_autoScrollSpeed != 0f)
		{
			scrollView.verticalNormalizedPosition = Mathf.Clamp01(scrollView.verticalNormalizedPosition + m_autoScrollSpeed * Time.unscaledDeltaTime / (float)totalItemCount);
		}
	}

	public void Refresh()
	{
		nextHierarchyRefreshTime = Time.realtimeSinceStartup + m_refreshInterval;
		bool flag = false;
		for (int i = 0; i < sceneData.Count; i++)
		{
			flag |= sceneData[i].Refresh();
		}
		if (flag)
		{
			isListViewDirty = true;
			return;
		}
		for (int num = drawers.Count - 1; num >= 0; num--)
		{
			if (((Component)drawers[num]).gameObject.activeSelf)
			{
				drawers[num].Refresh();
			}
		}
	}

	private void RefreshListView()
	{
		isListViewDirty = false;
		totalItemCount = 0;
		if (!m_isInSearchMode)
		{
			for (int num = sceneData.Count - 1; num >= 0; num--)
			{
				totalItemCount += sceneData[num].Height;
			}
		}
		else
		{
			for (int num2 = searchSceneData.Count - 1; num2 >= 0; num2--)
			{
				totalItemCount += searchSceneData[num2].Height;
			}
		}
		listView.UpdateList(resetContentPosition: false);
		EnsureScrollViewIsWithinBounds();
	}

	internal void SetListViewDirty()
	{
		isListViewDirty = true;
	}

	public void RefreshSearchResults()
	{
		if (!m_isInSearchMode)
		{
			return;
		}
		nextSearchRefreshTime = Time.realtimeSinceStartup + m_searchRefreshInterval;
		for (int i = 0; i < searchSceneData.Count; i++)
		{
			HierarchyDataRootSearch hierarchyDataRootSearch = (HierarchyDataRootSearch)searchSceneData[i];
			bool canExpand = hierarchyDataRootSearch.CanExpand;
			hierarchyDataRootSearch.Refresh();
			if (hierarchyDataRootSearch.CanExpand && !canExpand)
			{
				hierarchyDataRootSearch.IsExpanded = true;
			}
			isListViewDirty = true;
		}
	}

	public void RefreshNameOf(Transform target)
	{
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		if (!Object.op_Implicit((Object)(object)target))
		{
			return;
		}
		Scene scene = ((Component)target).gameObject.scene;
		for (int num = sceneData.Count - 1; num >= 0; num--)
		{
			HierarchyDataRoot hierarchyDataRoot = sceneData[num];
			if (hierarchyDataRoot is HierarchyDataRootPseudoScene || ((HierarchyDataRootScene)hierarchyDataRoot).Scene == scene)
			{
				sceneData[num].RefreshNameOf(target);
			}
		}
		if (m_isInSearchMode)
		{
			RefreshSearchResults();
			for (int num2 = searchSceneData.Count - 1; num2 >= 0; num2--)
			{
				searchSceneData[num2].RefreshNameOf(target);
			}
		}
		for (int num3 = drawers.Count - 1; num3 >= 0; num3--)
		{
			if (((Component)drawers[num3]).gameObject.activeSelf && (Object)(object)drawers[num3].Data.BoundTransform == (Object)(object)target)
			{
				drawers[num3].RefreshName();
			}
		}
		shouldRecalculateContentWidth = true;
	}

	protected override void RefreshSkin()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: 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_006e: 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_00cd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_0134: Unknown result type (might be due to invalid IL or missing references)
		//IL_014c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0151: Unknown result type (might be due to invalid IL or missing references)
		//IL_015b: Unknown result type (might be due to invalid IL or missing references)
		((Graphic)background).color = base.Skin.BackgroundColor;
		((Graphic)verticalScrollbar).color = base.Skin.ScrollbarColor;
		((Graphic)horizontalScrollbar).color = base.Skin.ScrollbarColor;
		searchInputField.textComponent.SetSkinInputFieldText(base.Skin);
		((Graphic)searchInputFieldBackground).color = base.Skin.InputFieldNormalBackgroundColor.Tint(0.08f);
		((Graphic)searchIcon).color = base.Skin.ButtonTextColor;
		searchBarLayoutElement.SetHeight(base.Skin.LineHeight);
		deselectAllLayoutElement.SetHeight(base.Skin.LineHeight);
		((Selectable)deselectAllButton).targetGraphic.color = base.Skin.InputFieldInvalidBackgroundColor;
		deselectAllLabel.SetSkinInputFieldText(base.Skin);
		((Graphic)selectedPathBackground).color = base.Skin.BackgroundColor.Tint(0.1f);
		selectedPathText.SetSkinButtonText(base.Skin);
		Graphic placeholder = searchInputField.placeholder;
		Text val = (Text)(object)((placeholder is Text) ? placeholder : null);
		if ((Object)(object)val != (Object)null)
		{
			float a = ((Graphic)val).color.a;
			val.SetSkinInputFieldText(base.Skin);
			Color color = ((Graphic)val).color;
			color.a = a;
			((Graphic)val).color = color;
		}
		LayoutRebuilder.ForceRebuildLayoutImmediate(drawArea);
		listView.ResetList();
	}

	private void EnsureScrollViewIsWithinBounds()
	{
		if (scrollView.verticalNormalizedPosition <= Mathf.Epsilon)
		{
			scrollView.verticalNormalizedPosition = 0.0001f;
		}
		scrollView.OnScroll(nullPointerEventData);
	}

	void IListViewAdapter.SetItemContent(RecycledListItem item)
	{
		if (isListViewDirty)
		{
			RefreshListView();
		}
		HierarchyField hierarchyField = (HierarchyField)item;
		HierarchyData dataAt = GetDataAt(hierarchyField.Position);
		if (dataAt != null)
		{
			hierarchyField.Skin = base.Skin;
			hierarchyField.SetContent(dataAt);
			hierarchyField.IsSelected = Object.op_Implicit((Object)(object)dataAt.BoundTransform) && currentSelectionSet.Contains(((object)dataAt.BoundTransform).GetHashCode());
			hierarchyField.MultiSelectionToggleVisible = m_multiSelectionToggleSelectionMode;
			hierarchyField.Refresh();
			shouldRecalculateContentWidth = true;
		}
	}

	void IListViewAdapter.OnItemClicked(RecycledListItem item)
	{
		HierarchyField hierarchyField = (HierarchyField)item;
		if (OnItemDoubleClicked != null && (Object)(object)hierarchyField == (Object)(object)lastClickedDrawer && Time.realtimeSinceStartup - lastClickTime <= m_doubleClickThreshold)
		{
			lastClickTime = 0f;
			OnItemDoubleClicked(lastClickedDrawer.Data);
			return;
		}
		lastClickTime = Time.realtimeSinceStartup;
		lastClickedDrawer = hierarchyField;
		bool flag = false;
		Transform boundTransform = hierarchyField.Data.BoundTransform;
		int item2 = (Object.op_Implicit((Object)(object)boundTransform) ? ((object)boundTransform).GetHashCode() : (-1));
		if (m_allowMultiSelection && FindMultiSelectionPivotAbsoluteIndex(out var pivotAbsoluteIndex) && (Input.GetKey((KeyCode)304) || Input.GetKey((KeyCode)303)))
		{
			newSelectionSet.Clear();
			if (Object.op_Implicit((Object)(object)boundTransform))
			{
				newSelectionSet.Add(item2);
				if (currentSelectionSet.Add(item2))
				{
					m_currentSelection.Add(boundTransform);
					flag = true;
				}
			}
			int i = pivotAbsoluteIndex;
			int position = hierarchyField.Position;
			for (int num = ((pivotAbsoluteIndex < position) ? 1 : (-1)); i != position; i += num)
			{
				Transform boundTransform2 = GetDataAt(i).BoundTransform;
				if (Object.op_Implicit((Object)(object)boundTransform2))
				{
					int hashCode = ((object)boundTransform2).GetHashCode();
					newSelectionSet.Add(hashCode);
					if (currentSelectionSet.Add(hashCode))
					{
						m_currentSelection.Add(boundTransform2);
						flag = true;
					}
				}
			}
			for (int num2 = m_currentSelection.Count - 1; num2 >= 0; num2--)
			{
				Transform val = m_currentSelection[num2];
				if (Object.op_Implicit((Object)(object)val))
				{
					int hashCode2 = ((object)val).GetHashCode();
					if (!newSelectionSet.Contains(hashCode2))
					{
						m_currentSelection.RemoveAt(num2);
						currentSelectionSet.Remove(hashCode2);
						flag = true;
					}
				}
			}
		}
		else
		{
			multiSelectionPivotTransform = boundTransform;
			multiSelectionPivotSceneData = hierarchyField.Data.Root;
			hierarchyField.Data.GetSiblingIndexTraversalList(multiSelectionPivotSiblingIndexTraversalList);
			if (m_allowMultiSelection && (m_multiSelectionToggleSelectionMode || Input.GetKey((KeyCode)306) || Input.GetKey((KeyCode)305)))
			{
				if (Object.op_Implicit((Object)(object)boundTransform))
				{
					if (currentSelectionSet.Add(item2))
					{
						m_currentSelection.Add(boundTransform);
					}
					else
					{
						m_currentSelection.Remove(boundTransform);
						currentSelectionSet.Remove(item2);
						if (m_currentSelection.Count == 0)
						{
							MultiSelectionToggleSelectionMode = false;
						}
					}
					flag = true;
				}
			}
			else if (Object.op_Implicit((Object)(object)boundTransform))
			{
				if (m_currentSelection.Count != 1 || (Object)(object)m_currentSelection[0] != (Object)(object)boundTransform)
				{
					m_currentSelection.Clear();
					currentSelectionSet.Clear();
					m_currentSelection.Add(boundTransform);
					currentSelectionSet.Add(item2);
					flag = true;
				}
			}
			else if (m_currentSelection.Count > 0)
			{
				m_currentSelection.Clear();
				currentSelectionSet.Clear();
				flag = true;
			}
		}
		if (flag)
		{
			for (int num3 = drawers.Count - 1; num3 >= 0; num3--)
			{
				if (((Component)drawers[num3]).gameObject.activeSelf)
				{
					Transform boundTransform3 = drawers[num3].Data.BoundTransform;
					if (Object.op_Implicit((Object)(object)boundTransform3))
					{
						if (drawers[num3].IsSelected != currentSelectionSet.Contains(((object)boundTransform3).GetHashCode()))
						{
							drawers[num3].IsSelected = !drawers[num3].IsSelected;
						}
					}
					else if (drawers[num3].IsSelected)
					{
						drawers[num3].IsSelected = false;
					}
				}
			}
			OnCurrentSelectionChanged();
		}
		if (!m_isInSearchMode)
		{
			return;
		}
		bool flag2 = false;
		for (int num4 = m_currentSelection.Count - 1; num4 >= 0; num4--)
		{
			Transform val2 = m_currentSelection[num4];
			if (Object.op_Implicit((Object)(object)val2))
			{
				StringBuilder stringBuilder = RuntimeInspectorUtils.stringBuilder;
				stringBuilder.Length = 0;
				stringBuilder.AppendLine("Path:");
				while (Object.op_Implicit((Object)(object)val2))
				{
					stringBuilder.Append("  ").AppendLine(((Object)val2).name);
					val2 = val2.parent;
				}
				selectedPathText.text = stringBuilder.Append("  ").Append(hierarchyField.Data.Root.Name).ToString();
				flag2 = true;
				break;
			}
		}
		if (((Component)selectedPathBackground).gameObject.activeSelf != flag2)
		{
			((Component)selectedPathBackground).gameObject.SetActive(flag2);
		}
	}

	private bool FindMultiSelectionPivotAbsoluteIndex(out int pivotAbsoluteIndex)
	{
		pivotAbsoluteIndex = 0;
		if (multiSelectionPivotSceneData == null)
		{
			return false;
		}
		bool flag = false;
		List<HierarchyDataRoot> list = (m_isInSearchMode ? searchSceneData : sceneData);
		for (int i = 0; i < list.Count; i++)
		{
			if (list[i] != multiSelectionPivotSceneData)
			{
				pivotAbsoluteIndex += list[i].Height;
				continue;
			}
			flag = true;
			break;
		}
		if (!flag)
		{
			return false;
		}
		if (multiSelectionPivotSiblingIndexTraversalList.Count == 0)
		{
			return true;
		}
		if (!Object.op_Implicit((Object)(object)multiSelectionPivotTransform))
		{
			return false;
		}
		HierarchyData hierarchyData = multiSelectionPivotSceneData.TraverseSiblingIndexList(multiSelectionPivotSiblingIndexTraversalList);
		if (hierarchyData != null && (Object)(object)hierarchyData.BoundTransform == (Object)(object)multiSelectionPivotTransform)
		{
			pivotAbsoluteIndex += hierarchyData.AbsoluteIndex;
			return true;
		}
		hierarchyData = multiSelectionPivotSceneData.FindTransformInVisibleChildren(multiSelectionPivotTransform, (multiSelectionPivotSceneData is HierarchyDataRootPseudoScene) ? multiSelectionPivotSiblingIndexTraversalList.Count : (-1));
		if (hierarchyData != null)
		{
			pivotAbsoluteIndex += hierarchyData.AbsoluteIndex;
			return true;
		}
		if (multiSelectionPivotSceneData is HierarchyDataRootPseudoScene)
		{
			hierarchyData = multiSelectionPivotSceneData.FindTransformInVisibleChildren(multiSelectionPivotTransform);
			if (hierarchyData != null)
			{
				pivotAbsoluteIndex += hierarchyData.AbsoluteIndex;
				return true;
			}
		}
		return false;
	}

	internal HierarchyData GetDataAt(int index)
	{
		List<HierarchyDataRoot> list = ((!m_isInSearchMode) ? sceneData : searchSceneData);
		for (int i = 0; i < list.Count; i++)
		{
			if (list[i].Depth < 0)
			{
				continue;
			}
			if (index < list[i].Height)
			{
				if (index <= 0)
				{
					return list[i];
				}
				return list[i].FindDataAtIndex(index - 1);
			}
			index -= list[i].Height;
		}
		return null;
	}

	public void OnDrawerPointerEvent(HierarchyField drawer, PointerEventData eventData, bool isPointerDown)
	{
		if (!isPointerDown)
		{
			currentlyPressedDrawer = null;
			pressedDrawerActivePointer = null;
			if (justActivatedMultiSelectionToggleSelectionMode)
			{
				justActivatedMultiSelectionToggleSelectionMode = false;
				eventData.eligibleForClick = false;
			}
		}
		else if (m_pointerLongPressAction != 0)
		{
			currentlyPressedDrawer = drawer;
			pressedDrawerActivePointer = eventData;
			pressedDrawerDraggedReferenceCreateTime = Time.realtimeSinceStartup + m_pointerLongPressDuration;
		}
	}

	public bool Select(Transform selection, SelectOptions selectOptions = SelectOptions.None)
	{
		singleTransformSelection[0] = selection;
		return Select((IList<Transform>)singleTransformSelection, selectOptions);
	}

	public bool Select(IList<Transform> selection, SelectOptions selectOptions = SelectOptions.None)
	{
		if (!m_isLocked)
		{
			return SelectInternal(selection, selectOptions);
		}
		return false;
	}

	internal bool SelectInternal(IList<Transform> selection, SelectOptions selectOptions = SelectOptions.None)
	{
		//IL_0207: Unknown result type (might be due to invalid IL or missing references)
		//IL_020c: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_02d3: Expected O, but got Unknown
		//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_02de: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fe: 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_023b: Unknown result type (might be due to invalid IL or missing references)
		if (selectLock)
		{
			return false;
		}
		if (selection.IsEmpty())
		{
			DeselectInternal(null);
			return true;
		}
		Initialize();
		bool flag = (selectOptions & SelectOptions.Additive) == SelectOptions.Additive;
		if (!m_allowMultiSelection)
		{
			flag = false;
			if (selection.Count > 1)
			{
				for (int num = selection.Count - 1; num >= 0; num--)
				{
					if (CanSelectTransform(selection[num]))
					{
						singleTransformSelection[0] = selection[num];
						selection = singleTransformSelection;
						break;
					}
				}
			}
		}
		bool flag2 = false;
		if (flag)
		{
			for (int i = 0; i < selection.Count; i++)
			{
				Transform val = selection[i];
				if (CanSelectTransform(val) && currentSelectionSet.Add(((object)val).GetHashCode()))
				{
					m_currentSelection.Add(val);
					flag2 = true;
				}
			}
		}
		else
		{
			newSelectionSet.Clear();
			for (int j = 0; j < selection.Count; j++)
			{
				Transform val2 = selection[j];
				if (CanSelectTransform(val2))
				{
					int hashCode = ((object)val2).GetHashCode();
					newSelectionSet.Add(hashCode);
					if (currentSelectionSet.Add(hashCode))
					{
						m_currentSelection.Add(val2);
						flag2 = true;
					}
				}
			}
			for (int num2 = m_currentSelection.Count - 1; num2 >= 0; num2--)
			{
				Transform val3 = m_currentSelection[num2];
				if (Object.op_Implicit((Object)(object)val3))
				{
					int hashCode2 = ((object)val3).GetHashCode();
					if (!newSelectionSet.Contains(hashCode2))
					{
						m_currentSelection.RemoveAt(num2);
						currentSelectionSet.Remove(hashCode2);
						flag2 = true;
					}
				}
			}
		}
		if (!flag2 && (selectOptions & SelectOptions.ForceRevealSelection) != SelectOptions.ForceRevealSelection)
		{
			return true;
		}
		if (flag2)
		{
			OnCurrentSelectionChanged();
		}
		Refresh();
		RefreshSearchResults();
		HierarchyDataTransform hierarchyDataTransform = null;
		int num3 = 0;
		List<HierarchyDataRoot> list = (m_isInSearchMode ? searchSceneData : sceneData);
		for (int k = 0; k < m_currentSelection.Count; k++)
		{
			Transform val4 = m_currentSelection[k];
			if (!Object.op_Implicit((Object)(object)val4))
			{
				continue;
			}
			Scene scene = ((Component)val4).gameObject.scene;
			for (int l = 0; l < list.Count; l++)
			{
				HierarchyDataRoot hierarchyDataRoot = list[l];
				if (m_isInSearchMode || hierarchyDataRoot is HierarchyDataRootPseudoScene || ((HierarchyDataRootScene)hierarchyDataRoot).Scene == scene)
				{
					HierarchyDataTransform hierarchyDataTransform2 = hierarchyDataRoot.FindTransform(val4);
					if (hierarchyDataTransform2 != null)
					{
						hierarchyDataTransform = hierarchyDataTransform2;
						num3 = l;
					}
				}
			}
		}
		RefreshListView();
		if (hierarchyDataTransform != null)
		{
			if ((selectOptions & SelectOptions.FocusOnSelection) == SelectOptions.FocusOnSelection)
			{
				int num4 = hierarchyDataTransform.AbsoluteIndex;
				for (int m = 0; m < num3; m++)
				{
					num4 += list[m].Height;
				}
				LayoutRebuilder.ForceRebuildLayoutImmediate((RectTransform)((Component)this).transform);
				Rect rect = drawArea.rect;
				float height = ((Rect)(ref rect)).height;
				rect = ((RectTransform)((Transform)drawArea).parent).rect;
				float height2 = ((Rect)(ref rect)).height;
				if (height > height2)
				{
					float num5 = (float)num4 / (float)totalItemCount * height + (float)base.Skin.LineHeight * 0.5f;
					scrollView.verticalNormalizedPosition = 1f - Mathf.Clamp01((num5 - height2 * 0.5f) / (height - height2));
				}
			}
			return true;
		}
		return false;
	}

	public void Deselect()
	{
		Deselect((IList<Transform>)null);
	}

	public void Deselect(Transform deselection)
	{
		singleTransformSelection[0] = deselection;
		Deselect((IList<Transform>)singleTransformSelection);
	}

	public void Deselect(IList<Transform> deselection)
	{
		if (!m_isLocked)
		{
			DeselectInternal(deselection);
		}
	}

	internal void DeselectInternal(IList<Transform> deselection)
	{
		if (selectLock || m_currentSelection.Count == 0)
		{
			return;
		}
		Initialize();
		bool flag = false;
		if (deselection == null)
		{
			m_currentSelection.Clear();
			currentSelectionSet.Clear();
			flag = true;
		}
		else
		{
			for (int num = deselection.Count - 1; num >= 0; num--)
			{
				Transform val = deselection[num];
				if (Object.op_Implicit((Object)(object)val) && currentSelectionSet.Remove(((object)val).GetHashCode()))
				{
					m_currentSelection.Remove(val);
					flag = true;
				}
			}
		}
		if (!flag)
		{
			return;
		}
		for (int num2 = drawers.Count - 1; num2 >= 0; num2--)
		{
			if (((Component)drawers[num2]).gameObject.activeSelf && drawers[num2].IsSelected)
			{
				drawers[num2].IsSelected = false;
			}
		}
		OnCurrentSelectionChanged();
	}

	public bool IsSelected(Transform transform)
	{
		if (Object.op_Implicit((Object)(object)transform))
		{
			return currentSelectionSet.Contains(((object)transform).GetHashCode());
		}
		return false;
	}

	private bool CanSelectTransform(Transform transform)
	{
		if (!Object.op_Implicit((Object)(object)transform))
		{
			return false;
		}
		if (RuntimeInspectorUtils.IgnoredTransformsInHierarchy.Contains(transform) || (m_gameObjectDelegate != null && !m_gameObjectDelegate(transform)))
		{
			return false;
		}
		Transform val = null;
		for (int i = 0; i < sceneData.Count; i++)
		{
			Transform nearestRootOf = sceneData[i].GetNearestRootOf(transform);
			if (Object.op_Implicit((Object)(object)nearestRootOf) && (!Object.op_Implicit((Object)(object)val) || nearestRootOf.IsChildOf(val)))
			{
				val = nearestRootOf;
			}
		}
		if (!Object.op_Implicit((Object)(object)val))
		{
			return false;
		}
		if ((Object)(object)val != (Object)(object)transform)
		{
			Transform parent = transform.parent;
			while (Object.op_Implicit((Object)(object)parent) && (Object)(object)parent != (Object)(object)val)
			{
				if (RuntimeInspectorUtils.IgnoredTransformsInHierarchy.Contains(parent) || (m_gameObjectDelegate != null && !m_gameObjectDelegate(parent)))
				{
					return false;
				}
				parent = parent.parent;
			}
		}
		return true;
	}

	private void OnCurrentSelectionChanged()
	{
		selectLock = true;
		try
		{
			if (Object.op_Implicit((Object)(object)m_connectedInspector))
			{
				for (int num = m_currentSelection.Count - 1; num >= 0; num--)
				{
					if (Object.op_Implicit((Object)(object)m_currentSelection[num]))
					{
						m_connectedInspector.Inspect(((Component)m_currentSelection[num]).gameObject);
						break;
					}
				}
			}
			if (OnSelectionChanged != null)
			{
				OnSelectionChanged(m_currentSelection.AsReadOnly());
			}
		}
		catch (Exception ex)
		{
			Debug.LogException(ex);
		}
		finally
		{
			selectLock = false;
		}
	}

	private void OnSearchTermChanged(string search)
	{
		if (search != null)
		{
			search = search.Trim();
		}
		if (string.IsNullOrEmpty(search))
		{
			if (m_isInSearchMode)
			{
				for (int i = 0; i < searchSceneData.Count; i++)
				{
					searchSceneData[i].IsExpanded = false;
				}
				scrollView.verticalNormalizedPosition = 1f;
				((Component)selectedPathBackground).gameObject.SetActive(false);
				isListViewDirty = true;
				m_isInSearchMode = false;
				if (m_currentSelection.Count > 0)
				{
					SelectInternal(m_currentSelection, SelectOptions.FocusOnSelection | SelectOptions.ForceRevealSelection);
				}
			}
		}
		else if (!m_isInSearchMode)
		{
			scrollView.verticalNormalizedPosition = 1f;
			nextSearchRefreshTime = Time.realtimeSinceStartup + m_searchRefreshInterval;
			isListViewDirty = true;
			m_isInSearchMode = true;
			RefreshSearchResults();
			for (int j = 0; j < searchSceneData.Count; j++)
			{
				searchSceneData[j].IsExpanded = true;
			}
		}
		else
		{
			RefreshSearchResults();
		}
	}

	private void OnSceneLoaded(Scene arg0, LoadSceneMode arg1)
	{
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: Unknown result type (might be due to invalid IL or missing references)
		if (!ExposeUnityScenes || (((Scene)(ref arg0)).buildIndex >= 0 && exposedUnityScenesSubset != null && exposedUnityScenesSubset.Length != 0 && Array.IndexOf(exposedUnityScenesSubset, ((Scene)(ref arg0)).name) == -1) || !((Scene)(ref arg0)).IsValid())
		{
			return;
		}
		for (int i = 0; i < sceneData.Count; i++)
		{
			if (sceneData[i] is HierarchyDataRootScene && ((HierarchyDataRootScene)sceneData[i]).Scene == arg0)
			{
				return;
			}
		}
		HierarchyDataRootScene hierarchyDataRootScene = new HierarchyDataRootScene(this, arg0);
		hierarchyDataRootScene.Refresh();
		int index = sceneData.Count - pseudoSceneDataLookup.Count;
		sceneData.Insert(index, hierarchyDataRootScene);
		searchSceneData.Insert(index, new HierarchyDataRootSearch(this, hierarchyDataRootScene));
		isListViewDirty = true;
	}

	private void OnSceneUnloaded(Scene arg0)
	{
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: Unknown result type (might be due to invalid IL or missing references)
		for (int i = 0; i < sceneData.Count; i++)
		{
			if (sceneData[i] is HierarchyDataRootScene && ((HierarchyDataRootScene)sceneData[i]).Scene == arg0)
			{
				sceneData[i].IsExpanded = false;
				sceneData.RemoveAt(i);
				searchSceneData[i].IsExpanded = false;
				searchSceneData.RemoveAt(i);
				isListViewDirty = true;
				break;
			}
		}
	}

	private Scene GetDontDestroyOnLoadScene()
	{
		//IL_0028: 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_002f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Expected O, but got Unknown
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: 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_0042: Unknown result type (might be due to invalid IL or missing references)
		GameObject val = null;
		try
		{
			val = new GameObject();
			Object.DontDestroyOnLoad((Object)(object)val);
			Scene scene = val.scene;
			Object.DestroyImmediate((Object)(object)val);
			val = null;
			return scene;
		}
		catch (Exception ex)
		{
			Debug.LogException(ex);
			return default(Scene);
		}
		finally
		{
			if ((Object)(object)val != (Object)null)
			{
				Object.DestroyImmediate((Object)(object)val);
			}
		}
	}

	public void AddToPseudoScene(string scene, Transform transform)
	{
		GetPseudoScene(scene, createIfNotExists: true).AddChild(transform);
	}

	public void AddToPseudoScene(string scene, IEnumerable<Transform> transforms)
	{
		HierarchyDataRootPseudoScene pseudoScene = GetPseudoScene(scene, createIfNotExists: true);
		foreach (Transform transform in transforms)
		{
			pseudoScene.AddChild(transform);
		}
	}

	public void RemoveFromPseudoScene(string scene, Transform transform, bool deleteSceneIfEmpty)
	{
		HierarchyDataRootPseudoScene pseudoScene = GetPseudoScene(scene, createIfNotExists: false);
		if (pseudoScene != null)
		{
			pseudoScene.RemoveChild(transform);
			if (deleteSceneIfEmpty && pseudoScene.ChildCount == 0)
			{
				DeletePseudoScene(scene);
			}
		}
	}

	public void RemoveFromPseudoScene(string scene, IEnumerable<Transform> transforms, bool deleteSceneIfEmpty)
	{
		HierarchyDataRootPseudoScene pseudoScene = GetPseudoScene(scene, createIfNotExists: false);
		if (pseudoScene == null)
		{
			return;
		}
		foreach (Transform transform in transforms)
		{
			pseudoScene.RemoveChild(transform);
		}
		if (deleteSceneIfEmpty && pseudoScene.ChildCount == 0)
		{
			DeletePseudoScene(scene);
		}
	}

	private HierarchyDataRootPseudoScene GetPseudoScene(string scene, bool createIfNotExists)
	{
		if (pseudoSceneDataLookup.TryGetValue(scene, out var value))
		{
			return value;
		}
		if (createIfNotExists)
		{
			return CreatePseudoSceneInternal(scene);
		}
		return null;
	}

	public void CreatePseudoScene(string scene)
	{
		if (!pseudoSceneDataLookup.ContainsKey(scene))
		{
			CreatePseudoSceneInternal(scene);
		}
	}

	private HierarchyDataRootPseudoScene CreatePseudoSceneInternal(string scene)
	{
		int num = 0;
		if (pseudoScenesOrder.Length != 0)
		{
			for (int i = 0; i < pseudoScenesOrder.Length && !(pseudoScenesOrder[i] == scene); i++)
			{
				if (pseudoSceneDataLookup.ContainsKey(pseudoScenesOrder[i]))
				{
					num++;
				}
			}
		}
		else
		{
			num = pseudoSceneDataLookup.Count;
		}
		HierarchyDataRootPseudoScene hierarchyDataRootPseudoScene = new HierarchyDataRootPseudoScene(this, scene);
		num += sceneData.Count - pseudoSceneDataLookup.Count;
		sceneData.Insert(num, hierarchyDataRootPseudoScene);
		searchSceneData.Insert(num, new HierarchyDataRootSearch(this, hierarchyDataRootPseudoScene));
		pseudoSceneDataLookup[scene] = hierarchyDataRootPseudoScene;
		isListViewDirty = true;
		return hierarchyDataRootPseudoScene;
	}

	public void DeleteAllPseudoScenes()
	{
		for (int num = sceneData.Count - 1; num >= 0; num--)
		{
			if (sceneData[num] is HierarchyDataRootPseudoScene)
			{
				sceneData[num].IsExpanded = false;
				sceneData.RemoveAt(num);
				searchSceneData[num].IsExpanded = false;
				searchSceneData.RemoveAt(num);
			}
		}
		pseudoSceneDataLookup.Clear();
		isListViewDirty = true;
	}

	public void DeletePseudoScene(string scene)
	{
		for (int i = 0; i < sceneData.Count; i++)
		{
			if (sceneData[i] is HierarchyDataRootPseudoScene hierarchyDataRootPseudoScene && hierarchyDataRootPseudoScene.Name == scene)
			{
				pseudoSceneDataLookup.Remove(hierarchyDataRootPseudoScene.Name);
				sceneData[i].IsExpanded = false;
				sceneData.RemoveAt(i);
				searchSceneData[i].IsExpanded = false;
				searchSceneData.RemoveAt(i);
				isListViewDirty = true;
				break;
			}
		}
	}

	RecycledListItem IListViewAdapter.CreateItem(Transform parent)
	{
		HierarchyField hierarchyField = Object.Instantiate<HierarchyField>(drawerPrefab, parent, false);
		hierarchyField.Initialize(this);
		hierarchyField.Skin = base.Skin;
		drawers.Add(hierarchyField);
		return hierarchyField;
	}
}
public class HierarchyDragDropListener : MonoBehaviour, IDropHandler, IEventSystemHandler, IPointerEnterHandler, IPointerExitHandler
{
	private const float POINTER_VALIDATE_INTERVAL = 5f;

	[SerializeField]
	private float siblingIndexModificationArea = 5f;

	[SerializeField]
	private float scrollableArea = 75f;

	private float _1OverScrollableArea;

	[SerializeField]
	private float scrollSpeed = 75f;

	[Header("Internal Variables")]
	[SerializeField]
	private RuntimeHierarchy hierarchy;

	[SerializeField]
	private RectTransform content;

	[SerializeField]
	private Image dragDropTargetVisualization;

	private Canvas canvas;

	private RectTransform rectTransform;

	private float height;

	private PointerEventData pointer;

	private Camera worldCamera;

	private float pointerLastYPos;

	private float nextPointerValidation;

	private void Start()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Expected O, but got Unknown
		rectTransform = (RectTransform)((Component)this).transform;
		canvas = ((Component)hierarchy).GetComponentInParent<Canvas>();
		_1OverScrollableArea = 1f / scrollableArea;
	}

	private void OnRectTransformDimensionsChange()
	{
		height = 0f;
	}

	private void Update()
	{
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: 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_011a: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0215: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a7: 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_026a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0289: Unknown result type (might be due to invalid IL or missing references)
		if (pointer == null)
		{
			return;
		}
		nextPointerValidation -= Time.unscaledDeltaTime;
		if (nextPointerValidation <= 0f)
		{
			nextPointerValidation = 5f;
			if (!pointer.IsPointerValid())
			{
				pointer = null;
				return;
			}
		}
		Vector2 val = default(Vector2);
		if (!RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, pointer.position, worldCamera, ref val) || val.y == pointerLastYPos)
		{
			return;
		}
		pointerLastYPos = 0f - val.y;
		if (height <= 0f)
		{
			Rect rect = rectTransform.rect;
			height = ((Rect)(ref rect)).height;
		}
		float num = 0f;
		float num2 = pointerLastYPos;
		if (pointerLastYPos < scrollableArea)
		{
			num = (scrollableArea - pointerLastYPos) * _1OverScrollableArea;
		}
		else if (pointerLastYPos > height - scrollableArea)
		{
			num = (height - scrollableArea - num2) * _1OverScrollableArea;
		}
		float num3 = pointerLastYPos + content.anchoredPosition.y;
		if (num3 < 0f)
		{
			if (((Component)dragDropTargetVisualization).gameObject.activeSelf)
			{
				((Component)dragDropTargetVisualization).gameObject.SetActive(false);
			}
			hierarchy.AutoScrollSpeed = 0f;
			return;
		}
		if (num3 < (float)(hierarchy.ItemCount * hierarchy.Skin.LineHeight))
		{
			if (!((Component)dragDropTargetVisualization).gameObject.activeSelf)
			{
				((Transform)((Graphic)dragDropTargetVisualization).rectTransform).SetAsLastSibling();
				((Component)dragDropTargetVisualization).gameObject.SetActive(true);
			}
			float num4 = num3 % (float)hierarchy.Skin.LineHeight;
			float num5 = 0f - num3 + num4;
			if (num4 < siblingIndexModificationArea)
			{
				((Graphic)dragDropTargetVisualization).rectTransform.anchoredPosition = new Vector2(0f, num5 + 2f);
				((Graphic)dragDropTargetVisualization).rectTransform.sizeDelta = new Vector2(20f, 4f);
			}
			else if (num4 > (float)hierarchy.Skin.LineHeight - siblingIndexModificationArea)
			{
				((Graphic)dragDropTargetVisualization).rectTransform.anchoredPosition = new Vector2(0f, num5 - (float)hierarchy.Skin.LineHeight + 2f);
				((Graphic)dragDropTargetVisualization).rectTransform.sizeDelta = new Vector2(20f, 4f);
			}
			else
			{
				((Graphic)dragDropTargetVisualization).rectTransform.anchoredPosition = new Vector2(0f, num5);
				((Graphic)dragDropTargetVisualization).rectTransform.sizeDelta = new Vector2(20f, (float)hierarchy.Skin.LineHeight);
			}
		}
		else if (((Component)dragDropTargetVisualization).gameObject.activeSelf)
		{
			((Component)dragDropTargetVisualization).gameObject.SetActive(false);
		}
		hierarchy.AutoScrollSpeed = num * scrollSpeed;
	}

	void IDropHandler.OnDrop(PointerEventData eventData)
	{
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		((IPointerExitHandler)this).OnPointerExit(eventData);
		if (!hierarchy.CanReorganizeItems || hierarchy.IsInSearchMode)
		{
			return;
		}
		Transform[] assignableObjectsFromDraggedReferenceItem = RuntimeInspectorUtils.GetAssignableObjectsFromDraggedReferenceItem<Transform>(eventData);
		if (assignableObjectsFromDraggedReferenceItem == null || assignableObjectsFromDraggedReferenceItem.Length == 0)
		{
			return;
		}
		if (assignableObjectsFromDraggedReferenceItem.Length > 1)
		{
			Array.Sort(assignableObjectsFromDraggedReferenceItem, (Transform transform1, Transform transform2) => CompareHierarchySiblingIndices(transform1, transform2));
		}
		bool flag = false;
		float num = pointerLastYPos + content.anchoredPosition.y;
		int num2 = (int)num / hierarchy.Skin.LineHeight;
		HierarchyData hierarchyData = hierarchy.GetDataAt(num2);
		if (hierarchyData == null)
		{
			for (int i = 0; i < assignableObjectsFromDraggedReferenceItem.Length; i++)
			{
				if ((Object)(object)assignableObjectsFromDraggedReferenceItem[i].parent != (Object)null)
				{
					assignableObjectsFromDraggedReferenceItem[i].SetParent((Transform)null, true);
					flag = true;
				}
			}
			if (!flag)
			{
				return;
			}
		}
		else
		{
			float num3 = num % (float)hierarchy.Skin.LineHeight;
			int num4 = ((num3 < siblingIndexModificationArea) ? (-1) : ((num3 > (float)hierarchy.Skin.LineHeight - siblingIndexModificationArea) ? 1 : 0));
			if (num4 != 0 && !(hierarchyData is HierarchyDataTransform))
			{
				if (num4 < 0 && num2 > 0)
				{
					HierarchyData dataAt = hierarchy.GetDataAt(num2 - 1);
					if (dataAt != null)
					{
						hierarchyData = dataAt;
						num4 = 1;
					}
				}
				else if (num4 > 0 && num2 < hierarchy.ItemCount - 1)
				{
					HierarchyData dataAt2 = hierarchy.GetDataAt(num2 + 1);
					if (dataAt2 != null && dataAt2 is HierarchyDataTransform)
					{
						hierarchyData = dataAt2;
						num4 = -1;
					}
				}
			}
			HierarchyDataRoot newScene = null;
			Transform val = null;
			int num5 = -1;
			if (!(hierarchyData is HierarchyDataTransform))
			{
				newScene = (HierarchyDataRoot)hierarchyData;
			}
			else
			{
				val = ((HierarchyDataTransform)hierarchyData).BoundTransform;
				if (!Object.op_Implicit((Object)(object)val))
				{
					return;
				}
				if (num4 != 0)
				{
					if (num4 > 0 && hierarchyData.Height > 1)
					{
						num5 = 0;
					}
					else if (hierarchyData.Depth == 1 && hierarchyData.Root is HierarchyDataRootPseudoScene)
					{
						num5 = ((num4 >= 0) ? (((HierarchyDataRootPseudoScene)hierarchyData.Root).IndexOf(val) + 1) : ((HierarchyDataRootPseudoScene)hierarchyData.Root).IndexOf(val));
						val = null;
					}
					else
					{
						num5 = ((num4 >= 0) ? (val.GetSiblingIndex() + 1) : val.GetSiblingIndex());
						val = val.parent;
					}
				}
				if (!Object.op_Implicit((Object)(object)val))
				{
					newScene = hierarchyData.Root;
				}
			}
			int num6 = 0;
			for (int j = 0; j < assignableObjectsFromDraggedReferenceItem.Length; j++)
			{
				if (DropTransformOnto(assignableObjectsFromDraggedReferenceItem[j], hierarchyData, newScene, val, (num5 >= 0) ? (num5 + num6) : num5, out var decrementSiblingIndex, out var shouldFocusObjectInHierarchy))
				{
					num6++;
					flag = flag || shouldFocusObjectInHierarchy;
					if (decrementSiblingIndex)
					{
						num5--;
					}
				}
			}
			if (num6 == 0)
			{
				return;
			}
		}
		if (flag)
		{
			hierarchy.SelectInternal(assignableObjectsFromDraggedReferenceItem, RuntimeHierarchy.SelectOptions.FocusOnSelection | RuntimeHierarchy.SelectOptions.ForceRevealSelection);
		}
		else
		{
			hierarchy.Refresh();
		}
	}

	private bool DropTransformOnto(Transform droppedTransform, HierarchyData target, HierarchyDataRoot newScene, Transform newParent, int newSiblingIndex, out bool decrementSiblingIndex, out bool shouldFocusObjectInHierarchy)
	{
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
		shouldFocusObjectInHierarchy = false;
		decrementSiblingIndex = false;
		if ((Object)(object)droppedTransform.parent == (Object)(object)newParent)
		{
			if (Object.op_Implicit((Object)(object)newParent) || (newScene is HierarchyDataRootScene && ((HierarchyDataRootScene)newScene).Scene == ((Component)droppedTransform).gameObject.scene))
			{
				if (newSiblingIndex > droppedTransform.GetSiblingIndex())
				{
					newSiblingIndex--;
					decrementSiblingIndex = true;
				}
			}
			else if (newScene is HierarchyDataRootPseudoScene)
			{
				int num = newScene.IndexOf(droppedTransform);
				if (num >= 0 && newSiblingIndex > num)
				{
					newSiblingIndex--;
					decrementSiblingIndex = true;
				}
			}
		}
		if (Object.op_Implicit((Object)(object)newParent))
		{
			if (!hierarchy.CanDropDraggedParentOnChild)
			{
				if (newParent.IsChildOf(droppedTransform))
				{
					return false;
				}
			}
			else
			{
				Transform val = newParent;
				while ((Object)(object)val.parent != (Object)null && (Object)(object)val.parent != (Object)(object)droppedTransform)
				{
					val = val.parent;
				}
				if ((Object)(object)val.parent == (Object)(object)droppedTransform)
				{
					int index;
					if (target.Root is HierarchyDataRootPseudoScene hierarchyDataRootPseudoScene && (index = hierarchyDataRootPseudoScene.IndexOf(droppedTransform)) >= 0 && hierarchy.CanDropDraggedObjectsToPseudoScenes)
					{
						hierarchyDataRootPseudoScene.InsertChild(index, val);
						hierarchyDataRootPseudoScene.RemoveChild(droppedTransform);
					}
					int siblingIndex = droppedTransform.GetSiblingIndex();
					val.SetParent(droppedTransform.parent, true);
					val.SetSiblingIndex(siblingIndex);
					shouldFocusObjectInHierarchy = true;
				}
			}
			droppedTransform.SetParent(newParent, true);
		}
		else if (newScene is HierarchyDataRootPseudoScene)
		{
			if (!hierarchy.CanDropDraggedObjectsToPseudoScenes)
			{
				return false;
			}
			if (newSiblingIndex < 0)
			{
				((HierarchyDataRootPseudoScene)newScene).AddChild(droppedTransform);
			}
			else
			{
				((HierarchyDataRootPseudoScene)newScene).InsertChild(newSiblingIndex, droppedTransform);
				newSiblingIndex = -1;
				target = newScene;
			}
		}
		else if (newScene is HierarchyDataRootScene)
		{
			if ((Object)(object)droppedTransform.parent != (Object)null)
			{
				droppedTransform.SetParent((Transform)null, true);
			}
			Scene scene = ((HierarchyDataRootScene)newScene).Scene;
			if (((Component)droppedTransform).gameObject.scene != scene)
			{
				SceneManager.MoveGameObjectToScene(((Component)droppedTransform).gameObject, scene);
			}
			if (newSiblingIndex < 0)
			{
				newSiblingIndex = ((Scene)(ref scene)).rootCount + 1;
				shouldFocusObjectInHierarchy = true;
			}
		}
		if (newSiblingIndex >= 0)
		{
			droppedTransform.SetSiblingIndex(newSiblingIndex);
		}
		shouldFocusObjectInHierarchy |= newSiblingIndex < 0 && !target.IsExpanded;
		return true;
	}

	private int CompareHierarchySiblingIndices(Transform t1, Transform t2)
	{
		Transform parent = t1.parent;
		Transform parent2 = t2.parent;
		if ((Object)(object)parent == (Object)(object)parent2)
		{
			return t1.GetSiblingIndex() - t2.GetSiblingIndex();
		}
		int i = 0;
		while (Object.op_Implicit((Object)(object)parent))
		{
			i++;
			parent = parent.parent;
		}
		while (Object.op_Implicit((Object)(object)parent2))
		{
			i--;
			parent2 = parent2.parent;
		}
		while (i > 0)
		{
			t1 = t1.parent;
			if ((Object)(object)t1 == (Object)(object)t2)
			{
				return 1;
			}
			i--;
		}
		for (; i < 0; i++)
		{
			t2 = t2.parent;
			if ((Object)(object)t1 == (Object)(object)t2)
			{
				return -1;
			}
		}
		while ((Object)(object)t1.parent != (Object)(object)t2.parent)
		{
			t1 = t1.parent;
			t2 = t2.parent;
		}
		return t1.GetSiblingIndex() - t2.GetSiblingIndex();
	}

	void IPointerEnterHandler.OnPointerEnter(PointerEventData eventData)
	{
		//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_005f: Invalid comparison between Unknown and I4
		if (hierarchy.CanReorganizeItems && !hierarchy.IsInSearchMode && Object.op_Implicit((Object)(object)RuntimeInspectorUtils.GetAssignableObjectFromDraggedReferenceItem<Transform>(eventData)))
		{
			pointer = eventData;
			pointerLastYPos = -1f;
			nextPointerValidation = 5f;
			if ((int)canvas.renderMode == 0 || ((int)canvas.renderMode == 1 && !Object.op_Implicit((Object)(object)canvas.worldCamera)))
			{
				worldCamera = null;
			}
			else
			{
				worldCamera = (Object.op_Implicit((Object)(object)canvas.worldCamera) ? canvas.worldCamera : Camera.main);
			}
			Update();
		}
	}

	void IPointerExitHandler.OnPointerExit(PointerEventData eventData)
	{
		pointer = null;
		worldCamera = null;
		if (((Component)dragDropTargetVisualization).gameObject.activeSelf)
		{
			((Component)dragDropTargetVisualization).gameObject.SetActive(false);
		}
		hierarchy.AutoScrollSpeed = 0f;
	}
}
public class PseudoSceneSourceTransform : MonoBehaviour
{
	[SerializeField]
	private RuntimeHierarchy m_hierarchy;

	[SerializeField]
	private string m_sceneName;

	[SerializeField]
	private bool m_hideOnDisable;

	private HashSet<Transform> childrenCurrent = new HashSet<Transform>();

	private HashSet<Transform> childrenNew = new HashSet<Transform>();

	private bool updateChildren;

	private bool isEnabled = true;

	private bool isQuitting;

	public RuntimeHierarchy Hierarchy
	{
		get
		{
			return m_hierarchy;
		}
		set
		{
			if ((Object)(object)m_hierarchy != (Object)(object)value)
			{
				RemoveChildrenFromScene();
				m_hierarchy = value;
				AddChildrenToScene();
			}
		}
	}

	public string SceneName
	{
		get
		{
			return m_sceneName;
		}
		set
		{
			if (m_sceneName != value)
			{
				RemoveChildrenFromScene();
				m_sceneName = value;
				AddChildrenToScene();
			}
		}
	}

	public bool HideOnDisable
	{
		get
		{
			return m_hideOnDisable;
		}
		set
		{
			if (m_hideOnDisable == value)
			{
				return;
			}
			m_hideOnDisable = value;
			if (!isEnabled)
			{
				if (value)
				{
					RemoveChildrenFromScene();
				}
				else
				{
					AddChildrenToScene();
				}
			}
		}
	}

	private bool ShouldUpdateChildren
	{
		get
		{
			if ((isEnabled || !m_hideOnDisable) && Object.op_Implicit((Object)(object)Hierarchy))
			{
				return !string.IsNullOrEmpty(m_sceneName);
			}
			return false;
		}
	}

	private void OnEnable()
	{
		isEnabled = true;
		updateChildren = true;
	}

	private void OnDisable()
	{
		if (!isQuitting)
		{
			isEnabled = false;
			if (m_hideOnDisable)
			{
				RemoveChildrenFromScene();
			}
		}
	}

	private void OnApplicationQuit()
	{
		isQuitting = true;
	}

	private void OnTransformChildrenChanged()
	{
		updateChildren = true;
	}

	private void Update()
	{
		if (!updateChildren)
		{
			return;
		}
		updateChildren = false;
		if (!ShouldUpdateChildren)
		{
			return;
		}
		for (int i = 0; i < ((Component)this).transform.childCount; i++)
		{
			Transform child = ((Component)this).transform.GetChild(i);
			childrenNew.Add(child);
			if (!childrenCurrent.Remove(child))
			{
				Hierarchy.AddToPseudoScene(m_sceneName, child);
			}
		}
		RemoveChildrenFromScene();
		HashSet<Transform> hashSet = childrenCurrent;
		childrenCurrent = childrenNew;
		childrenNew = hashSet;
	}

	private void AddChildrenToScene()
	{
		if (!ShouldUpdateChildren)
		{
			return;
		}
		for (int i = 0; i < ((Component)this).transform.childCount; i++)
		{
			Transform child = ((Component)this).transform.GetChild(i);
			if (childrenCurrent.Add(child))
			{
				Hierarchy.AddToPseudoScene(m_sceneName, child);
			}
		}
	}

	private void RemoveChildrenFromScene()
	{
		if (!Object.op_Implicit((Object)(object)Hierarchy) || string.IsNullOrEmpty(m_sceneName))
		{
			return;
		}
		foreach (Transform item in childrenCurrent)
		{
			if (Object.op_Implicit((Object)(object)item))
			{
				Hierarchy.RemoveFromPseudoScene(m_sceneName, item, deleteSceneIfEmpty: true);
			}
		}
		childrenCurrent.Clear();
	}
}
public abstract class HierarchyData
{
	private static readonly List<HierarchyDataTransform> transformDataPool = new List<HierarchyDataTransform>(32);

	private static readonly List<List<HierarchyDataTransform>> childrenListPool = new List<List<HierarchyDataTransform>>(32);

	protected List<HierarchyDataTransform> children;

	protected HierarchyData parent;

	protected int m_index;

	protected int m_height = 1;

	protected int m_depth;

	public abstract string Name { get; }

	public abstract bool IsActive { get; }

	public abstract int ChildCount { get; }

	public abstract Transform BoundTransform { get; }

	public HierarchyDataRoot Root
	{
		get
		{
			HierarchyData hierarchyData = this;
			while (hierarchyData.parent != null)
			{
				hierarchyData = hierarchyData.parent;
			}
			return (HierarchyDataRoot)hierarchyData;
		}
	}

	public int Index => m_index;

	public int AbsoluteIndex
	{
		get
		{
			int num = m_index;
			for (HierarchyData hierarchyData = parent; hierarchyData != null; hierarchyData = hierarchyData.parent)
			{
				num += hierarchyData.m_index + 1;
			}
			return num;
		}
	}

	public int Height => m_height;

	public int Depth => m_depth;

	public bool CanExpand => ChildCount > 0;

	public bool IsExpanded
	{
		get
		{
			return children != null;
		}
		set
		{
			if (IsExpanded == value)
			{
				return;
			}
			if (value)
			{
				if (ChildCount == 0)
				{
					return;
				}
				PopChildrenList();
			}
			else
			{
				PoolChildrenList();
			}
			int height = m_height;
			Refresh();
			int num = m_height - height;
			if (num == 0)
			{
				return;
			}
			if (parent != null)
			{
				HierarchyData hierarchyData = this;
				for (HierarchyData hierarchyData2 = parent; hierarchyData2 != null; hierarchyData2 = hierarchyData2.parent)
				{
					List<HierarchyDataTransform> list = hierarchyData2.children;
					int i = list.IndexOf((HierarchyDataTransform)hierarchyData) + 1;
					for (int count = list.Count; i < count; i++)
					{
						list[i].m_index += num;
					}
					hierarchyData2.m_height += num;
					hierarchyData = hierarchyData2;
				}
			}
			Root?.Hierarchy.SetListViewDirty();
		}
	}

	public virtual bool Refresh()
	{
		if (m_depth < 0)
		{
			return false;
		}
		m_height = 1;
		bool flag = false;
		int childCount = ChildCount;
		if (IsExpanded)
		{
			if (childCount != children.Count)
			{
				flag = true;
			}
			RuntimeHierarchy runtimeHierarchy = null;
			for (int i = 0; i < childCount; i++)
			{
				Transform child = GetChild(i);
				if (children.Count <= i)
				{
					if ((Object)(object)runtimeHierarchy == (Object)null)
					{
						runtimeHierarchy = Root.Hierarchy;
					}
					GenerateChildItem(child, i, runtimeHierarchy);
				}
				else if ((Object)(object)children[i].BoundTransform != (Object)(object)child)
				{
					int j;
					for (j = 0; j < children.Count && !((Object)(object)children[j].BoundTransform == (Object)(object)child); j++)
					{
					}
					if (j == children.Count)
					{
						if ((Object)(object)runtimeHierarchy == (Object)null)
						{
							runtimeHierarchy = Root.Hierarchy;
						}
						GenerateChildItem(child, i, runtimeHierarchy);
					}
					else
					{
						HierarchyDataTransform item = children[j];
						children.RemoveAt(j);
						children.Insert(i, item);
					}
					flag = true;
				}
				flag |= children[i].Refresh();
				children[i].m_index = m_height - 1;
				m_height += children[i].m_height;
			}
			for (int num = children.Count - 1; num >= childCount; num--)
			{
				RemoveChildItem(num);
			}
		}
		return flag;
	}

	public HierarchyData FindDataAtIndex(int index)
	{
		int num = children.Count - 1;
		if (index <= num && children[index].m_index == index)
		{
			int i;
			for (i = index; i < num && index == children[i + 1].m_index; i++)
			{
			}
			return children[i];
		}
		int num2 = 0;
		int j = num;
		while (num2 <= j)
		{
			int k = (num2 + j) / 2;
			int index2 = children[k].m_index;
			if (index == index2)
			{
				for (; k < num && index == children[k + 1].m_index; k++)
				{
				}
				return children[k];
			}
			if (index < index2)
			{
				j = k - 1;
			}
			else
			{
				num2 = k + 1;
			}
		}
		if (j < 0)
		{
			j = 0;
		}
		for (; j < num && index >= children[j + 1].m_index; j++)
		{
		}
		return children[j].FindDataAtIndex(index - 1 - children[j].m_index);
	}

	public HierarchyDataTransform FindTransform(Transform target, Transform nextInPath = null)
	{
		if (m_depth < 0)
		{
			return null;
		}
		bool flag = (Object)(object)nextInPath == (Object)null;
		if (flag)
		{
			nextInPath = ((this is HierarchyDataRootSearch) ? target : target.root);
		}
		int num = IndexOf(nextInPath);
		if (num < 0)
		{
			if (!flag || !(this is HierarchyDataRootPseudoScene))
			{
				return null;
			}
			nextInPath = target;
			num = IndexOf(nextInPath);
			while (num < 0 && (Object)(object)nextInPath != (Object)null)
			{
				nextInPath = nextInPath.parent;
				num = IndexOf(nextInPath);
			}
			if (num < 0)
			{
				return null;
			}
		}
		if (!CanExpand)
		{
			return null;
		}
		bool isExpanded = IsExpanded;
		if (!isExpanded)
		{
			IsExpanded = true;
		}
		HierarchyDataTransform hierarchyDataTransform = children[num];
		if ((Object)(object)hierarchyDataTransform.BoundTransform == (Object)(object)target)
		{
			return hierarchyDataTransform;
		}
		HierarchyDataTransform hierarchyDataTransform2 = null;
		if ((Object)(object)hierarchyDataTransform.BoundTransform == (Object)(object)nextInPath)
		{
			Transform val = target;
			Transform val2 = val.parent;
			while ((Object)(object)val2 != (Object)null && (Object)(object)val2 != (Object)(object)nextInPath)
			{
				val = val2;
				val2 = val.parent;
			}
			if ((Object)(object)val2 != (Object)null)
			{
				hierarchyDataTransform2 = hierarchyDataTransform.FindTransform(target, val);
			}
		}
		if (hierarchyDataTransform2 != null && hierarchyDataTransform2.m_depth < 0)
		{
			hierarchyDataTransform2 = null;
		}
		if (hierarchyDataTransform2 == null && !isExpanded)
		{
			IsExpanded = false;
		}
		return hierarchyDataTransform2;
	}

	public virtual HierarchyDataTransform FindTransformInVisibleChildren(Transform target, int targetDepth = -1)
	{
		for (int i = 0; i < children.Count; i++)
		{
			HierarchyDataTransform hierarchyDataTransform = children[i];
			if (hierarchyDataTransform.m_depth < 0)
			{
				continue;
			}
			if (hierarchyDataTransform.BoundTransform == target)
			{
				if (targetDepth <= 0 || hierarchyDataTransform.m_depth == targetDepth)
				{
					return hierarchyDataTransform;
				}
			}
			else if ((targetDepth <= 0 || hierarchyDataTransform.m_depth < targetDepth) && hierarchyDataTransform.IsExpanded && Object.op_Implicit((Object)(object)hierarchyDataTransform.BoundTransform) && target.IsChildOf(hierarchyDataTransform.BoundTransform))
			{
				hierarchyDataTransform = hierarchyDataTransform.FindTransformInVisibleChildren(target, targetDepth);
				if (hierarchyDataTransform != null)
				{
					return hierarchyDataTransform;
				}
			}
		}
		return null;
	}

	public abstract Transform GetChild(int index);

	public int IndexOf(Transform transform)
	{
		for (int num = ChildCount - 1; num >= 0; num--)
		{
			if (GetChild(num) == transform)
			{
				return num;
			}
		}
		return -1;
	}

	public void GetSiblingIndexTraversalList(List<int> traversalList)
	{
		traversalList.Clear();
		HierarchyData hierarchyData = this;
		while (hierarchyData.parent != null)
		{
			traversalList.Add(hierarchyData.parent.children.IndexOf((HierarchyDataTransform)hierarchyData));
			hierarchyData = hierarchyData.parent;
		}
	}

	public HierarchyData TraverseSiblingIndexList(List<int> traversalList)
	{
		HierarchyData hierarchyData = this;
		for (int num = traversalList.Count - 1; num >= 0; num--)
		{
			int num2 = traversalList[num];
			if (hierarchyData.children == null || num2 >= hierarchyData.children.Count)
			{
				return null;
			}
			hierarchyData = hierarchyData.children[num2];
		}
		return hierarchyData;
	}

	private void GenerateChildItem(Transform child, int index, RuntimeHierarchy hierarchy)
	{
		bool flag = !RuntimeInspectorUtils.IgnoredTransformsInHierarchy.Contains(child);
		if (flag && hierarchy.GameObjectFilter != null)
		{
			flag = hierarchy.GameObjectFilter(child);
		}
		int num = transformDataPool.Count - 1;
		HierarchyDataTransform hierarchyDataTransform;
		if (num >= 0)
		{
			hierarchyDataTransform = transformDataPool[num];
			transformDataPool.RemoveAt(num);
		}
		else
		{
			hierarchyDataTransform = new HierarchyDataTransform();
		}
		hierarchyDataTransform.Initialize(child, this is HierarchyDataRootSearch);
		hierarchyDataTransform.parent = this;
		if (flag)
		{
			hierarchyDataTransform.m_depth = m_depth + 1;
			hierarchyDataTransform.m_height = 1;
		}
		else
		{
			hierarchyDataTransform.m_depth = -1;
			hierarchyDataTransform.m_height = 0;
		}
		children.Insert(index, hierarchyDataTransform);
	}

	private void RemoveChildItem(int index)
	{
		children[index].PoolData();
		transformDataPool.Add(children[index]);
		children.RemoveAt(index);
	}

	protected void PoolChildrenList()
	{
		if (children != null)
		{
			for (int num = children.Count - 1; num >= 0; num--)
			{
				children[num].PoolData();
				transformDataPool.Add(children[num]);
			}
			children.Clear();
			childrenListPool.Add(children);
			children = null;
		}
	}

	protected void PopChildrenList()
	{
		int childCount = ChildCount;
		int num = -1;
		int num2 = int.MaxValue;
		for (int num3 = childrenListPool.Count - 1; num3 >= 0; num3--)
		{
			int num4 = childrenListPool[num3].Capacity - childCount;
			if (num4 < 0)
			{
				num4 = -num4;
			}
			if (num4 < num2)
			{
				num2 = num4;
				num = num3;
			}
		}
		if (num >= 0)
		{
			children = childrenListPool[num];
			childrenListPool.RemoveAt(num);
		}
		else
		{
			children = new List<HierarchyDataTransform>(ChildCount);
		}
	}

	public static void ClearPool()
	{
		childrenListPool.Clear();
		transformDataPool.Clear();
		if (childrenListPool.Capacity > 128)
		{
			childrenListPool.Capacity = 128;
		}
		if (transformDataPool.Capacity > 128)
		{
			transformDataPool.Capacity = 128;
		}
	}
}
public abstract class HierarchyDataRoot : HierarchyData
{
	public override Transform BoundTransform => null;

	public override bool IsActive => true;

	public RuntimeHierarchy Hierarchy { get; private set; }

	protected HierarchyDataRoot(RuntimeHierarchy hierarchy)
	{
		Hierarchy = hierarchy;
		PopChildrenList();
	}

	public abstract Transform GetNearestRootOf(Transform target);

	public abstract void RefreshContent();

	public override bool Refresh()
	{
		RefreshContent();
		return base.Refresh();
	}

	public override HierarchyDataTransform FindTransformInVisibleChildren(Transform target, int targetDepth = -1)
	{
		if (m_depth < 0 || !base.IsExpanded)
		{
			return null;
		}
		return base.FindTransformInVisibleChildren(target, targetDepth);
	}

	public void ResetCachedNames()
	{
		if (children != null)
		{
			for (int num = children.Count - 1; num >= 0; num--)
			{
				children[num].ResetCachedName();
			}
		}
	}

	public void RefreshNameOf(Transform target)
	{
		if (children != null)
		{
			for (int num = children.Count - 1; num >= 0; num--)
			{
				children[num].RefreshNameOf(target);
			}
		}
	}
}
public class HierarchyDataRootPseudoScene : HierarchyDataRoot
{
	private readonly string name;

	private readonly List<Transform> rootObjects = new List<Transform>();

	public override string Name => name;

	public override int ChildCount => rootObjects.Count;

	public HierarchyDataRootPseudoScene(RuntimeHierarchy hierarchy, string name)
		: base(hierarchy)
	{
		this.name = name;
	}

	public void AddChild(Transform child)
	{
		if (!rootObjects.Contains(child))
		{
			rootObjects.Add(child);
		}
	}

	public void InsertChild(int index, Transform child)
	{
		index = Mathf.Clamp(index, 0, rootObjects.Count);
		rootObjects.Insert(index, child);
		for (int num = rootObjects.Count - 1; num >= 0; num--)
		{
			if (num != index && (Object)(object)rootObjects[num] == (Object)(object)child)
			{
				rootObjects.RemoveAt(num);
				break;
			}
		}
	}

	public void RemoveChild(Transform child)
	{
		rootObjects.Remove(child);
	}

	public override void RefreshContent()
	{
		for (int num = rootObjects.Count - 1; num >= 0; num--)
		{
			if (!Object.op_Implicit((Object)(object)rootObjects[num]))
			{
				rootObjects.RemoveAt(num);
			}
		}
	}

	public override Transform GetChild(int index)
	{
		return rootObjects[index];
	}

	public override Transform GetNearestRootOf(Transform target)
	{
		Transform val = null;
		for (int num = rootObjects.Count - 1; num >= 0; num--)
		{
			Transform val2 = rootObjects[num];
			if (Object.op_Implicit((Object)(object)val2) && target.IsChildOf(val2) && (!Object.op_Implicit((Object)(object)val) || val2.IsChildOf(val)))
			{
				val = val2;
			}
		}
		return val;
	}
}
public class HierarchyDataRootScene : HierarchyDataRoot
{
	private readonly List<GameObject> rootObjects = new List<GameObject>();

	public override string Name
	{
		get
		{
			//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)
			Scene scene = Scene;
			return ((Scene)(ref scene)).name;
		}
	}

	public override int ChildCount => rootObjects.Count;

	public Scene Scene { get; private set; }

	public HierarchyDataRootScene(RuntimeHierarchy hierarchy, Scene target)
		: base(hierarchy)
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		Scene = target;
	}

	public override void RefreshContent()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: 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)
		rootObjects.Clear();
		Scene scene = Scene;
		if (((Scene)(ref scene)).isLoaded)
		{
			scene = Scene;
			((Scene)(ref scene)).GetRootGameObjects(rootObjects);
		}
	}

	public override Transform GetChild(int index)
	{
		return rootObjects[index].transform;
	}

	public override Transform GetNearestRootOf(Transform target)
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		if (!(((Component)target).gameObject.scene == Scene))
		{
			return null;
		}
		return target.root;
	}
}
public class HierarchyDataRootSearch : HierarchyDataRoot
{
	private readonly List<Transform> searchResult = new List<Transform>();

	private readonly HierarchyDataRoot reference;

	private string searchTerm;

	public override string Name => reference.Name;

	public override int ChildCount => searchResult.Count;

	public HierarchyDataRootSearch(RuntimeHierarchy hierarchy, HierarchyDataRoot reference)
		: base(hierarchy)
	{
		this.reference = reference;
	}

	public override void RefreshContent()
	{
		if (!base.Hierarchy.IsInSearchMode)
		{
			return;
		}
		searchResult.Clear();
		searchTerm = base.Hierarchy.SearchTerm;
		int childCount = reference.ChildCount;
		for (int i = 0; i < childCount; i++)
		{
			Transform child = reference.GetChild(i);
			if (Object.op_Implicit((Object)(object)child) && !RuntimeInspectorUtils.IgnoredTransformsInHierarchy.Contains(((Component)child).transform))
			{
				if (((Object)child).name.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0)
				{
					searchResult.Add(child);
				}
				SearchTransformRecursively(((Component)child).transform);
			}
		}
	}

	public override bool Refresh()
	{
		m_depth = 0;
		bool result = base.Refresh();
		if (searchResult.Count == 0)
		{
			m_height = 0;
			m_depth = -1;
		}
		return result;
	}

	public override HierarchyDataTransform FindTransformInVisibleChildren(Transform target, int targetDepth = -1)
	{
		if (m_depth < 0 || targetDepth > 1 || !base.IsExpanded)
		{
			return null;
		}
		for (int num = children.Count - 1; num >= 0; num--)
		{
			if (children[num].BoundTransform == target)
			{
				return children[num];
			}
		}
		return null;
	}

	private void SearchTransformRecursively(Transform obj)
	{
		for (int i = 0; i < obj.childCount; i++)
		{
			Transform child = obj.GetChild(i);
			if (!RuntimeInspectorUtils.IgnoredTransformsInHierarchy.Contains(child))
			{
				if (((Object)child).name.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0)
				{
					searchResult.Add(child);
				}
				SearchTransformRecursively(child);
			}
		}
	}

	public override Transform GetChild(int index)
	{
		return searchResult[index];
	}

	public override Transform GetNearestRootOf(Transform target)
	{
		if (!searchResult.Contains(target))
		{
			return null;
		}
		return target;
	}
}
public class HierarchyDataTransform : HierarchyData
{
	private string cachedName;

	private Transform transform;

	private bool isSearchEntry;

	public override string Name
	{
		get
		{
			if (cachedName == null)
			{
				cachedName = (Object.op_Implicit((Object)(object)transform) ? ((Object)transform).name : "<destroyed>");
			}
			return cachedName;
		}
	}

	public override int ChildCount
	{
		get
		{
			if (isSearchEntry || !Object.op_Implicit((Object)(object)transform))
			{
				return 0;
			}
			return transform.childCount;
		}
	}

	public override Transform BoundTransform => transform;

	public override bool IsActive
	{
		get
		{
			if (!Object.op_Implicit((Object)(object)transform))
			{
				return true;
			}
			return ((Component)transform).gameObject.activeInHierarchy;
		}
	}

	public void Initialize(Transform transform, bool isSearchEntry)
	{
		this.transform = transform;
		this.isSearchEntry = isSearchEntry;
	}

	public override Transform GetChild(int index)
	{
		return transform.GetChild(index);
	}

	public void ResetCachedName()
	{
		cachedName = null;
		if (children != null)
		{
			for (int num = children.Count - 1; num >= 0; num--)
			{
				children[num].ResetCachedName();
			}
		}
	}

	public void RefreshNameOf(Transform target)
	{
		if (transform == target)
		{
			cachedName = ((Object)target).name;
		}
		else if (children != null)
		{
			for (int num = children.Count - 1; num >= 0; num--)
			{
				children[num].RefreshNameOf(target);
			}
		}
	}

	public void PoolData()
	{
		parent = null;
		cachedName = null;
		m_depth = 0;
		m_height = 0;
		PoolChildrenList();
	}
}
public class HierarchyField : RecycledListItem, ITooltipContent
{
	private enum ExpandedState
	{
		Collapsed,
		Expanded,
		ArrowHidden
	}

	private const float INACTIVE_ITEM_TEXT_ALPHA = 0.57f;

	private const float TEXT_X_OFFSET = 35f;

	[SerializeField]
	private RectTransform contentTransform;

	[SerializeField]
	private Text nameText;

	[SerializeField]
	private PointerEventListener clickListener;

	[SerializeField]
	private PointerEventListener expandToggle;

	[SerializeField]
	private Image expandArrow;

	[SerializeField]
	private Toggle multiSelectionToggle;

	[SerializeField]
	private Image multiSelectionToggleBackground;

	private RectTransform rectTransform;

	private Image background;

	private int m_skinVersion;

	private UISkin m_skin;

	private bool m_isSelected;

	private bool m_isActive;

	private ExpandedState m_isExpanded;

	public UISkin Skin
	{
		get
		{
			return m_skin;
		}
		set
		{
			//IL_0053: 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_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: 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_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)m_skin != (Object)(object)value || m_skinVersion != m_skin.Version)
			{
				m_skin = value;
				m_skinVersion = m_skin.Version;
				rectTransform.sizeDelta = new Vector2(0f, (float)Skin.LineHeight);
				nameText.SetSkinText(Skin);
				((Graphic)expandArrow).color = Skin.ExpandArrowColor;
				((Graphic)nameText).rectTransform.anchoredPosition = new Vector2(Skin.ExpandArrowSpacing + (float)Skin.LineHeight * 0.75f, 0f);
				((RectTransform)((Component)expandToggle).transform).sizeDelta = new Vector2((float)Skin.LineHeight, (float)Skin.LineHeight);
				((RectTransform)((Component)multiSelectionToggle).transform).sizeDelta = new Vector2((float)Skin.LineHeight * 0.8f, (float)Skin.LineHeight * 0.8f);
				multiSelectionToggle.graphic.color = Skin.ToggleCheckmarkColor;
				((Graphic)multiSelectionToggleBackground).color = Skin.InputFieldNormalBackgroundColor;
			}
		}
	}

	public bool IsSelected
	{
		get
		{
			return m_isSelected;
		}
		set
		{
			//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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: 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_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_0094: Unknown result type (might be due to invalid IL or missing references)
			m_isSelected = value;
			Color color;
			if (m_isSelected)
			{
				((Graphic)background).color = Skin.SelectedItemBackgroundColor;
				color = Skin.SelectedItemTextColor;
			}
			else
			{
				((Graphic)background).color = ((Data.Depth == 0) ? Skin.BackgroundColor.Tint(0.075f) : Color.clear);
				color = Skin.TextColor;
			}
			color.a = (m_isActive ? 1f : 0.57f);
			((Graphic)nameText).color = color;
			multiSelectionToggle.isOn = m_isSelected;
		}
	}

	private bool IsActive
	{
		get
		{
			return m_isActive;
		}
		set
		{
			//IL_0016: 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_003d: Unknown result type (might be due to invalid IL or missing references)
			if (m_isActive != value)
			{
				m_isActive = value;
				Color color = ((Graphic)nameText).color;
				color.a = (m_isActive ? 1f : 0.57f);
				((Graphic)nameText).color = color;
			}
		}
	}

	public bool MultiSelectionToggleVisible
	{
		get
		{
			return ((Component)multiSelectionToggle).gameObject.activeSelf;
		}
		set
		{
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			if (Data == null || Data.Depth <= 0)
			{
				value = false;
			}
			if (((Component)multiSelectionToggle).gameObject.activeSelf != value)
			{
				((Component)multiSelectionToggle).gameObject.SetActive(value);
				contentTransform.anchoredPosition = new Vector2((float)(Skin.IndentAmount * Data.Depth) + (value ? ((float)Skin.LineHeight * 0.8f) : 0f), 0f);
			}
		}
	}

	private ExpandedState IsExpanded
	{
		get
		{
			return m_isExpanded;
		}
		set
		{
			//IL_0066: 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)
			if (m_isExpanded != value)
			{
				m_isExpanded = value;
				if (m_isExpanded == ExpandedState.ArrowHidden)
				{
					((Component)expandToggle).gameObject.SetActive(false);
					return;
				}
				((Component)expandToggle).gameObject.SetActive(true);
				((Transform)((Graphic)expandArrow).rectTransform).localEulerAngles = (Vector3)((m_isExpanded == ExpandedState.Expanded) ? new Vector3(0f, 0f, -90f) : Vector3.zero);
			}
		}
	}

	bool ITooltipContent.IsActive
	{
		get
		{
			if (Object.op_Implicit((Object)(object)this))
			{
				return ((Component)this).gameObject.activeSelf;
			}
			return false;
		}
	}

	string ITooltipContent.TooltipText => Data.Name;

	public float PreferredWidth { get; private set; }

	public RuntimeHierarchy Hierarchy { get; private set; }

	public HierarchyData Data { get; private set; }

	public void Initialize(RuntimeHierarchy hierarchy)
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Expected O, but got Unknown
		Hierarchy = hierarchy;
		rectTransform = (RectTransform)((Component)this).transform;
		background = ((Component)clickListener).GetComponent<Image>();
		if (hierarchy.ShowTooltips)
		{
			((Component)clickListener).gameObject.AddComponent<TooltipArea>().Initialize(hierarchy.TooltipListener, this);
		}
		expandToggle.PointerClick += delegate
		{
			ToggleExpandedState();
		};
		clickListener.PointerClick += delegate
		{
			OnClick();
		};
		clickListener.PointerDown += OnPointerDown;
		clickListener.PointerUp += OnPointerUp;
	}

	public void SetContent(HierarchyData data)
	{
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		Data = data;
		contentTransform.anchoredPosition = new Vector2((float)(Skin.IndentAmount * data.Depth) + (MultiSelectionToggleVisible ? ((float)Skin.LineHeight * 0.8f) : 0f), 0f);
		background.sprite = ((data.Depth == 0) ? Hierarchy.SceneDrawerBackground : Hierarchy.TransformDrawerBackground);
		RefreshName();
	}

	private void ToggleExpandedState()
	{
		Data.IsExpanded = !Data.IsExpanded;
	}

	public void Refresh()
	{
		IsActive = Data.IsActive;
		IsExpanded = ((!Data.CanExpand) ? ExpandedState.ArrowHidden : (Data.IsExpanded ? ExpandedState.Expanded : ExpandedState.Collapsed));
	}

	public void RefreshName()
	{
		//IL_005d: Unknown result type (might be due to invalid IL or missing references)
		nameText.text = Data.Name;
		if (Hierarchy.ShowHorizontalScrollbar)
		{
			LayoutRebuilder.ForceRebuildLayoutImmediate(((Graphic)nameText).rectTransform);
			PreferredWidth = (float)(Data.Depth * m_skin.IndentAmount) + 35f + ((Graphic)nameText).rectTransform.sizeDelta.x;
		}
	}

	private void OnPointerDown(PointerEventData eventData)
	{
		Hierarchy.OnDrawerPointerEvent(this, eventData, isPointerDown: true);
	}

	priv