Decompiled source of BanEnforcer v1.9.4

BanList.dll

Decompiled 5 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using MenuLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using Steamworks;
using Steamworks.Data;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("BanList")]
[assembly: AssemblyTitle("BanList")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

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

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace RepoMods.PhotonBanEnforcer
{
	public static class RepoBanPatcher
	{
		public static void Apply(Harmony harmony)
		{
			harmony.PatchAll(typeof(RepoBanPatcher).Assembly);
		}
	}
	public class RepoBanManager : MonoBehaviourPunCallbacks
	{
		[Serializable]
		private class SaveModel
		{
			public List<string> keys = new List<string>();
		}

		private class PlayerInfo
		{
			public string NickName;

			public string SteamId;

			public int ActorNumber;

			public DateTime LastSeen;

			public bool HasSid => !string.IsNullOrEmpty(SteamId);
		}

		[CompilerGenerated]
		private sealed class <DelayedCacheCleanup>d__38 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public int actorNumber;

			public RepoBanManager <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedCacheCleanup>d__38(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(30f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<>4__this._playerCache.Remove(actorNumber);
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <DelayedCheck>d__36 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public Player player;

			public RepoBanManager <>4__this;

			private string <sidText>5__1;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedCheck>d__36(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<sidText>5__1 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(3f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (player != null && PhotonNetwork.PlayerList.Contains(player))
					{
						<sidText>5__1 = <>4__this.ResolveSteam64For(player);
						if (<>4__this.IsSteam64Banned(<sidText>5__1))
						{
							Debug.Log((object)("[RepoBan] Delayed detection of banned player: " + player.NickName));
							<>4__this.EnforceKick(player, <sidText>5__1);
						}
						<sidText>5__1 = null;
					}
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <DelayedScan>d__34 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public RepoBanManager <>4__this;

			private Player[] <>s__1;

			private int <>s__2;

			private Player <p>5__3;

			private string <sidText>5__4;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <DelayedScan>d__34(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>s__1 = null;
				<p>5__3 = null;
				<sidText>5__4 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(1f);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<>s__1 = PhotonNetwork.PlayerList;
					for (<>s__2 = 0; <>s__2 < <>s__1.Length; <>s__2++)
					{
						<p>5__3 = <>s__1[<>s__2];
						<sidText>5__4 = <>4__this.ResolveSteam64For(<p>5__3);
						if (<>4__this.IsSteam64Banned(<sidText>5__4))
						{
							<>4__this.EnforceKick(<p>5__3, <sidText>5__4);
						}
						<sidText>5__4 = null;
						<p>5__3 = null;
					}
					<>s__1 = null;
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <UpdatePlayerInfoRoutine>d__17 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public RepoBanManager <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <UpdatePlayerInfoRoutine>d__17(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0029: Unknown result type (might be due to invalid IL or missing references)
				//IL_0033: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					break;
				case 1:
					<>1__state = -1;
					if (PhotonNetwork.InRoom)
					{
						<>4__this.UpdatePlayerCache();
						<>4__this.EnforceExistingBans();
					}
					<>4__this.RefreshSteamLobbyMap();
					break;
				}
				<>2__current = (object)new WaitForSeconds(2f);
				<>1__state = 1;
				return true;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		public static bool VerboseLogs;

		public static bool LogLocalIds;

		private readonly HashSet<string> _localSteamKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);

		private readonly Dictionary<int, PlayerInfo> _playerCache = new Dictionary<int, PlayerInfo>();

		private readonly Dictionary<ulong, string> _steamLobbyMembers = new Dictionary<ulong, string>();

		private readonly Dictionary<string, List<ulong>> _nameToSteamIds = new Dictionary<string, List<ulong>>(StringComparer.Ordinal);

		private static string _savePath;

		public static RepoBanManager Instance { get; private set; }

		private static string SavePath
		{
			get
			{
				if (!string.IsNullOrEmpty(_savePath))
				{
					return _savePath;
				}
				try
				{
					_savePath = Path.Combine(Paths.ConfigPath, "RepoBanList.json");
				}
				catch
				{
					_savePath = Path.Combine(Application.persistentDataPath, "RepoBanList.json");
				}
				return _savePath;
			}
		}

		public static void EnsureExists()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Expected O, but got Unknown
			if (!Object.op_Implicit((Object)(object)Instance))
			{
				GameObject val = new GameObject("RepoBanManager");
				Object.DontDestroyOnLoad((Object)(object)val);
				Instance = val.AddComponent<RepoBanManager>();
				Instance.LoadLocal();
				Debug.Log((object)"[RepoBan] Manager created (Steam-only).");
			}
		}

		private void Start()
		{
			((MonoBehaviour)this).StartCoroutine(UpdatePlayerInfoRoutine());
			RefreshSteamLobbyMap();
		}

		[IteratorStateMachine(typeof(<UpdatePlayerInfoRoutine>d__17))]
		private IEnumerator UpdatePlayerInfoRoutine()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <UpdatePlayerInfoRoutine>d__17(0)
			{
				<>4__this = this
			};
		}

		internal void RefreshSteamLobbyMap()
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: 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_006f: 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_0074: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if ((Object)(object)SteamManager.instance == (Object)null)
				{
					return;
				}
				Lobby currentLobby = SteamManager.instance.currentLobby;
				SteamId id = ((Lobby)(ref currentLobby)).Id;
				if (!((SteamId)(ref id)).IsValid)
				{
					return;
				}
				_steamLobbyMembers.Clear();
				_nameToSteamIds.Clear();
				foreach (Friend member in ((Lobby)(ref currentLobby)).Members)
				{
					Friend current = member;
					ulong value = current.Id.Value;
					string text = ((Friend)(ref current)).Name ?? string.Empty;
					_steamLobbyMembers[value] = text;
					if (!string.IsNullOrEmpty(text))
					{
						if (!_nameToSteamIds.TryGetValue(text, out List<ulong> value2))
						{
							value2 = new List<ulong>();
							_nameToSteamIds[text] = value2;
						}
						if (!value2.Contains(value))
						{
							value2.Add(value);
						}
					}
				}
			}
			catch
			{
			}
		}

		public string ResolveSteam64For(Player p)
		{
			if (p == null)
			{
				return null;
			}
			PlayerInfo orCreatePlayerInfo = GetOrCreatePlayerInfo(p);
			if (!string.IsNullOrEmpty(orCreatePlayerInfo.SteamId))
			{
				return orCreatePlayerInfo.SteamId;
			}
			string text = ExtractSteam64FromCustomProps(p);
			if (!string.IsNullOrEmpty(text))
			{
				orCreatePlayerInfo.SteamId = text;
				return text;
			}
			if (!string.IsNullOrEmpty(p.NickName) && _nameToSteamIds.TryGetValue(p.NickName, out List<ulong> value) && value.Count > 0)
			{
				orCreatePlayerInfo.SteamId = value[0].ToString();
			}
			return orCreatePlayerInfo.SteamId;
		}

		private string ExtractSteam64FromCustomProps(Player player)
		{
			if (((player != null) ? player.CustomProperties : null) == null)
			{
				return null;
			}
			string[] array = new string[5] { "steamId", "steamID", "steamid", "SteamId", "STEAMID" };
			string[] array2 = array;
			foreach (string text in array2)
			{
				if (!((Dictionary<object, object>)(object)player.CustomProperties).TryGetValue((object)text, out object value))
				{
					continue;
				}
				string text2 = value?.ToString();
				if (!string.IsNullOrEmpty(text2) && text2 != "0")
				{
					if (VerboseLogs && (!player.IsLocal || LogLocalIds))
					{
						Debug.Log((object)("[RepoBan] Found Steam ID for " + player.NickName + ": " + text2 + " (" + text + ")"));
					}
					return text2;
				}
			}
			if (!string.IsNullOrEmpty(player.UserId) && player.UserId.All(char.IsDigit) && player.UserId.Length >= 10)
			{
				return player.UserId;
			}
			return null;
		}

		private void UpdatePlayerCache()
		{
			Player[] playerList = PhotonNetwork.PlayerList;
			foreach (Player val in playerList)
			{
				if (val != null)
				{
					PlayerInfo orCreatePlayerInfo = GetOrCreatePlayerInfo(val);
					bool hasSid = orCreatePlayerInfo.HasSid;
					orCreatePlayerInfo.NickName = val.NickName;
					orCreatePlayerInfo.ActorNumber = val.ActorNumber;
					orCreatePlayerInfo.LastSeen = DateTime.Now;
					orCreatePlayerInfo.SteamId = ResolveSteam64For(val);
					if (!hasSid && orCreatePlayerInfo.HasSid && IsSteam64Banned(orCreatePlayerInfo.SteamId))
					{
						Debug.Log((object)("[RepoBan] Newly identified banned player " + orCreatePlayerInfo.NickName + " — enforcing kick"));
						EnforceKick(val, orCreatePlayerInfo.SteamId);
					}
				}
			}
		}

		private PlayerInfo GetOrCreatePlayerInfo(Player player)
		{
			if (!_playerCache.TryGetValue(player.ActorNumber, out PlayerInfo value))
			{
				value = new PlayerInfo();
				_playerCache[player.ActorNumber] = value;
			}
			return value;
		}

		private void EnforceExistingBans()
		{
			Player[] playerList = PhotonNetwork.PlayerList;
			foreach (Player val in playerList)
			{
				if (val != null && !val.IsLocal)
				{
					string s = ResolveSteam64For(val);
					if (ulong.TryParse(s, out var result) && IsSteamIdBanned(result))
					{
						PlayerInfo orCreatePlayerInfo = GetOrCreatePlayerInfo(val);
						Debug.Log((object)$"[RepoBan] Enforcing ban on {orCreatePlayerInfo.NickName} ({result})");
						EnforceKick(val, result.ToString());
					}
				}
			}
		}

		public static void BanPlayer(Player p)
		{
			if (p != null && !((Object)(object)Instance == (Object)null))
			{
				string s = Instance.ResolveSteam64For(p);
				if (!ulong.TryParse(s, out var result))
				{
					Debug.LogWarning((object)("[RepoBan] Could not resolve Steam64 for " + p.NickName + ". Use the Steam panel/manual field."));
				}
				else
				{
					BanBySteamId(result, p.NickName);
				}
			}
		}

		public static void BanBySteamId(ulong steamId, string displayName = null)
		{
			//IL_0057: 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_0076: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			if (steamId == 0L || (Object)(object)Instance == (Object)null)
			{
				return;
			}
			Instance._localSteamKeys.Add(PrefixSteam(steamId.ToString()));
			Instance.SaveLocal();
			try
			{
				Lobby? val = SteamManager.instance?.currentLobby;
				if (val.HasValue)
				{
					Lobby value = val.Value;
					SteamId id = ((Lobby)(ref value)).Id;
					if (((SteamId)(ref id)).IsValid && SteamLobbyKickUtil.TryKick(val.Value, steamId))
					{
						Debug.Log((object)$"[RepoBan] Steam gate blocked {steamId} via manual ban");
					}
				}
			}
			catch
			{
			}
			Player[] playerList = PhotonNetwork.PlayerList;
			foreach (Player val2 in playerList)
			{
				string text = Instance.ResolveSteam64For(val2);
				if (text == steamId.ToString())
				{
					Instance.EnforceKick(val2, text);
				}
				else if (!string.IsNullOrEmpty(displayName) && string.Equals(val2.NickName, displayName, StringComparison.Ordinal))
				{
					Instance.EnforceKick(val2, steamId.ToString());
				}
			}
		}

		public static void RemoveSteamKey(string key)
		{
			if (!((Object)(object)Instance == (Object)null) && !string.IsNullOrEmpty(key) && Instance._localSteamKeys.Remove(key))
			{
				Instance.SaveLocal();
			}
		}

		public static void ClearAllLocalBans()
		{
			if (!((Object)(object)Instance == (Object)null))
			{
				Instance._localSteamKeys.Clear();
				Instance.SaveLocal();
			}
		}

		public static List<string> LocalSteamKeysSnapshot()
		{
			List<string> source = new List<string>(Instance?._localSteamKeys ?? new HashSet<string>());
			source = source.Where((string k) => k.StartsWith("steam:", StringComparison.OrdinalIgnoreCase)).ToList();
			source.Sort(StringComparer.OrdinalIgnoreCase);
			return source;
		}

		public static Dictionary<ulong, string> SteamLobbySnapshot()
		{
			Dictionary<ulong, string> dictionary = new Dictionary<ulong, string>();
			if ((Object)(object)Instance == (Object)null)
			{
				return dictionary;
			}
			foreach (KeyValuePair<ulong, string> steamLobbyMember in Instance._steamLobbyMembers)
			{
				dictionary[steamLobbyMember.Key] = steamLobbyMember.Value;
			}
			return dictionary;
		}

		private static string PrefixSteam(string id)
		{
			return "steam:" + id;
		}

		public static bool IsSteamIdBanned(ulong steamId)
		{
			if ((Object)(object)Instance == (Object)null || steamId == 0)
			{
				return false;
			}
			return Instance._localSteamKeys.Contains(PrefixSteam(steamId.ToString()));
		}

		private bool IsSteam64Banned(string sidText)
		{
			if (ulong.TryParse(sidText, out var result))
			{
				return IsSteamIdBanned(result);
			}
			return false;
		}

		public override void OnJoinedRoom()
		{
			((MonoBehaviourPunCallbacks)this).OnJoinedRoom();
			_playerCache.Clear();
			RepoBanEnforcerPlugin.ResetManualCloseFlag();
			((MonoBehaviour)this).StartCoroutine(DelayedScan());
		}

		[IteratorStateMachine(typeof(<DelayedScan>d__34))]
		private IEnumerator DelayedScan()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DelayedScan>d__34(0)
			{
				<>4__this = this
			};
		}

		public override void OnPlayerEnteredRoom(Player newPlayer)
		{
			((MonoBehaviourPunCallbacks)this).OnPlayerEnteredRoom(newPlayer);
			if (VerboseLogs)
			{
				Debug.Log((object)$"[RepoBan] Player entered: {newPlayer.NickName} (Actor: {newPlayer.ActorNumber})");
			}
			string text = ResolveSteam64For(newPlayer);
			if (IsSteam64Banned(text))
			{
				Debug.Log((object)("[RepoBan] Immediately detected banned player: " + newPlayer.NickName));
				EnforceKick(newPlayer, text);
			}
			else
			{
				((MonoBehaviour)this).StartCoroutine(DelayedCheck(newPlayer));
			}
		}

		[IteratorStateMachine(typeof(<DelayedCheck>d__36))]
		private IEnumerator DelayedCheck(Player player)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DelayedCheck>d__36(0)
			{
				<>4__this = this,
				player = player
			};
		}

		public override void OnPlayerLeftRoom(Player otherPlayer)
		{
			((MonoBehaviourPunCallbacks)this).OnPlayerLeftRoom(otherPlayer);
			((MonoBehaviour)this).StartCoroutine(DelayedCacheCleanup(otherPlayer.ActorNumber));
		}

		[IteratorStateMachine(typeof(<DelayedCacheCleanup>d__38))]
		private IEnumerator DelayedCacheCleanup(int actorNumber)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <DelayedCacheCleanup>d__38(0)
			{
				<>4__this = this,
				actorNumber = actorNumber
			};
		}

		private void EnforceKick(Player target, string id)
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			if (target != null)
			{
				Debug.Log((object)$"[RepoBan] Enforcing kick on {target.NickName} (Steam64: {id}, Actor: {target.ActorNumber})");
				if (PhotonNetwork.IsMasterClient)
				{
					PhotonNetwork.RemoveRPCs(target);
					PhotonNetwork.DestroyPlayerObjects(target);
					RaiseEventOptions val = new RaiseEventOptions();
					val.TargetActors = new int[1] { target.ActorNumber };
					PhotonNetwork.RaiseEvent((byte)199, (object)null, val, SendOptions.SendReliable);
					bool flag = PhotonNetwork.CloseConnection(target);
					Debug.Log((object)$"[RepoBan] Master closed connection for {target.ActorNumber}/{id}: {flag}");
				}
			}
		}

		private void SaveLocal()
		{
			try
			{
				SaveModel saveModel = new SaveModel
				{
					keys = _localSteamKeys.ToList()
				};
				string contents = JsonUtility.ToJson((object)saveModel, true);
				Directory.CreateDirectory(Path.GetDirectoryName(SavePath));
				File.WriteAllText(SavePath, contents);
				Debug.Log((object)$"[RepoBan] Saved {saveModel.keys.Count} local steam bans to {SavePath}");
			}
			catch (Exception arg)
			{
				Debug.LogWarning((object)$"[RepoBan] SaveLocal failed: {arg}");
			}
		}

		private void LoadLocal()
		{
			try
			{
				_localSteamKeys.Clear();
				if (!File.Exists(SavePath))
				{
					return;
				}
				string text = File.ReadAllText(SavePath);
				SaveModel saveModel = JsonUtility.FromJson<SaveModel>(text);
				if (saveModel?.keys != null)
				{
					foreach (string key in saveModel.keys)
					{
						if (!string.IsNullOrEmpty(key) && key.StartsWith("steam:", StringComparison.OrdinalIgnoreCase))
						{
							_localSteamKeys.Add(key);
						}
					}
				}
				Debug.Log((object)$"[RepoBan] Loaded {_localSteamKeys.Count} local steam bans from {SavePath}");
			}
			catch (Exception arg)
			{
				Debug.LogWarning((object)$"[RepoBan] LoadLocal failed: {arg}");
			}
		}

		public static void DumpDebugInfo()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Debug.Log((object)"[RepoBan] Manager not initialized");
				return;
			}
			Debug.Log((object)"[RepoBan] === DEBUG INFO ===");
			Debug.Log((object)$"[RepoBan] Local steam keys: {Instance._localSteamKeys.Count}");
			foreach (string localSteamKey in Instance._localSteamKeys)
			{
				Debug.Log((object)("[RepoBan]   - " + localSteamKey));
			}
			Debug.Log((object)$"[RepoBan] Steam lobby members: {Instance._steamLobbyMembers.Count}");
			foreach (KeyValuePair<ulong, string> steamLobbyMember in Instance._steamLobbyMembers)
			{
				Debug.Log((object)$"[RepoBan]   - {steamLobbyMember.Value} ({steamLobbyMember.Key})");
			}
			Debug.Log((object)$"[RepoBan] Cached players: {Instance._playerCache.Count}");
			foreach (KeyValuePair<int, PlayerInfo> item in Instance._playerCache)
			{
				PlayerInfo value = item.Value;
				Debug.Log((object)$"[RepoBan]   Actor{item.Key}: {value.NickName} | Steam64: '{value.SteamId}'");
			}
			Debug.Log((object)$"[RepoBan] Current Photon players: {PhotonNetwork.PlayerList.Length}");
			Player[] playerList = PhotonNetwork.PlayerList;
			foreach (Player val in playerList)
			{
				string text = Instance.ResolveSteam64For(val) ?? "Unknown";
				bool flag = Instance.IsSteam64Banned(text);
				Debug.Log((object)$"[RepoBan]   {val.NickName} | Steam64: '{text}' | Banned: {flag}");
			}
		}
	}
	[HarmonyPatch]
	public static class Patch_NetworkManager_BanPlayer
	{
		private static MethodBase TargetMethod()
		{
			Type type = AccessTools.TypeByName("NetworkManager");
			return (type != null) ? AccessTools.Method(type, "BanPlayer", (Type[])null, (Type[])null) : null;
		}

		private static void Postfix(object __instance, PlayerAvatar _playerAvatar)
		{
			try
			{
				if (!((Object)(object)_playerAvatar?.photonView == (Object)null))
				{
					int ownerActorNr = _playerAvatar.photonView.OwnerActorNr;
					Room currentRoom = PhotonNetwork.CurrentRoom;
					Player val = ((currentRoom != null) ? currentRoom.GetPlayer(ownerActorNr, false) : null);
					if (val == null)
					{
						Debug.LogWarning((object)$"[RepoBan] Could not resolve Player for actor {ownerActorNr}");
						return;
					}
					Debug.Log((object)("[RepoBan] NetworkManager.BanPlayer called for " + val.NickName + " (steam-only)"));
					RepoBanManager.BanPlayer(val);
				}
			}
			catch (Exception arg)
			{
				Debug.LogWarning((object)$"[RepoBan] BanPlayer postfix failed: {arg}");
			}
		}
	}
	internal static class SteamLobbyKickUtil
	{
		private static bool _loggedMissing;

		public static bool TryKick(Lobby lobby, ulong steamIdValue)
		{
			//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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				Type typeFromHandle = typeof(SteamMatchmaking);
				SteamId id = ((Lobby)(ref lobby)).Id;
				SteamId val = SteamId.op_Implicit(steamIdValue);
				string[] array = new string[3] { "KickLobbyMember", "KickMember", "KickFromLobby" };
				string[] array2 = array;
				foreach (string name in array2)
				{
					MethodInfo method = typeFromHandle.GetMethod(name, BindingFlags.Static | BindingFlags.Public, null, new Type[2]
					{
						typeof(SteamId),
						typeof(SteamId)
					}, null);
					if (method != null)
					{
						method.Invoke(null, new object[2] { id, val });
						return true;
					}
				}
				if (!_loggedMissing)
				{
					_loggedMissing = true;
					Debug.LogWarning((object)"[RepoBan] Steam kick API not found in this Steamworks build. Will fall back to Photon kick if needed.");
				}
			}
			catch (Exception ex)
			{
				Debug.LogWarning((object)("[RepoBan] SteamLobbyKickUtil.TryKick error: " + ex.Message));
			}
			return false;
		}
	}
	internal static class SteamLobbyGate
	{
		private static bool _registered;

		public static void EnsureRegistered()
		{
			if (_registered)
			{
				return;
			}
			_registered = true;
			try
			{
				SteamMatchmaking.OnLobbyMemberJoined += OnLobbyMemberJoined;
				SteamMatchmaking.OnLobbyMemberLeave += OnLobbyMemberLeft;
				Debug.Log((object)"[RepoBan] SteamLobbyGate registered");
			}
			catch (Exception ex)
			{
				Debug.LogWarning((object)("[RepoBan] SteamLobbyGate registration failed: " + ex.Message));
				_registered = false;
			}
		}

		private static void OnLobbyMemberJoined(Lobby lobby, Friend friend)
		{
			//IL_0031: 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_004c: 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_0084: 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)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				RepoBanManager.Instance?.RefreshSteamLobbyMap();
				if ((Object)(object)SteamManager.instance == (Object)null)
				{
					return;
				}
				SteamId id = ((Lobby)(ref SteamManager.instance.currentLobby)).Id;
				if (!((SteamId)(ref id)).IsValid || SteamId.op_Implicit(((Lobby)(ref lobby)).Id) != SteamId.op_Implicit(((Lobby)(ref SteamManager.instance.currentLobby)).Id) || !((Lobby)(ref SteamManager.instance.currentLobby)).IsOwnedBy(SteamClient.SteamId))
				{
					return;
				}
				ulong value = friend.Id.Value;
				if (RepoBanManager.IsSteamIdBanned(value))
				{
					if (SteamLobbyKickUtil.TryKick(lobby, value))
					{
						Debug.Log((object)$"[RepoBan] Steam gate blocked SteamID {value} at lobby level");
					}
					else
					{
						Debug.Log((object)$"[RepoBan] Steam gate could not kick (API unavailable). Will enforce via Photon for SteamID {value}.");
					}
				}
			}
			catch (Exception ex)
			{
				if (RepoBanManager.VerboseLogs)
				{
					Debug.LogWarning((object)("[RepoBan] SteamLobbyGate.OnLobbyMemberJoined error: " + ex.Message));
				}
			}
		}

		private static void OnLobbyMemberLeft(Lobby lobby, Friend friend)
		{
			RepoBanManager.Instance?.RefreshSteamLobbyMap();
		}
	}
	[BepInPlugin("repo.ban.enforcer", "Repo Ban Enforcer", "1.9.3")]
	public class RepoBanEnforcerPlugin : BaseUnityPlugin
	{
		private enum Tab
		{
			Bans,
			Arcade
		}

		[Serializable]
		[CompilerGenerated]
		private sealed class <>c
		{
			public static readonly <>c <>9 = new <>c();

			public static BuilderDelegate <>9__83_0;

			public static BuilderDelegate <>9__83_1;

			public static Func<Player, int> <>9__110_0;

			public static Func<KeyValuePair<ulong, string>, string> <>9__110_1;

			internal void <Start>b__83_0(Transform parent)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("<size=22><b>BAN LIST</b></size>", (Action)OpenUI, parent, new Vector2(420f, -40f));
				Debug.Log((object)"[RepoBan] MenuLib: added BAN LIST to Escape menu.");
			}

			internal void <Start>b__83_1(Transform parent)
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("<size=22><b>BAN LIST</b></size>", (Action)OpenUI, parent, new Vector2(420f, -40f));
				Debug.Log((object)"[RepoBan] MenuLib: added BAN LIST to Lobby menu.");
			}

			internal int <DrawBanTab>b__110_0(Player p)
			{
				return p.ActorNumber;
			}

			internal string <DrawBanTab>b__110_1(KeyValuePair<ulong, string> k)
			{
				return k.Value;
			}
		}

		[CompilerGenerated]
		private sealed class <LoadDemoAudioAndPlay>d__99 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public RepoBanEnforcerPlugin <>4__this;

			private string <path>5__1;

			private UnityWebRequest <req>5__2;

			private bool <ok>5__3;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <LoadDemoAudioAndPlay>d__99(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				int num = <>1__state;
				if (num == -3 || num == 1)
				{
					try
					{
					}
					finally
					{
						<>m__Finally1();
					}
				}
				<path>5__1 = null;
				<req>5__2 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				try
				{
					switch (<>1__state)
					{
					default:
						return false;
					case 0:
						<>1__state = -1;
						<>4__this._demoTriedLoad = true;
						<path>5__1 = <>4__this.FindNearbyFile("omnidemo.mp3");
						if (!string.IsNullOrEmpty(<path>5__1))
						{
							<req>5__2 = UnityWebRequestMultimedia.GetAudioClip("file://" + <path>5__1, (AudioType)13);
							<>1__state = -3;
							<>2__current = <req>5__2.SendWebRequest();
							<>1__state = 1;
							return true;
						}
						break;
					case 1:
						<>1__state = -3;
						<ok>5__3 = !<req>5__2.isHttpError && !<req>5__2.isNetworkError;
						if (<ok>5__3)
						{
							try
							{
								<>4__this._demoClip = DownloadHandlerAudioClip.GetContent(<req>5__2);
							}
							catch
							{
								<>4__this._demoClip = null;
							}
						}
						<>m__Finally1();
						<req>5__2 = null;
						break;
					}
					if ((Object)(object)<>4__this._demoClip == (Object)null)
					{
						((BaseUnityPlugin)<>4__this).Logger.LogWarning((object)"[RepoBan] omnidemo.mp3 not found or failed to load — using synth fallback.");
						<>4__this._demoClip = <>4__this.CreateDemoFallbackClip();
					}
					if ((Object)(object)<>4__this._demoAudio != (Object)null)
					{
						<>4__this._demoAudio.clip = <>4__this._demoClip;
						<>4__this._demoAudio.Play();
					}
					return false;
				}
				catch
				{
					//try-fault
					((IDisposable)this).Dispose();
					throw;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			private void <>m__Finally1()
			{
				<>1__state = -1;
				if (<req>5__2 != null)
				{
					((IDisposable)<req>5__2).Dispose();
				}
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <Start>d__83 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public RepoBanEnforcerPlugin <>4__this;

			private Exception <e>5__1;

			private string <steamId>5__2;

			private Exception <e>5__3;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <Start>d__83(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<e>5__1 = null;
				<steamId>5__2 = null;
				<e>5__3 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_0075: Unknown result type (might be due to invalid IL or missing references)
				//IL_007f: Expected O, but got Unknown
				//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
				//IL_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_0152: Expected O, but got Unknown
				//IL_016c: 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)
				//IL_0177: Expected O, but got Unknown
				//IL_0104: Unknown result type (might be due to invalid IL or missing references)
				//IL_010e: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					((BaseUnityPlugin)<>4__this).Logger.LogInfo((object)"[RepoBan] Plugin starting…");
					<>2__current = null;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<>2__current = null;
					<>1__state = 2;
					return true;
				case 2:
					<>1__state = -1;
					try
					{
						RepoBanPatcher.Apply(new Harmony("repo.ban.enforcer"));
						RepoBanManager.EnsureExists();
						SteamLobbyGate.EnsureRegistered();
					}
					catch (Exception ex)
					{
						<e>5__1 = ex;
						((BaseUnityPlugin)<>4__this).Logger.LogWarning((object)$"[RepoBan] Init error: {<e>5__1}");
					}
					try
					{
						if (SteamClient.IsValid)
						{
							SteamId steamId = SteamClient.SteamId;
							<steamId>5__2 = ((object)(SteamId)(ref steamId)).ToString();
							if (!string.IsNullOrEmpty(<steamId>5__2))
							{
								if (PhotonNetwork.AuthValues == null)
								{
									PhotonNetwork.AuthValues = new AuthenticationValues();
								}
								PhotonNetwork.AuthValues.UserId = <steamId>5__2;
							}
							<steamId>5__2 = null;
						}
					}
					catch
					{
					}
					try
					{
						object obj2 = <>c.<>9__83_0;
						if (obj2 == null)
						{
							BuilderDelegate val = delegate(Transform parent)
							{
								//IL_002c: Unknown result type (might be due to invalid IL or missing references)
								MenuAPI.CreateREPOButton("<size=22><b>BAN LIST</b></size>", (Action)OpenUI, parent, new Vector2(420f, -40f));
								Debug.Log((object)"[RepoBan] MenuLib: added BAN LIST to Escape menu.");
							};
							<>c.<>9__83_0 = val;
							obj2 = (object)val;
						}
						MenuAPI.AddElementToEscapeMenu((BuilderDelegate)obj2);
						object obj3 = <>c.<>9__83_1;
						if (obj3 == null)
						{
							BuilderDelegate val2 = delegate(Transform parent)
							{
								//IL_002c: Unknown result type (might be due to invalid IL or missing references)
								MenuAPI.CreateREPOButton("<size=22><b>BAN LIST</b></size>", (Action)OpenUI, parent, new Vector2(420f, -40f));
								Debug.Log((object)"[RepoBan] MenuLib: added BAN LIST to Lobby menu.");
							};
							<>c.<>9__83_1 = val2;
							obj3 = (object)val2;
						}
						MenuAPI.AddElementToLobbyMenu((BuilderDelegate)obj3);
					}
					catch (Exception ex)
					{
						<e>5__3 = ex;
						((BaseUnityPlugin)<>4__this).Logger.LogWarning((object)("[RepoBan] MenuLib register failed: " + <e>5__3.Message));
					}
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		internal static ManualLogSource LogSrc;

		private bool _show;

		private bool _userManuallyClosed = false;

		private Rect _win = new Rect(40f, 140f, 980f, 520f);

		private Vector2 _scrollPlayers;

		private Vector2 _scrollBanned;

		private Vector2 _scrollSteam;

		private string _manualSteamBan = "";

		private GUIStyle _winStyle;

		private GUIStyle _boxStyle;

		private GUIStyle _labelStyle;

		private GUIStyle _labelHeaderStyle;

		private GUIStyle _buttonStyle;

		private GUIStyle _textFieldStyle;

		private GUIStyle _tabStyle;

		private GUIStyle _tabActiveStyle;

		private GUIStyle _thinLabelStyle;

		private Texture2D _texGlassWin;

		private Texture2D _texGlassPanel;

		private Texture2D _texBtn;

		private Texture2D _texBtnHover;

		private Texture2D _texBtnActive;

		private Texture2D _texLineRed;

		private Texture2D _texWhite;

		private Texture2D _texBorder;

		private Texture2D _texHighlight;

		private Texture2D _shadowBig;

		private Texture2D _shadowSmall;

		private Texture2D _omniIcon;

		private bool _stylesReady;

		private bool _triedIcon;

		private GUIStyle _hiddenBtnStyle;

		private readonly Color _cText = new Color(0.98f, 0.99f, 1f, 0.98f);

		private readonly Color _cTextSoft = new Color(0.98f, 0.99f, 1f, 0.85f);

		private readonly Color _cGlass = new Color(0.08f, 0.09f, 0.12f, 0.58f);

		private readonly Color _cGlassPanel = new Color(0.1f, 0.12f, 0.16f, 0.42f);

		private readonly Color _cBorder = new Color(1f, 1f, 1f, 0.08f);

		private readonly Color _cHighlight = new Color(1f, 1f, 1f, 0.06f);

		private readonly Color _cRed = new Color(0.98f, 0.22f, 0.28f, 0.85f);

		private readonly Color _cRedHover = new Color(1f, 0.35f, 0.4f, 0.95f);

		private readonly Color _cRedActive = new Color(0.85f, 0.1f, 0.16f, 0.95f);

		private Tab _activeTab = Tab.Bans;

		private bool _pongInit;

		private bool _pongPaused = true;

		private int _pongLeftScore;

		private int _pongRightScore;

		private float _paddleLeftY = 0.5f;

		private float _paddleRightY = 0.5f;

		private float _ballX = 0.5f;

		private float _ballY = 0.5f;

		private float _ballVX = 0.45f;

		private float _ballVY = 0.33f;

		private const float PADDLE_H = 0.18f;

		private const float PADDLE_W = 0.015f;

		private const float BALL_R = 0.012f;

		private const float PADDLE_SPEED = 0.7f;

		private AudioSource _pongAudio;

		private AudioClip _hitClip;

		private bool _cracktroActive = false;

		private float _cracktroStart;

		private float _scrollX;

		private string _scrollMsg = "   Shout out to the R.E.P.O modding Discord and all of the amazing people in there.   We fight for the Users.   I am the Queen of Cursed.   ";

		private AudioSource _demoAudio;

		private AudioClip _demoClip;

		private float[] _spec = new float[64];

		private float _vu;

		private float _vuSmoothed;

		private float _bassLevel;

		private float _bassSmoothed;

		private GUIStyle _demoTitleStyle;

		private GUIStyle _demoScrollStyle;

		private GUIStyle _demoSmallStyle;

		private Texture2D _texScanline;

		private bool _demoTriedLoad;

		private const string DemoFileName = "omnidemo.mp3";

		public static RepoBanEnforcerPlugin Instance { get; private set; }

		public static void OpenUI()
		{
			if ((Object)(object)Instance == (Object)null)
			{
				Instance = Object.FindObjectOfType<RepoBanEnforcerPlugin>();
			}
			if ((Object)(object)Instance != (Object)null)
			{
				Instance._show = true;
				Instance._userManuallyClosed = false;
				Instance._pongPaused = Instance._activeTab != Tab.Arcade;
			}
		}

		public static void ResetManualCloseFlag()
		{
			if ((Object)(object)Instance != (Object)null)
			{
				Instance._userManuallyClosed = false;
			}
		}

		private void Awake()
		{
			Instance = this;
			LogSrc = ((BaseUnityPlugin)this).Logger;
			LoadOmniIcon();
			EnsureAudio();
		}

		[IteratorStateMachine(typeof(<Start>d__83))]
		private IEnumerator Start()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <Start>d__83(0)
			{
				<>4__this = this
			};
		}

		private void Update()
		{
			if (Input.GetKeyDown((KeyCode)287))
			{
				_show = !_show;
				_userManuallyClosed = !_show;
				if (!_show)
				{
					_pongPaused = true;
					StopCracktro();
				}
				return;
			}
			if (Input.GetKeyDown((KeyCode)288))
			{
				RepoBanManager.DumpDebugInfo();
			}
			if (_show && _activeTab == Tab.Arcade && !_pongPaused)
			{
				if (!_pongInit)
				{
					InitPong();
				}
				float dt = Mathf.Clamp(Time.unscaledDeltaTime, 0f, 0.05f);
				StepPong(dt);
			}
			if (!_cracktroActive || !((Object)(object)_demoAudio != (Object)null) || !((Object)(object)_demoAudio.clip != (Object)null))
			{
				return;
			}
			try
			{
				_demoAudio.GetSpectrumData(_spec, 0, (FFTWindow)5);
				float num = 0f;
				int num2 = Mathf.Min(16, _spec.Length);
				for (int i = 0; i < num2; i++)
				{
					num += _spec[i];
				}
				_vu = Mathf.Clamp01(num * 18f);
				_vuSmoothed = Mathf.Lerp(_vuSmoothed, _vu, 0.2f);
				float num3 = 0f;
				int num4 = Mathf.Min(4, _spec.Length);
				for (int j = 0; j < num4; j++)
				{
					num3 += _spec[j];
				}
				_bassLevel = Mathf.Clamp01(num3 * 2f);
				_bassSmoothed = Mathf.Lerp(_bassSmoothed, _bassLevel, 0.15f);
			}
			catch
			{
			}
		}

		private bool IsPauseLike()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Invalid comparison between Unknown and I4
			return Time.timeScale == 0f || (int)Cursor.lockState != 1;
		}

		private Texture2D MakeSolid(int w, int h, Color c)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			Color[] array = (Color[])(object)new Color[w * h];
			for (int i = 0; i < array.Length; i++)
			{
				array[i] = c;
			}
			Texture2D val = new Texture2D(w, h, (TextureFormat)4, false);
			val.SetPixels(array);
			val.Apply();
			((Texture)val).wrapMode = (TextureWrapMode)1;
			return val;
		}

		private Texture2D MakeVerticalGradient(int w, int h, Color top, Color bottom)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: 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_0039: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = new Texture2D(w, h, (TextureFormat)4, false);
			for (int i = 0; i < h; i++)
			{
				float num = (float)i / Mathf.Max(1f, (float)h - 1f);
				Color val2 = Color.Lerp(top, bottom, num);
				for (int j = 0; j < w; j++)
				{
					val.SetPixel(j, i, val2);
				}
			}
			val.Apply();
			((Texture)val).wrapMode = (TextureWrapMode)1;
			return val;
		}

		private Texture2D MakeRadialShadow(int size, float softness = 1.6f, float alpha = 0.35f)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_0013: 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_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			Texture2D val = new Texture2D(size, size, (TextureFormat)4, false);
			Vector2 val2 = new Vector2((float)(size - 1), (float)(size - 1)) * 0.5f;
			float magnitude = ((Vector2)(ref val2)).magnitude;
			for (int i = 0; i < size; i++)
			{
				for (int j = 0; j < size; j++)
				{
					float num = Vector2.Distance(new Vector2((float)j, (float)i), val2) / magnitude;
					float num2 = Mathf.Pow(Mathf.Clamp01(1f - num), softness) * alpha;
					val.SetPixel(j, i, new Color(0f, 0f, 0f, num2));
				}
			}
			val.Apply();
			((Texture)val).wrapMode = (TextureWrapMode)1;
			return val;
		}

		private void EnsureStyles()
		{
			//IL_0059: 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_00e2: 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_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0200: Unknown result type (might be due to invalid IL or missing references)
			//IL_0243: 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_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0307: Unknown result type (might be due to invalid IL or missing references)
			//IL_0321: Unknown result type (might be due to invalid IL or missing references)
			//IL_0326: Unknown result type (might be due to invalid IL or missing references)
			//IL_0338: 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_034a: Unknown result type (might be due to invalid IL or missing references)
			//IL_035c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0363: 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_0380: 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_0392: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c9: Expected O, but got Unknown
			//IL_03ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03dd: Expected O, but got Unknown
			//IL_03de: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ed: Expected O, but got Unknown
			//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_040b: Expected O, but got Unknown
			//IL_0416: Unknown result type (might be due to invalid IL or missing references)
			//IL_041b: Unknown result type (might be due to invalid IL or missing references)
			//IL_042d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0434: Unknown result type (might be due to invalid IL or missing references)
			//IL_043f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0451: Unknown result type (might be due to invalid IL or missing references)
			//IL_0458: Unknown result type (might be due to invalid IL or missing references)
			//IL_0463: Unknown result type (might be due to invalid IL or missing references)
			//IL_0468: Unknown result type (might be due to invalid IL or missing references)
			//IL_0472: Expected O, but got Unknown
			//IL_0473: Unknown result type (might be due to invalid IL or missing references)
			//IL_047a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0484: Expected O, but got Unknown
			//IL_0485: Unknown result type (might be due to invalid IL or missing references)
			//IL_0492: Expected O, but got Unknown
			//IL_049d: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_04b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c1: Expected O, but got Unknown
			//IL_04c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_04cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_04d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_04df: Unknown result type (might be due to invalid IL or missing references)
			//IL_0506: Expected O, but got Unknown
			//IL_050d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0512: Unknown result type (might be due to invalid IL or missing references)
			//IL_051f: Expected O, but got Unknown
			//IL_052a: Unknown result type (might be due to invalid IL or missing references)
			//IL_052f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0541: Unknown result type (might be due to invalid IL or missing references)
			//IL_0547: Unknown result type (might be due to invalid IL or missing references)
			//IL_0552: Unknown result type (might be due to invalid IL or missing references)
			//IL_0564: Unknown result type (might be due to invalid IL or missing references)
			//IL_056a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0575: Unknown result type (might be due to invalid IL or missing references)
			//IL_0587: Unknown result type (might be due to invalid IL or missing references)
			//IL_058d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0598: Unknown result type (might be due to invalid IL or missing references)
			//IL_05a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_05aa: Expected O, but got Unknown
			//IL_05ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_05b8: Expected O, but got Unknown
			//IL_05c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_05c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_05da: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_05fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0605: Unknown result type (might be due to invalid IL or missing references)
			//IL_0615: Expected O, but got Unknown
			//IL_061c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0626: Expected O, but got Unknown
			//IL_062d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0637: Expected O, but got Unknown
			//IL_0642: Unknown result type (might be due to invalid IL or missing references)
			//IL_0647: Unknown result type (might be due to invalid IL or missing references)
			//IL_0658: Unknown result type (might be due to invalid IL or missing references)
			//IL_0672: Unknown result type (might be due to invalid IL or missing references)
			//IL_067d: Unknown result type (might be due to invalid IL or missing references)
			//IL_068e: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_06b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_06de: Unknown result type (might be due to invalid IL or missing references)
			//IL_06e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_06f8: Expected O, but got Unknown
			//IL_06f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_06fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0708: Expected O, but got Unknown
			//IL_0709: Unknown result type (might be due to invalid IL or missing references)
			//IL_070e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0718: Expected O, but got Unknown
			//IL_071e: Expected O, but got Unknown
			if (!_stylesReady)
			{
				_texGlassWin = MakeVerticalGradient(4, 64, new Color(_cGlass.r + 0.02f, _cGlass.g + 0.02f, _cGlass.b + 0.03f, _cGlass.a + 0.04f), new Color(_cGlass.r, _cGlass.g, _cGlass.b, _cGlass.a));
				_texGlassPanel = MakeVerticalGradient(4, 64, new Color(_cGlassPanel.r + 0.02f, _cGlassPanel.g + 0.02f, _cGlassPanel.b + 0.03f, _cGlassPanel.a + 0.03f), _cGlassPanel);
				_texBorder = MakeSolid(2, 2, _cBorder);
				_texHighlight = MakeSolid(2, 2, _cHighlight);
				_texBtn = MakeVerticalGradient(4, 32, new Color(_cRed.r, _cRed.g, _cRed.b, _cRed.a), new Color(_cRed.r * 0.9f, _cRed.g * 0.9f, _cRed.b * 0.9f, _cRed.a));
				_texBtnHover = MakeVerticalGradient(4, 32, _cRedHover, new Color(_cRedHover.r * 0.88f, _cRedHover.g * 0.88f, _cRedHover.b * 0.88f, _cRedHover.a));
				_texBtnActive = MakeVerticalGradient(4, 32, _cRedActive, new Color(_cRedActive.r * 0.85f, _cRedActive.g * 0.85f, _cRedActive.b * 0.85f, _cRedActive.a));
				_texLineRed = MakeSolid(2, 2, new Color(1f, 0.13f, 0.18f, 0.7f));
				_texWhite = MakeSolid(2, 2, new Color(1f, 1f, 1f, 0.92f));
				_shadowBig = MakeRadialShadow(256, 2f, 0.32f);
				_shadowSmall = MakeRadialShadow(128, 2.2f, 0.25f);
				_texScanline = MakeVerticalGradient(2, 4, new Color(1f, 1f, 1f, 0.06f), new Color(1f, 1f, 1f, 0f));
				GUIStyle val = new GUIStyle(GUI.skin.window);
				val.normal.background = _texGlassWin;
				val.normal.textColor = _cText;
				val.active.background = _texGlassWin;
				val.active.textColor = _cText;
				val.onNormal.background = _texGlassWin;
				val.onNormal.textColor = _cText;
				val.onActive.background = _texGlassWin;
				val.onActive.textColor = _cText;
				val.border = new RectOffset(12, 12, 24, 14);
				val.padding = new RectOffset(12, 12, 32, 12);
				val.margin = new RectOffset(0, 0, 0, 0);
				val.fontStyle = (FontStyle)1;
				val.richText = true;
				val.alignment = (TextAnchor)0;
				_winStyle = val;
				GUIStyle val2 = new GUIStyle(GUI.skin.box);
				val2.normal.background = _texGlassPanel;
				val2.normal.textColor = _cText;
				val2.active.background = _texGlassPanel;
				val2.active.textColor = _cText;
				val2.margin = new RectOffset(2, 2, 2, 2);
				val2.padding = new RectOffset(10, 10, 8, 8);
				val2.richText = true;
				_boxStyle = val2;
				GUIStyle val3 = new GUIStyle(GUI.skin.label);
				val3.normal.textColor = _cText;
				val3.richText = true;
				_labelStyle = val3;
				GUIStyle val4 = new GUIStyle(_labelStyle);
				val4.normal.textColor = _cTextSoft;
				val4.fontSize = Mathf.RoundToInt((float)GUI.skin.label.fontSize * 0.95f);
				_thinLabelStyle = val4;
				_labelHeaderStyle = new GUIStyle(_labelStyle)
				{
					fontStyle = (FontStyle)1
				};
				GUIStyle val5 = new GUIStyle(GUI.skin.button);
				val5.normal.background = _texBtn;
				val5.normal.textColor = Color.white;
				val5.hover.background = _texBtnHover;
				val5.hover.textColor = Color.white;
				val5.active.background = _texBtnActive;
				val5.active.textColor = Color.white;
				val5.padding = new RectOffset(12, 12, 8, 10);
				val5.richText = true;
				_buttonStyle = val5;
				GUIStyle val6 = new GUIStyle(GUI.skin.textField);
				val6.normal.background = _texGlassPanel;
				val6.normal.textColor = _cText;
				val6.focused.background = _texGlassPanel;
				val6.focused.textColor = _cText;
				_textFieldStyle = val6;
				_tabStyle = new GUIStyle(_buttonStyle);
				_tabActiveStyle = new GUIStyle(_buttonStyle);
				GUIStyle val7 = new GUIStyle(GUI.skin.button);
				val7.normal.background = Texture2D.blackTexture;
				val7.normal.textColor = new Color(0f, 0f, 0f, 0f);
				val7.hover.background = Texture2D.blackTexture;
				val7.hover.textColor = new Color(0f, 0f, 0f, 0f);
				val7.active.background = Texture2D.blackTexture;
				val7.active.textColor = new Color(0f, 0f, 0f, 0f);
				val7.border = new RectOffset(0, 0, 0, 0);
				val7.margin = new RectOffset(0, 0, 0, 0);
				val7.padding = new RectOffset(0, 0, 0, 0);
				_hiddenBtnStyle = val7;
				_hiddenBtnStyle.normal.background = null;
				_hiddenBtnStyle.hover.background = null;
				_hiddenBtnStyle.active.background = null;
				_stylesReady = true;
			}
		}

		private void LoadOmniIcon()
		{
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Expected O, but got Unknown
			if (_triedIcon)
			{
				return;
			}
			_triedIcon = true;
			try
			{
				string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
				string text = Path.Combine(directoryName ?? "", "omni.png");
				if (!File.Exists(text))
				{
					text = Path.Combine(Paths.ConfigPath, "omni.png");
				}
				if (File.Exists(text))
				{
					byte[] array = File.ReadAllBytes(text);
					_omniIcon = new Texture2D(2, 2, (TextureFormat)4, false);
					ImageConversion.LoadImage(_omniIcon, array, false);
					_omniIcon.Apply();
					((BaseUnityPlugin)this).Logger.LogInfo((object)("[RepoBan] Loaded icon: " + text));
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)"[RepoBan] omni.png not found (optional).");
				}
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("[RepoBan] Icon load failed: " + ex.Message));
			}
		}

		private void EnsureAudio()
		{
			if (!((Object)(object)_pongAudio != (Object)null))
			{
				_pongAudio = ((Component)this).gameObject.AddComponent<AudioSource>();
				_pongAudio.playOnAwake = false;
				_pongAudio.spatialBlend = 0f;
				_pongAudio.volume = 0.25f;
				_hitClip = CreateClickClip(0.035f, 920f);
			}
		}

		private AudioClip CreateClickClip(float duration, float frequency)
		{
			int num = 44100;
			int num2 = Mathf.CeilToInt(duration * (float)num);
			AudioClip val = AudioClip.Create("pong_click", num2, 1, num, false);
			float[] array = new float[num2];
			for (int i = 0; i < num2; i++)
			{
				float num3 = (float)i / (float)num;
				float num4 = Mathf.Exp(-24f * num3);
				array[i] = Mathf.Sin(MathF.PI * 2f * frequency * num3) * num4 * 0.35f;
			}
			val.SetData(array, 0);
			return val;
		}

		private void PlayHitSfx()
		{
			if ((Object)(object)_pongAudio != (Object)null && (Object)(object)_hitClip != (Object)null)
			{
				_pongAudio.PlayOneShot(_hitClip, 0.9f);
			}
		}

		private void StartCracktro()
		{
			_cracktroActive = true;
			_cracktroStart = Time.unscaledTime;
			_scrollX = 0f;
			_vu = (_vuSmoothed = 0f);
			_bassLevel = (_bassSmoothed = 0f);
			if ((Object)(object)_demoAudio == (Object)null)
			{
				_demoAudio = ((Component)this).gameObject.AddComponent<AudioSource>();
				_demoAudio.playOnAwake = false;
				_demoAudio.loop = true;
				_demoAudio.spatialBlend = 0f;
				_demoAudio.volume = 0.92f;
			}
			if (!_demoTriedLoad)
			{
				((MonoBehaviour)this).StartCoroutine(LoadDemoAudioAndPlay());
				return;
			}
			if ((Object)(object)_demoClip == (Object)null)
			{
				_demoClip = CreateDemoFallbackClip();
			}
			_demoAudio.clip = _demoClip;
			_demoAudio.Play();
		}

		private void DrawRotatingCubes(Vector2 center, Vector2 textSize, float time, float bassLevel)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: 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_009a: Unknown result type (might be due to invalid IL or missing references)
			float num = (textSize.x + textSize.y) * 0.3f + bassLevel * 20f;
			float size = 12f + bassLevel * 8f;
			int num2 = 6;
			Vector2 pos = default(Vector2);
			for (int i = 0; i < num2; i++)
			{
				float num3 = (float)i / (float)num2 * 2f * MathF.PI;
				float num4 = 0.8f + bassLevel * 1.2f;
				float num5 = time * num4 + num3;
				((Vector2)(ref pos))..ctor(center.x + Mathf.Cos(num5) * num, center.y + Mathf.Sin(num5) * num * 0.6f);
				float rotation = time * 2f + num3;
				DrawPseudo3DCube(pos, size, rotation, bassLevel);
			}
		}

		private void DrawPseudo3DCube(Vector2 pos, float size, float rotation, float bassLevel)
		{
			//IL_0015: 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_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)
			//IL_004f: 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_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_00a2: 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_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: 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_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: 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_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_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: 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_015f: 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_0170: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: Unknown result type (might be due to invalid IL or missing references)
			//IL_0196: 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_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: Unknown result type (might be due to invalid IL or missing references)
			//IL_021b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0220: Unknown result type (might be due to invalid IL or missing references)
			//IL_0235: Unknown result type (might be due to invalid IL or missing references)
			//IL_023a: Unknown result type (might be due to invalid IL or missing references)
			//IL_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0254: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_026f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0297: Unknown result type (might be due to invalid IL or missing references)
			Color val = Color.Lerp(new Color(0.3f, 0.3f, 0.8f, 0.7f), new Color(1f, 0.2f, 0.8f, 0.9f), bassLevel);
			Color val2 = Color.Lerp(new Color(0.6f, 0.6f, 1f, 0.8f), new Color(1f, 0.8f, 0.2f, 1f), bassLevel);
			float num = size * 0.5f;
			Vector2 val3 = default(Vector2);
			((Vector2)(ref val3))..ctor(Mathf.Cos(rotation) * num * 0.3f, Mathf.Sin(rotation) * num * 0.3f);
			Rect val4 = default(Rect);
			((Rect)(ref val4))..ctor(pos.x - num + val3.x, pos.y - num + val3.y, size, size);
			GUI.color = new Color(val.r * 0.6f, val.g * 0.6f, val.b * 0.6f, val.a * 0.8f);
			GUI.DrawTexture(val4, (Texture)(object)_texGlassPanel);
			Rect val5 = default(Rect);
			((Rect)(ref val5))..ctor(pos.x - num, pos.y - num, size, size);
			GUI.color = val;
			GUI.DrawTexture(val5, (Texture)(object)_texGlassPanel);
			GUI.color = val2;
			DrawRectBorder(val5, 1f, (Texture)(object)_texBorder);
			GUI.color = new Color(val2.r, val2.g, val2.b, 0.6f);
			Vector2[] array = (Vector2[])(object)new Vector2[4]
			{
				new Vector2(((Rect)(ref val5)).xMin, ((Rect)(ref val5)).yMin),
				new Vector2(((Rect)(ref val5)).xMax, ((Rect)(ref val5)).yMin),
				new Vector2(((Rect)(ref val5)).xMax, ((Rect)(ref val5)).yMax),
				new Vector2(((Rect)(ref val5)).xMin, ((Rect)(ref val5)).yMax)
			};
			Vector2[] array2 = (Vector2[])(object)new Vector2[4]
			{
				new Vector2(((Rect)(ref val4)).xMin, ((Rect)(ref val4)).yMin),
				new Vector2(((Rect)(ref val4)).xMax, ((Rect)(ref val4)).yMin),
				new Vector2(((Rect)(ref val4)).xMax, ((Rect)(ref val4)).yMax),
				new Vector2(((Rect)(ref val4)).xMin, ((Rect)(ref val4)).yMax)
			};
			for (int i = 0; i < 4; i++)
			{
				DrawLine(array[i], array2[i], _texBorder, 1f);
			}
			GUI.color = Color.white;
		}

		private void DrawLine(Vector2 start, Vector2 end, Texture2D tex, float thickness)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: 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_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: 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_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)
			//IL_0073: 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_0083: Unknown result type (might be due to invalid IL or missing references)
			Vector2 val = end - start;
			Vector2 normalized = ((Vector2)(ref val)).normalized;
			float num = Vector2.Distance(start, end);
			float num2 = Mathf.Atan2(normalized.y, normalized.x) * 57.29578f;
			Vector2 val2 = (start + end) * 0.5f;
			Rect val3 = default(Rect);
			((Rect)(ref val3))..ctor(val2.x - num * 0.5f, val2.y - thickness * 0.5f, num, thickness);
			Matrix4x4 matrix = GUI.matrix;
			GUIUtility.RotateAroundPivot(num2, val2);
			GUI.DrawTexture(val3, (Texture)(object)tex);
			GUI.matrix = matrix;
		}

		private void StopCracktro()
		{
			_cracktroActive = false;
			if ((Object)(object)_demoAudio != (Object)null)
			{
				_demoAudio.Stop();
			}
		}

		[IteratorStateMachine(typeof(<LoadDemoAudioAndPlay>d__99))]
		private IEnumerator LoadDemoAudioAndPlay()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <LoadDemoAudioAndPlay>d__99(0)
			{
				<>4__this = this
			};
		}

		private string FindNearbyFile(string filename)
		{
			try
			{
				string directoryName = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
				string text = Path.Combine(directoryName ?? "", filename);
				if (File.Exists(text))
				{
					return text;
				}
				string text2 = Path.Combine(Paths.ConfigPath, filename);
				if (File.Exists(text2))
				{
					return text2;
				}
				string text3 = Path.Combine(Application.streamingAssetsPath ?? "", filename);
				if (File.Exists(text3))
				{
					return text3;
				}
			}
			catch
			{
			}
			return null;
		}

		private AudioClip CreateDemoFallbackClip()
		{
			int num = 44100;
			float num2 = 60f;
			int num3 = Mathf.CeilToInt(num2 * (float)num);
			AudioClip val = AudioClip.Create("omnidemo_fallback", num3, 1, num, false);
			float[] array = new float[num3];
			float[] array2 = new float[8] { 110f, 146.83f, 164.81f, 220f, 246.94f, 329.63f, 196f, 174.61f };
			for (int i = 0; i < num3; i++)
			{
				float num4 = (float)i / (float)num;
				float num5 = array2[i / (num / 2) % array2.Length];
				float num6 = Mathf.Sign(Mathf.Sin(MathF.PI * 2f * num5 * num4));
				float num7 = 2f * (num4 * num5 - Mathf.Floor(0.5f + num4 * num5));
				float num8 = Mathf.Clamp01(1f - Mathf.Repeat(num4, 0.5f) * 1.6f);
				float num9 = (num6 * 0.45f + num7 * 0.25f) * num8;
				float num10 = Mathf.Repeat(num4, 0.5f);
				num9 += Mathf.Exp((0f - num10) * 24f) * 0.25f * Mathf.Sin(MathF.PI * 100f * num4);
				array[i] = num9 * 0.5f;
			}
			val.SetData(array, 0);
			return val;
		}

		private void OnGUI()
		{
			//IL_001c: 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_00b7: 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_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Expected O, but got Unknown
			//IL_00da: 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_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_010a: Unknown result type (might be due to invalid IL or missing references)
			EnsureStyles();
			if (!_show)
			{
				return;
			}
			DrawWindowShadow(_win, (Texture)(object)_shadowBig, 18f);
			if (!PhotonNetwork.InRoom)
			{
				_win = GUILayout.Window(987123, _win, new WindowFunction(DrawNoRoom), "Repo Ban — not in room", _winStyle, Array.Empty<GUILayoutOption>());
				DrawHeaderBevel(_win);
				DrawTopIcon(_win);
				if (_cracktroActive)
				{
					DrawCracktroOverlay(_win);
				}
			}
			else
			{
				_win = GUILayout.Window(987122, _win, new WindowFunction(DrawWindow), PhotonNetwork.IsMasterClient ? "Ban List (Host) — F6 | F7=Debug" : "Ban List (Viewer) — F6 | F7=Debug", _winStyle, Array.Empty<GUILayoutOption>());
				DrawHeaderBevel(_win);
				DrawTopIcon(_win);
				if (_cracktroActive)
				{
					DrawCracktroOverlay(_win);
				}
			}
		}

		private void DrawTopIcon(Rect win)
		{
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)_omniIcon == (Object)null))
			{
				float num = 52f;
				float num2 = 8f;
				Rect val = default(Rect);
				((Rect)(ref val))..ctor(((Rect)(ref win)).x + ((Rect)(ref win)).width - num - num2, ((Rect)(ref win)).y + num2, num, num);
				GUI.DrawTexture(val, (Texture)(object)_omniIcon, (ScaleMode)2, true);
			}
		}

		private void DrawHeaderBevel(Rect win)
		{
			//IL_0034: 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)
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(((Rect)(ref win)).x + 6f, ((Rect)(ref win)).y + 6f, ((Rect)(ref win)).width - 12f, 2f);
			GUI.DrawTexture(val, (Texture)(object)_texHighlight);
			Rect r = default(Rect);
			((Rect)(ref r))..ctor(((Rect)(ref win)).x + 3f, ((Rect)(ref win)).y + 3f, ((Rect)(ref win)).width - 6f, ((Rect)(ref win)).height - 6f);
			DrawRectBorder(r, 1f, (Texture)(object)_texBorder);
		}

		private void DrawWindowShadow(Rect r, Texture tex, float padding)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(((Rect)(ref r)).x - padding, ((Rect)(ref r)).y - padding, ((Rect)(ref r)).width + padding * 2f, ((Rect)(ref r)).height + padding * 2f);
			GUI.DrawTexture(val, tex, (ScaleMode)0, true);
		}

		private void DrawRectBorder(Rect r, float thickness, Texture tex)
		{
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: 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_0091: Unknown result type (might be due to invalid IL or missing references)
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(((Rect)(ref r)).x, ((Rect)(ref r)).y, ((Rect)(ref r)).width, thickness);
			Rect val2 = default(Rect);
			((Rect)(ref val2))..ctor(((Rect)(ref r)).x, ((Rect)(ref r)).yMax - thickness, ((Rect)(ref r)).width, thickness);
			Rect val3 = default(Rect);
			((Rect)(ref val3))..ctor(((Rect)(ref r)).x, ((Rect)(ref r)).y, thickness, ((Rect)(ref r)).height);
			Rect val4 = default(Rect);
			((Rect)(ref val4))..ctor(((Rect)(ref r)).xMax - thickness, ((Rect)(ref r)).y, thickness, ((Rect)(ref r)).height);
			GUI.DrawTexture(val, tex);
			GUI.DrawTexture(val2, tex);
			GUI.DrawTexture(val3, tex);
			GUI.DrawTexture(val4, tex);
		}

		private void DrawNoRoom(int id)
		{
			//IL_0065: 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_009e: Unknown result type (might be due to invalid IL or missing references)
			DrawOmniHiddenButton();
			GUILayout.Label("Join/Create a room to manage bans.", _labelStyle, Array.Empty<GUILayoutOption>());
			if (GUILayout.Button("Close", _buttonStyle, Array.Empty<GUILayoutOption>()))
			{
				_show = false;
				_userManuallyClosed = true;
				_pongPaused = true;
				StopCracktro();
			}
			GUI.DragWindow();
			Rect rect = GUILayoutUtility.GetRect(1f, 8f);
			((Rect)(ref rect)).height = 2f;
			((Rect)(ref rect)).x = 6f;
			((Rect)(ref rect)).width = ((Rect)(ref _win)).width - 12f;
			GUI.DrawTexture(rect, (Texture)(object)_texLineRed);
		}

		private void DrawWindow(int id)
		{
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			DrawOmniHiddenButton();
			bool isMasterClient = PhotonNetwork.IsMasterClient;
			if (!isMasterClient)
			{
				GUILayout.Label("<color=#FFEE99>You are not the host — only the host enforces bans.</color>", _thinLabelStyle, Array.Empty<GUILayoutOption>());
			}
			GUILayout.Space(4f);
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			if (GUILayout.Button("Bans", (_activeTab == Tab.Bans) ? _tabActiveStyle : _tabStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(120f) }))
			{
				_activeTab = Tab.Bans;
				_pongPaused = true;
				StopCracktro();
			}
			if (GUILayout.Button("Arcade (Pong)", (_activeTab == Tab.Arcade) ? _tabActiveStyle : _tabStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(170f) }))
			{
				_activeTab = Tab.Arcade;
				if (!_pongInit)
				{
					InitPong();
				}
				_pongPaused = false;
				StopCracktro();
			}
			GUILayout.FlexibleSpace();
			GUILayout.EndHorizontal();
			GUILayout.Space(6f);
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			if (GUILayout.Button("Close", _buttonStyle, Array.Empty<GUILayoutOption>()))
			{
				_show = false;
				_userManuallyClosed = true;
				_pongPaused = true;
				StopCracktro();
			}
			if (GUILayout.Button("Debug Dump (F7)", _buttonStyle, Array.Empty<GUILayoutOption>()))
			{
				RepoBanManager.DumpDebugInfo();
			}
			GUILayout.FlexibleSpace();
			GUI.enabled = isMasterClient;
			if (GUILayout.Button("Clear All Bans", _buttonStyle, Array.Empty<GUILayoutOption>()))
			{
				RepoBanManager.ClearAllLocalBans();
			}
			GUI.enabled = true;
			GUILayout.EndHorizontal();
			Rect rect = GUILayoutUtility.GetRect(1f, 10f);
			((Rect)(ref rect)).height = 2f;
			((Rect)(ref rect)).x = 6f;
			((Rect)(ref rect)).width = ((Rect)(ref _win)).width - 12f;
			GUI.DrawTexture(rect, (Texture)(object)_texLineRed);
			GUILayout.Space(4f);
			if (_activeTab == Tab.Arcade)
			{
				DrawPongTab();
			}
			else
			{
				DrawBanTab(isMasterClient);
			}
			GUI.DragWindow();
		}

		private void DrawOmniHiddenButton()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(((Rect)(ref _win)).width - 52f - 8f, 8f, 52f, 52f);
			if (GUI.Button(val, GUIContent.none, _hiddenBtnStyle))
			{
				if (_cracktroActive)
				{
					StopCracktro();
				}
				else
				{
					StartCracktro();
				}
			}
		}

		private void DrawBanTab(bool isMaster)
		{
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00db: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0313: Unknown result type (might be due to invalid IL or missing references)
			//IL_032b: 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_044e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0453: Unknown result type (might be due to invalid IL or missing references)
			//IL_0465: Unknown result type (might be due to invalid IL or missing references)
			//IL_046a: Unknown result type (might be due to invalid IL or missing references)
			//IL_048a: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a7: Unknown result type (might be due to invalid IL or missing references)
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			GUILayout.Label("<b>Players in Room (Steam)</b>", _labelHeaderStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(420f) });
			GUILayout.Label("<b>Banned (Steam)</b>", _labelHeaderStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(260f) });
			GUILayout.Label("<b>Steam Lobby Members</b>", _labelHeaderStyle, Array.Empty<GUILayoutOption>());
			GUILayout.EndHorizontal();
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(420f) });
			Rect rect = GUILayoutUtility.GetRect(0f, 0f);
			float x = ((Rect)(ref rect)).x;
			rect = GUILayoutUtility.GetRect(0f, 0f);
			DrawPanelShadow(x, ((Rect)(ref rect)).y, 420f, 360f, (Texture)(object)_shadowSmall);
			_scrollPlayers = GUILayout.BeginScrollView(_scrollPlayers, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(350f) });
			Player[] array = PhotonNetwork.PlayerList.OrderBy((Player p) => p.ActorNumber).ToArray();
			Player[] array2 = array;
			foreach (Player val in array2)
			{
				GUILayout.BeginVertical(_boxStyle, Array.Empty<GUILayoutOption>());
				string text = RepoBanManager.Instance.ResolveSteam64For(val) ?? "Unknown";
				ulong result;
				bool flag = ulong.TryParse(text, out result);
				bool flag2 = flag && RepoBanManager.IsSteamIdBanned(result);
				string arg = (flag2 ? "#FF3B3B" : (val.IsLocal ? "#77E3FF" : "#FFFFFF"));
				GUILayout.Label($"<color={arg}><b>#{val.ActorNumber} — {val.NickName}</b></color>", _labelStyle, Array.Empty<GUILayoutOption>());
				GUILayout.Label("  Steam64: '<b>" + text + "</b>'", _thinLabelStyle, Array.Empty<GUILayoutOption>());
				if (flag2)
				{
					GUILayout.Label("<color=#FF4D4D>  ⚠ BANNED</color>", _thinLabelStyle, Array.Empty<GUILayoutOption>());
				}
				GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
				GUILayout.FlexibleSpace();
				GUI.enabled = isMaster && !val.IsLocal && flag;
				if (GUILayout.Button("BAN (Steam)", _buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(120f) }))
				{
					RepoBanManager.BanBySteamId(result, val.NickName);
				}
				GUI.enabled = true;
				GUILayout.EndHorizontal();
				GUILayout.EndVertical();
				GUILayout.Space(3f);
			}
			GUILayout.EndScrollView();
			GUILayout.EndVertical();
			GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(260f) });
			rect = GUILayoutUtility.GetRect(0f, 0f);
			float x2 = ((Rect)(ref rect)).x;
			rect = GUILayoutUtility.GetRect(0f, 0f);
			DrawPanelShadow(x2, ((Rect)(ref rect)).y, 260f, 360f, (Texture)(object)_shadowSmall);
			_scrollBanned = GUILayout.BeginScrollView(_scrollBanned, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(350f) });
			List<string> list = RepoBanManager.LocalSteamKeysSnapshot();
			foreach (string item in list)
			{
				GUILayout.BeginVertical(_boxStyle, Array.Empty<GUILayoutOption>());
				string text2 = (item.Contains(":") ? item.Substring(item.IndexOf(':') + 1) : item);
				GUILayout.Label("<b>Steam64:</b> " + text2, _labelStyle, Array.Empty<GUILayoutOption>());
				GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
				GUILayout.FlexibleSpace();
				GUI.enabled = isMaster;
				if (GUILayout.Button("Remove", _buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(100f) }))
				{
					RepoBanManager.RemoveSteamKey(item);
				}
				GUI.enabled = true;
				GUILayout.EndHorizontal();
				GUILayout.EndVertical();
				GUILayout.Space(3f);
			}
			GUILayout.EndScrollView();
			GUILayout.EndVertical();
			GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
			rect = GUILayoutUtility.GetRect(0f, 0f);
			float x3 = ((Rect)(ref rect)).x;
			rect = GUILayoutUtility.GetRect(0f, 0f);
			DrawPanelShadow(x3, ((Rect)(ref rect)).y, 280f, 360f, (Texture)(object)_shadowSmall);
			_scrollSteam = GUILayout.BeginScrollView(_scrollSteam, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Height(350f) });
			Dictionary<ulong, string> source = RepoBanManager.SteamLobbySnapshot();
			foreach (KeyValuePair<ulong, string> item2 in source.OrderBy((KeyValuePair<ulong, string> k) => k.Value))
			{
				GUILayout.BeginVertical(_boxStyle, Array.Empty<GUILayoutOption>());
				GUILayout.Label($"{item2.Value}  <i>({item2.Key})</i>", _labelStyle, Array.Empty<GUILayoutOption>());
				GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
				GUILayout.FlexibleSpace();
				GUI.enabled = isMaster;
				if (GUILayout.Button("BAN (Steam)", _buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(120f) }))
				{
					RepoBanManager.BanBySteamId(item2.Key, item2.Value);
				}
				GUI.enabled = true;
				GUILayout.EndHorizontal();
				GUILayout.EndVertical();
				GUILayout.Space(3f);
			}
			GUILayout.EndScrollView();
			GUILayout.Space(6f);
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			GUILayout.Label("Manual Steam64:", _labelStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(130f) });
			_manualSteamBan = GUILayout.TextField(_manualSteamBan ?? "", _textFieldStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(200f) });
			GUI.enabled = isMaster;
			if (GUILayout.Button("Ban by Steam64", _buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(160f) }) && ulong.TryParse(_manualSteamBan, out var result2))
			{
				RepoBanManager.BanBySteamId(result2);
				_manualSteamBan = "";
			}
			GUI.enabled = true;
			GUILayout.EndHorizontal();
			GUILayout.EndVertical();
			GUILayout.EndHorizontal();
			GUILayout.Space(6f);
			GUILayout.Label(string.Format("<b>Status:</b> {0} local steam bans | Host: {1}", RepoBanManager.LocalSteamKeysSnapshot().Count, isMaster ? "YES" : "NO"), _thinLabelStyle, Array.Empty<GUILayoutOption>());
			GUILayout.Label("<i>Tip: If a player shows 'Unknown', wait a moment or use the Steam Lobby panel/manual Steam64 ban. F7 dumps debug.</i>", _thinLabelStyle, Array.Empty<GUILayoutOption>());
		}

		private void DrawPanelShadow(float x, float y, float w, float h, Texture shadow)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			float num = 8f;
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(x + num, y + num, w - num * 0.5f, h - num * 0.5f);
			GUI.DrawTexture(val, shadow, (ScaleMode)0, true);
		}

		private void InitPong()
		{
			_pongInit = true;
			_paddleLeftY = (_paddleRightY = 0.5f);
			_ballX = 0.5f;
			_ballY = 0.5f;
			float num = ((Random.value < 0.5f) ? (-1f) : 1f);
			_ballVX = 0.45f * num;
			_ballVY = (Random.value * 0.3f + 0.2f) * ((Random.value < 0.5f) ? (-1f) : 1f);
		}

		private float Reflect01(float t)
		{
			t = Mathf.Abs(t) % 2f;
			return (t > 1f) ? (2f - t) : t;
		}

		private void StepPong(float dt)
		{
			float num = 0f;
			float num2 = 0f;
			if (Input.GetKey((KeyCode)119))
			{
				num += 0.7f * dt;
			}
			if (Input.GetKey((KeyCode)115))
			{
				num -= 0.7f * dt;
			}
			float num3 = Mathf.Clamp01((float)_pongLeftScore / 6f);
			float num4 = Mathf.Lerp(0.385f, 0.945f, num3);
			float num5 = Mathf.Lerp(0.35f, 0.05f, num3);
			float num6 = Mathf.Lerp(0.4f, 0.95f, num3);
			float num7 = Mathf.Lerp(0.08f, 0.35f, num3);
			float num8 = Mathf.Lerp(0.1f, 0.01f, num3);
			float paddleRightY = _paddleRightY;
			if (_ballVX > 0f)
			{
				float num9 = 0.94f - _ballX;
				float num10 = Mathf.Max(0f, num9 / Mathf.Max(0.001f, _ballVX));
				float num11 = num10 + num5;
				float t = _ballY + _ballVY * num11;
				t = Reflect01(t);
				paddleRightY = Mathf.Lerp(_paddleRightY, t, num6);
			}
			else
			{
				paddleRightY = Mathf.Lerp(_paddleRightY, 0.5f, num7);
			}
			paddleRightY += (Random.value - 0.5f) * num8;
			float num12 = Mathf.Clamp(paddleRightY - _paddleRightY, (0f - num4) * dt, num4 * dt);
			num2 += num12;
			_paddleLeftY = Mathf.Clamp01(_paddleLeftY + num);
			_paddleRightY = Mathf.Clamp01(_paddleRightY + num2);
			_ballX += _ballVX * dt;
			_ballY += _ballVY * dt;
			if (_ballY < 0.012f)
			{
				_ballY = 0.012f;
				_ballVY = Mathf.Abs(_ballVY);
			}
			if (_ballY > 0.988f)
			{
				_ballY = 0.988f;
				_ballVY = 0f - Mathf.Abs(_ballVY);
			}
			float num13 = 0.06f;
			float num14 = 0.94f;
			if (_ballVX < 0f && _ballX - 0.012f <= num13 + 0.015f && _ballX >= num13 && Mathf.Abs(_ballY - _paddleLeftY) <= 0.10800001f)
			{
				_ballX = num13 + 0.015f + 0.012f;
				_ballVX = Mathf.Abs(_ballVX) * 1.03f;
				float num15 = (_ballY - _paddleLeftY) / 0.10800001f;
				_ballVY = Mathf.Clamp(_ballVY + num15 * 0.35f, -0.8f, 0.8f);
				PlayHitSfx();
			}
			if (_ballVX > 0f && _ballX + 0.012f >= num14 && _ballX <= num14 + 0.015f && Mathf.Abs(_ballY - _paddleRightY) <= 0.10800001f)
			{
				_ballX = num14 - 0.012f;
				_ballVX = (0f - Mathf.Abs(_ballVX)) * 1.03f;
				float num16 = (_ballY - _paddleRightY) / 0.10800001f;
				_ballVY = Mathf.Clamp(_ballVY + num16 * 0.35f, -0.8f, 0.8f);
				PlayHitSfx();
			}
			if (_ballX < 0f)
			{
				_pongRightScore++;
				InitPong();
			}
			else if (_ballX > 1f)
			{
				_pongLeftScore++;
				InitPong();
			}
		}

		private void DrawPongTab()
		{
			//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_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0337: Unknown result type (might be due to invalid IL or missing references)
			if (!_pongInit)
			{
				InitPong();
			}
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			if (GUILayout.Button(_pongPaused ? "Resume" : "Pause", _buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(110f) }))
			{
				_pongPaused = !_pongPaused;
			}
			if (GUILayout.Button("Reset Round", _buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(130f) }))
			{
				InitPong();
				_pongPaused = false;
			}
			if (GUILayout.Button("Reset Score", _buttonStyle, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(130f) }))
			{
				_pongLeftScore = (_pongRightScore = 0);
				InitPong();
				_pongPaused = false;
			}
			GUILayout.FlexibleSpace();
			GUILayout.Label($"Score  <b>{_pongLeftScore}</b> : <b>{_pongRightScore}</b>", _labelHeaderStyle, Array.Empty<GUILayoutOption>());
			GUILayout.EndHorizontal();
			GUILayout.Space(8f);
			Rect rect = GUILayoutUtility.GetRect(GUIContent.none, GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[2]
			{
				GUILayout.ExpandWidth(true),
				GUILayout.Height(360f)
			});
			GUI.DrawTexture(new Rect(((Rect)(ref rect)).x + 6f, ((Rect)(ref rect)).y + 6f, ((Rect)(ref rect)).width, ((Rect)(ref rect)).height), (Texture)(object)_shadowSmall, (ScaleMode)0, true);
			GUI.DrawTexture(rect, (Texture)(object)_texGlassPanel, (ScaleMode)0, true);
			DrawRectBorder(new Rect(((Rect)(ref rect)).x + 2f, ((Rect)(ref rect)).y + 2f, ((Rect)(ref rect)).width - 4f, ((Rect)(ref rect)).height - 4f), 1f, (Texture)(object)_texBorder);
			Rect val = default(Rect);
			((Rect)(ref val))..ctor(((Rect)(ref rect)).x + ((Rect)(ref rect)).width * 0.5f - 1f, ((Rect)(ref rect)).y + 4f, 2f, ((Rect)(ref rect)).height - 8f);
			GUI.DrawTexture(val, (Texture)(object)_texWhite);
			float x = ((Rect)(ref rect)).x;
			float y = ((Rect)(ref rect)).y;
			float width = ((Rect)(ref rect)).width;
			float height = ((Rect)(ref rect)).height;
			float num = 0.18f * height * 0.5f;
			float num2 = 0.015f * width;
			Rect val2 = default(Rect);
			((Rect)(ref val2))..ctor(x + width * 0.06f, y + _paddleLeftY * height - num, num2, num * 2f);
			Rect val3 = default(Rect);
			((Rect)(ref val3))..ctor(x + width * 0.94f, y + _paddleRightY * height - num, num2, num * 2f);
			GUI.DrawTexture(val2, (Texture)(object)_texWhite);
			GUI.DrawTexture(val3, (Texture)(object)_texWhite);
			float num3 = 0.012f * Mathf.Min(width, height);
			Rect val4 = default(Rect);
			((Rect)(ref val4))..ctor(x + _ballX * width - num3, y + _ballY * height - num3, num3 * 2f, num3 * 2f);
			GUI.DrawTexture(val4, (Texture)(object)_texWhite);
			GUILayout.Space(6f);
			GUILayout.Label("<i>Controls: Left = W/S, Right = Up/Down. Uses unscaled time; playable even when the game is paused.</i>", _thinLabelStyle, Array.Empty<GUILayoutOption>());
		}

		private void DrawCracktroOverlay(Rect winRect)
		{
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: 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_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Expected O, but got Unknown
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_019a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Expected O, but got Unknown
			//IL_0234: Unknown result type (might be due to invalid IL or missing references)
			//IL_023e: Expected O, but got Unknown
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_02db: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e5: Expected O, but got Unknown
			//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0302: Unknown result type (might be due to invalid IL or missing references)
			//IL_0324: 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_033b: Unknown result type (might be due to invalid IL or missing references)
			//IL_034d: 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_036a: Unknown result type (might be due to invalid IL or missing references)
			//IL_037b: Unknown result type (might be due to invalid IL or missing references)
			//IL_038b: Unknown result type (might be due to invalid IL or missing references)
			//IL_039c: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03af: 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_03ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0415: Unknown result type (might be due to invalid IL or missing references)
			//IL_0424: Unknown result type (might be due to invalid IL or missing references)
			//IL_044b: Unknown result type (might be due to invalid IL or missing references)
			//IL_045a: Unknown result type (might be due to invalid IL or missing references)
			//IL_046d: U