Decompiled source of KindredCommands v2.5.8

KindredCommands.dll

Decompiled a day ago
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using BepInEx.Unity.IL2CPP.Utils.Collections;
using HarmonyLib;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using Il2CppSystem.Reflection;
using KindredCommands.Commands.Converters;
using KindredCommands.Data;
using KindredCommands.Models;
using KindredCommands.Services;
using Microsoft.CodeAnalysis;
using NetTopologySuite.Geometries;
using NetTopologySuite.Index.Strtree;
using ProjectM;
using ProjectM.CastleBuilding;
using ProjectM.Gameplay.Clan;
using ProjectM.Gameplay.Scripting;
using ProjectM.Gameplay.Systems;
using ProjectM.Network;
using ProjectM.Physics;
using ProjectM.Scripting;
using ProjectM.Shared;
using ProjectM.Shared.Systems;
using ProjectM.Terrain;
using ProjectM.Tiles;
using Stunlock.Core;
using Stunlock.Localization;
using Stunlock.Network;
using Unity.Collections;
using Unity.Collections.LowLevel.Unsafe;
using Unity.Entities;
using Unity.Mathematics;
using Unity.Physics;
using Unity.Transforms;
using UnityEngine;
using VampireCommandFramework;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("odjit")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("Commands to expand Administration efforts and provide information")]
[assembly: AssemblyFileVersion("2.5.8.0")]
[assembly: AssemblyInformationalVersion("2.5.8+30905e0f01ebde50deeabaadd002615b4817c109")]
[assembly: AssemblyProduct("KindredCommands")]
[assembly: AssemblyTitle("KindredCommands")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.5.8.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 KindredCommands
{
	internal class Buffs
	{
		public delegate void BuffCreated(Entity buffEntity);

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

			private object <>2__current;

			public Entity targetEntity;

			public PrefabGUID buffPrefab;

			public Entity userEntity;

			public float duration;

			public BuffCreated callback;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0018: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0041: Unknown result type (might be due to invalid IL or missing references)
				//IL_0047: Unknown result type (might be due to invalid IL or missing references)
				//IL_004d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0052: Unknown result type (might be due to invalid IL or missing references)
				//IL_005f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0065: Unknown result type (might be due to invalid IL or missing references)
				//IL_006b: 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_0090: Unknown result type (might be due to invalid IL or missing references)
				//IL_0096: Unknown result type (might be due to invalid IL or missing references)
				//IL_009b: Unknown result type (might be due to invalid IL or missing references)
				//IL_00af: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					RemoveBuff(targetEntity, buffPrefab);
					break;
				case 1:
					<>1__state = -1;
					break;
				}
				if (BuffUtility.HasBuff<EntityManager>(Core.EntityManager, targetEntity, PrefabIdentifier.op_Implicit(buffPrefab)))
				{
					<>2__current = null;
					<>1__state = 1;
					return true;
				}
				AddBuff(userEntity, targetEntity, buffPrefab, duration);
				Entity buffEntity = default(Entity);
				if (callback != null && BuffUtility.TryGetBuff<EntityManager>(Core.Server.EntityManager, targetEntity, PrefabIdentifier.op_Implicit(buffPrefab), ref buffEntity))
				{
					callback(buffEntity);
				}
				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();
			}
		}

		public static bool AddBuff(Entity User, Entity Character, PrefabGUID buffPrefab, float duration = 0f, bool immortal = true)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: 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_0020: 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_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0038: 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_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: 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_007b: 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_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Unknown result type (might be due to invalid IL or missing references)
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: 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_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: 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_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			DebugEventsSystem existingSystemManaged = Core.Server.GetExistingSystemManaged<DebugEventsSystem>();
			ApplyBuffDebugEvent val = default(ApplyBuffDebugEvent);
			val.BuffPrefabGUID = buffPrefab;
			ApplyBuffDebugEvent val2 = val;
			FromCharacter val3 = default(FromCharacter);
			val3.User = User;
			val3.Character = Character;
			FromCharacter val4 = val3;
			Entity entity = default(Entity);
			if (!BuffUtility.TryGetBuff<EntityManager>(Core.Server.EntityManager, Character, PrefabIdentifier.op_Implicit(buffPrefab), ref entity))
			{
				existingSystemManaged.ApplyBuff(val4, val2);
				if (BuffUtility.TryGetBuff<EntityManager>(Core.Server.EntityManager, Character, PrefabIdentifier.op_Implicit(buffPrefab), ref entity))
				{
					if (entity.Has<CreateGameplayEventsOnSpawn>())
					{
						entity.Remove<CreateGameplayEventsOnSpawn>();
					}
					if (entity.Has<GameplayEventListeners>())
					{
						entity.Remove<GameplayEventListeners>();
					}
					if (immortal)
					{
						entity.Add<Buff_Persists_Through_Death>();
						if (entity.Has<RemoveBuffOnGameplayEvent>())
						{
							entity.Remove<RemoveBuffOnGameplayEvent>();
						}
						if (entity.Has<RemoveBuffOnGameplayEventEntry>())
						{
							entity.Remove<RemoveBuffOnGameplayEventEntry>();
						}
					}
					if (duration > -1f && duration != 0f)
					{
						if (!entity.Has<LifeTime>())
						{
							entity.Add<LifeTime>();
							entity.Write<LifeTime>(new LifeTime
							{
								EndAction = (LifeTimeEndAction)2
							});
						}
						LifeTime componentData = entity.Read<LifeTime>();
						componentData.Duration = duration;
						entity.Write<LifeTime>(componentData);
					}
					else if (duration == -1f)
					{
						if (entity.Has<LifeTime>())
						{
							LifeTime componentData2 = entity.Read<LifeTime>();
							componentData2.EndAction = (LifeTimeEndAction)0;
							entity.Write<LifeTime>(componentData2);
						}
						if (entity.Has<RemoveBuffOnGameplayEvent>())
						{
							entity.Remove<RemoveBuffOnGameplayEvent>();
						}
						if (entity.Has<RemoveBuffOnGameplayEventEntry>())
						{
							entity.Remove<RemoveBuffOnGameplayEventEntry>();
						}
					}
					return true;
				}
				return false;
			}
			return false;
		}

		public static void RemoveBuff(Entity Character, PrefabGUID buffPrefab)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: 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)
			Entity val = default(Entity);
			if (BuffUtility.TryGetBuff<EntityManager>(Core.EntityManager, Character, PrefabIdentifier.op_Implicit(buffPrefab), ref val))
			{
				DestroyUtility.Destroy(Core.EntityManager, val, (DestroyDebugReason)13, (string)null, 0);
			}
		}

		public static void RemoveAndAddBuff(Entity userEntity, Entity targetEntity, PrefabGUID buffPrefab, float duration = -1f, BuffCreated callback = null)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: 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_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: 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_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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)
			if (!BuffUtility.HasBuff<EntityManager>(Core.EntityManager, targetEntity, PrefabIdentifier.op_Implicit(buffPrefab)))
			{
				AddBuff(userEntity, targetEntity, buffPrefab, duration);
				Entity buffEntity = default(Entity);
				if (callback != null && BuffUtility.TryGetBuff<EntityManager>(Core.Server.EntityManager, targetEntity, PrefabIdentifier.op_Implicit(buffPrefab), ref buffEntity))
				{
					callback(buffEntity);
				}
			}
			else
			{
				Core.StartCoroutine(RemoveAndAddBuffCoroutine(userEntity, targetEntity, buffPrefab, duration, callback));
			}
		}

		[IteratorStateMachine(typeof(<RemoveAndAddBuffCoroutine>d__4))]
		private static IEnumerator RemoveAndAddBuffCoroutine(Entity userEntity, Entity targetEntity, PrefabGUID buffPrefab, float duration, BuffCreated callback)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <RemoveAndAddBuffCoroutine>d__4(0)
			{
				userEntity = userEntity,
				targetEntity = targetEntity,
				buffPrefab = buffPrefab,
				duration = duration,
				callback = callback
			};
		}

		public static void AddGlow(Entity userEntity, Entity targetEntity, PrefabGUID glowPrefab)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			RemoveAndAddBuff(userEntity, targetEntity, glowPrefab, -1f, delegate(Entity glowBuffEntity)
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				//IL_0024: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0014: Unknown result type (might be due to invalid IL or missing references)
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				//IL_001e: 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_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0040: Unknown result type (might be due to invalid IL or missing references)
				//IL_003a: Unknown result type (might be due to invalid IL or missing references)
				//IL_004e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0048: Unknown result type (might be due to invalid IL or missing references)
				//IL_005c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0056: 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_0064: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				//IL_0086: Unknown result type (might be due to invalid IL or missing references)
				//IL_0080: 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_008e: 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_009c: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
				//IL_00be: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00da: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e8: 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_00f6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
				//IL_0104: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
				//IL_0123: Unknown result type (might be due to invalid IL or missing references)
				//IL_010c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0111: Unknown result type (might be due to invalid IL or missing references)
				//IL_0114: Unknown result type (might be due to invalid IL or missing references)
				//IL_0116: Unknown result type (might be due to invalid IL or missing references)
				//IL_011b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0131: Unknown result type (might be due to invalid IL or missing references)
				//IL_012b: Unknown result type (might be due to invalid IL or missing references)
				//IL_013f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0139: Unknown result type (might be due to invalid IL or missing references)
				//IL_014d: 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_015b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0155: Unknown result type (might be due to invalid IL or missing references)
				//IL_0169: Unknown result type (might be due to invalid IL or missing references)
				//IL_0163: Unknown result type (might be due to invalid IL or missing references)
				//IL_0177: 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_0185: Unknown result type (might be due to invalid IL or missing references)
				//IL_017f: 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_018d: 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_019b: Unknown result type (might be due to invalid IL or missing references)
				//IL_01af: Unknown result type (might be due to invalid IL or missing references)
				//IL_01a9: 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_01b7: Unknown result type (might be due to invalid IL or missing references)
				if (glowBuffEntity.Has<EntityOwner>())
				{
					glowBuffEntity.Write<EntityOwner>(new EntityOwner
					{
						Owner = targetEntity
					});
				}
				if (glowBuffEntity.Has<CreateGameplayEventsOnSpawn>())
				{
					glowBuffEntity.Remove<CreateGameplayEventsOnSpawn>();
				}
				if (glowBuffEntity.Has<GameplayEventListeners>())
				{
					glowBuffEntity.Remove<GameplayEventListeners>();
				}
				if (glowBuffEntity.Has<RemoveBuffOnGameplayEvent>())
				{
					glowBuffEntity.Remove<RemoveBuffOnGameplayEvent>();
				}
				if (glowBuffEntity.Has<RemoveBuffOnGameplayEventEntry>())
				{
					glowBuffEntity.Remove<RemoveBuffOnGameplayEventEntry>();
				}
				if (glowBuffEntity.Has<DealDamageOnGameplayEvent>())
				{
					glowBuffEntity.Remove<DealDamageOnGameplayEvent>();
				}
				if (glowBuffEntity.Has<ModifyMovementSpeedBuff>())
				{
					glowBuffEntity.Remove<ModifyMovementSpeedBuff>();
				}
				if (glowBuffEntity.Has<HealOnGameplayEvent>())
				{
					glowBuffEntity.Remove<HealOnGameplayEvent>();
				}
				if (glowBuffEntity.Has<DestroyOnGameplayEvent>())
				{
					glowBuffEntity.Remove<DestroyOnGameplayEvent>();
				}
				if (glowBuffEntity.Has<WeakenBuff>())
				{
					glowBuffEntity.Remove<WeakenBuff>();
				}
				if (glowBuffEntity.Has<ReplaceAbilityOnSlotBuff>())
				{
					glowBuffEntity.Remove<ReplaceAbilityOnSlotBuff>();
				}
				if (glowBuffEntity.Has<AmplifyBuff>())
				{
					glowBuffEntity.Remove<AmplifyBuff>();
				}
				if (glowBuffEntity.Has<EmpowerBuff>())
				{
					glowBuffEntity.Remove<EmpowerBuff>();
				}
				if (glowBuffEntity.Has<BuffResistances>())
				{
					glowBuffEntity.Remove<BuffResistances>();
				}
				if (glowBuffEntity.Has<BuffResistanceElement>())
				{
					glowBuffEntity.Remove<BuffResistanceElement>();
				}
				if (glowBuffEntity.Has<AbsorbBuff>())
				{
					glowBuffEntity.Remove<AbsorbBuff>();
				}
				if (glowBuffEntity.Has<FortifyBuff>())
				{
					glowBuffEntity.Remove<FortifyBuff>();
				}
				if (glowBuffEntity.Has<ModifyUnitStatBuff_DOTS>())
				{
					EntityManager entityManager = Core.EntityManager;
					((EntityManager)(ref entityManager)).GetBuffer<ModifyUnitStatBuff_DOTS>(glowBuffEntity, false).Clear();
				}
				if (glowBuffEntity.Has<BuffModificationFlagData>())
				{
					glowBuffEntity.Remove<BuffModificationFlagData>();
				}
				if (glowBuffEntity.Has<SpellModArithmetic>())
				{
					glowBuffEntity.Remove<SpellModArithmetic>();
				}
				if (glowBuffEntity.Has<MoveTowardsPositionBuff>())
				{
					glowBuffEntity.Remove<MoveTowardsPositionBuff>();
				}
				if (glowBuffEntity.Has<Dash>())
				{
					glowBuffEntity.Remove<Dash>();
				}
				if (glowBuffEntity.Has<DashSpawn>())
				{
					glowBuffEntity.Remove<DashSpawn>();
				}
				if (glowBuffEntity.Has<TravelToTarget>())
				{
					glowBuffEntity.Remove<TravelToTarget>();
				}
				if (glowBuffEntity.Has<TravelBuff>())
				{
					glowBuffEntity.Remove<TravelBuff>();
				}
				if (glowBuffEntity.Has<TravelBuffSpawn>())
				{
					glowBuffEntity.Remove<TravelBuffSpawn>();
				}
				if (glowBuffEntity.Has<CreateGameplayEventsOnTick>())
				{
					glowBuffEntity.Remove<CreateGameplayEventsOnTick>();
				}
				if (glowBuffEntity.Has<ScriptSpawn>())
				{
					glowBuffEntity.Remove<ScriptSpawn>();
				}
				if (glowBuffEntity.Has<ScriptDestroy>())
				{
					glowBuffEntity.Remove<ScriptDestroy>();
				}
				glowBuffEntity.Add<HideOutsideVision>();
			});
		}
	}
	internal static class Core
	{
		private static MonoBehaviour monoBehaviour;

		public const int MAX_REPLY_LENGTH = 509;

		private static bool _hasInitialized = false;

		public static World Server { get; } = GetWorld("Server") ?? throw new Exception("There is no Server world (yet). Did you install a server mod on the client?");


		public static EntityManager EntityManager { get; } = Server.EntityManager;


		public static GameDataSystem GameDataSystem { get; } = Server.GetExistingSystemManaged<GameDataSystem>();


		public static GenerateCastleSystem GenerateCastle { get; private set; }

		public static PrefabCollectionSystem PrefabCollectionSystem { get; internal set; }

		public static PrefabCollectionSystem PrefabCollection { get; } = Server.GetExistingSystemManaged<PrefabCollectionSystem>();


		public static RelicDestroySystem RelicDestroySystem { get; internal set; }

		public static ServerScriptMapper ServerScriptMapper { get; internal set; }

		public static double ServerTime => ServerGameManager.ServerTime;

		public static ServerGameManager ServerGameManager => ServerScriptMapper.GetServerGameManager();

		public static ServerGameSettingsSystem ServerGameSettingsSystem { get; internal set; }

		public static ManualLogSource Log { get; } = Plugin.PluginLog;


		public static AnnouncementsService AnnouncementsService { get; internal set; }

		public static AuditService AuditService { get; } = new AuditService();


		public static AutoChainInstanceService AutoChainInstanceService { get; internal set; }

		public static BloodBoundService BloodBoundService { get; private set; }

		public static BoostedPlayerService BoostedPlayerService { get; internal set; }

		public static BossService Boss { get; internal set; }

		public static CastleTerritoryService CastleTerritory { get; private set; }

		public static ConfigSettingsService ConfigSettings { get; internal set; }

		public static DropItemService DropItem { get; internal set; }

		public static GearService GearService { get; internal set; }

		public static GlobalMiscService GlobalMisc { get; internal set; }

		public static LocalizationService Localization { get; } = new LocalizationService();


		public static PlayerService Players { get; internal set; }

		public static PrefabService Prefabs { get; internal set; }

		public static PrisonerService Prisoners { get; internal set; }

		public static RegionService Regions { get; internal set; }

		public static ServantSenderService ServantSender { get; internal set; }

		public static SoulshardService SoulshardService { get; internal set; }

		public static TerritoryLocationService TerritoryLocation { get; internal set; }

		public static TrackPlayerEquipmentService TrackPlayerEquipment { get; internal set; }

		public static UnitSpawnerService UnitSpawner { get; internal set; }

		public static void LogException(Exception e, [CallerMemberName] string caller = null)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Expected O, but got Unknown
			ManualLogSource log = Log;
			bool flag = default(bool);
			BepInExErrorLogInterpolatedStringHandler val = new BepInExErrorLogInterpolatedStringHandler(51, 5, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Failure in ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(caller);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nMessage: ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.Message);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" Inner:");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.InnerException?.Message);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\n\nStack: ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.StackTrace);
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("\nInner Stack: ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(e.InnerException?.StackTrace);
			}
			log.LogError(val);
		}

		internal static void InitializeAfterLoaded()
		{
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Expected O, but got Unknown
			if (!_hasInitialized)
			{
				GenerateCastle = Server.GetOrCreateSystemManaged<GenerateCastleSystem>();
				PrefabCollectionSystem = Server.GetExistingSystemManaged<PrefabCollectionSystem>();
				RelicDestroySystem = Server.GetExistingSystemManaged<RelicDestroySystem>();
				ServerGameSettingsSystem = Server.GetExistingSystemManaged<ServerGameSettingsSystem>();
				ServerScriptMapper = Server.GetExistingSystemManaged<ServerScriptMapper>();
				Prefabs = new PrefabService();
				ConfigSettings = new ConfigSettingsService();
				BoostedPlayerService = new BoostedPlayerService();
				Players = new PlayerService();
				AnnouncementsService = new AnnouncementsService();
				try
				{
					AutoChainInstanceService = new AutoChainInstanceService();
				}
				catch (FileNotFoundException)
				{
					AutoChainInstanceService = null;
					Log.LogError((object)"Missing NetTopologySuite.dll from plugins so will not be able to fully force all respawns");
				}
				BloodBoundService = new BloodBoundService();
				Boss = new BossService();
				CastleTerritory = new CastleTerritoryService();
				DropItem = new DropItemService();
				GearService = new GearService();
				GlobalMisc = new GlobalMiscService();
				Prisoners = new PrisonerService();
				Regions = new RegionService();
				ServantSender = new ServantSenderService();
				SoulshardService = new SoulshardService();
				TerritoryLocation = new TerritoryLocationService();
				TrackPlayerEquipment = new TrackPlayerEquipmentService();
				UnitSpawner = new UnitSpawnerService();
				Character.Populate();
				_hasInitialized = true;
				ManualLogSource log = Log;
				bool flag = default(bool);
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(10, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("InitializeAfterLoaded");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" completed");
				}
				log.LogInfo(val);
			}
		}

		private static World GetWorld(string name)
		{
			Enumerator<World> enumerator = World.s_AllWorlds.GetEnumerator();
			while (enumerator.MoveNext())
			{
				World current = enumerator.Current;
				if (current.Name == name)
				{
					return current;
				}
			}
			return null;
		}

		public static Coroutine StartCoroutine(IEnumerator routine)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Expected O, but got Unknown
			if ((Object)(object)monoBehaviour == (Object)null)
			{
				GameObject val = new GameObject("KindredCommands");
				monoBehaviour = (MonoBehaviour)(object)val.AddComponent<IgnorePhysicsDebugSystem>();
				Object.DontDestroyOnLoad((Object)val);
			}
			return monoBehaviour.StartCoroutine(CollectionExtensions.WrapToIl2Cpp(routine));
		}

		public static void StopCoroutine(Coroutine coroutine)
		{
			if (!((Object)(object)monoBehaviour == (Object)null))
			{
				monoBehaviour.StopCoroutine(coroutine);
			}
		}
	}
	public static class ECSExtensions
	{
		public delegate void ActionRef<T>(ref T item);

		public unsafe static void Write<T>(this Entity entity, T componentData) where T : struct
		{
			//IL_0030: 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_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			ComponentType val = default(ComponentType);
			((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
			byte[] array = StructureToByteArray(componentData);
			int num = Marshal.SizeOf<T>();
			fixed (byte* ptr = array)
			{
				EntityManager entityManager = Core.EntityManager;
				((EntityManager)(ref entityManager)).SetComponentDataRaw(entity, val.TypeIndex, (void*)ptr, num);
			}
		}

		public static void With<T>(this Entity entity, ActionRef<T> action) where T : struct
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			T item = entity.ReadRW<T>();
			action(ref item);
			EntityManager entityManager = Core.EntityManager;
			((EntityManager)(ref entityManager)).SetComponentData<T>(entity, item);
		}

		public unsafe static T ReadRW<T>(this Entity entity) where T : struct
		{
			//IL_000d: 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_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			ComponentType val = default(ComponentType);
			((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
			EntityManager entityManager = Core.EntityManager;
			return Marshal.PtrToStructure<T>(new IntPtr(((EntityManager)(ref entityManager)).GetComponentDataRawRW(entity, val.TypeIndex)));
		}

		public static byte[] StructureToByteArray<T>(T structure) where T : struct
		{
			int num = Marshal.SizeOf(structure);
			byte[] array = new byte[num];
			IntPtr intPtr = Marshal.AllocHGlobal(num);
			Marshal.StructureToPtr(structure, intPtr, fDeleteOld: true);
			Marshal.Copy(intPtr, array, 0, num);
			Marshal.FreeHGlobal(intPtr);
			return array;
		}

		public unsafe static T Read<T>(this Entity entity) where T : struct
		{
			//IL_000d: 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_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			ComponentType val = default(ComponentType);
			((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
			EntityManager entityManager = Core.EntityManager;
			return Marshal.PtrToStructure<T>(new IntPtr(((EntityManager)(ref entityManager)).GetComponentDataRawRO(entity, val.TypeIndex)));
		}

		public static DynamicBuffer<T> ReadBuffer<T>(this Entity entity) where T : struct
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = Core.Server.EntityManager;
			return ((EntityManager)(ref entityManager)).GetBuffer<T>(entity, false);
		}

		public static bool Has<T>(this Entity entity)
		{
			//IL_000d: 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_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			ComponentType val = default(ComponentType);
			((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
			EntityManager entityManager = Core.EntityManager;
			return ((EntityManager)(ref entityManager)).HasComponent(entity, val);
		}

		public static string LookupName(this PrefabGUID prefabGuid)
		{
			//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_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			PrefabCollectionSystem existingSystemManaged = Core.Server.GetExistingSystemManaged<PrefabCollectionSystem>();
			NativeParallelHashMap<PrefabGUID, Entity> guidToEntityMap = existingSystemManaged._PrefabLookupMap.GuidToEntityMap;
			if (!guidToEntityMap.ContainsKey(prefabGuid))
			{
				return "GUID Not Found";
			}
			PrefabLookupMap prefabLookupMap = existingSystemManaged._PrefabLookupMap;
			return ((PrefabLookupMap)(ref prefabLookupMap)).GetName(prefabGuid) + " PrefabGuid(" + ((PrefabGUID)(ref prefabGuid)).GuidHash + ")";
		}

		public static string PrefabName(this PrefabGUID prefabGuid)
		{
			//IL_0005: 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)
			string prefabName = Core.Localization.GetPrefabName(prefabGuid);
			if (!string.IsNullOrEmpty(prefabName))
			{
				return prefabName;
			}
			return prefabGuid.LookupName();
		}

		public static string EntityName(this Entity entity)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			string text = string.Empty;
			if (entity.Has<NameableInteractable>())
			{
				NameableInteractable val = entity.Read<NameableInteractable>();
				text = ((object)(FixedString64Bytes)(ref val.Name)).ToString();
			}
			if (string.IsNullOrEmpty(text) && entity.Has<PrefabGUID>())
			{
				text = entity.Read<PrefabGUID>().PrefabName();
			}
			if (string.IsNullOrEmpty(text))
			{
				text = ((object)(Entity)(ref entity)).ToString();
			}
			return text;
		}

		public static void Add<T>(this Entity entity)
		{
			//IL_000d: 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_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			ComponentType val = default(ComponentType);
			((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
			EntityManager entityManager = Core.EntityManager;
			((EntityManager)(ref entityManager)).AddComponent(entity, val);
		}

		public static void Remove<T>(this Entity entity)
		{
			//IL_000d: 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_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			ComponentType val = default(ComponentType);
			((ComponentType)(ref val))..ctor(Il2CppType.Of<T>(), (AccessMode)0);
			EntityManager entityManager = Core.EntityManager;
			((EntityManager)(ref entityManager)).RemoveComponent(entity, val);
		}
	}
	internal static class Helper
	{
		[CompilerGenerated]
		private sealed class <GetAllEntitiesInRadius>d__8<T> : IEnumerable<Entity>, IEnumerable, IEnumerator<Entity>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private Entity <>2__current;

			private int <>l__initialThreadId;

			private float2 center;

			public float2 <>3__center;

			private float radius;

			public float <>3__radius;

			private NativeList<Entity> <entities>5__2;

			private Enumerator<Entity> <>7__wrap2;

			Entity IEnumerator<Entity>.Current
			{
				[DebuggerHidden]
				get
				{
					//IL_0001: Unknown result type (might be due to invalid IL or missing references)
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					//IL_0001: Unknown result type (might be due to invalid IL or missing references)
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <GetAllEntitiesInRadius>d__8(int <>1__state)
			{
				this.<>1__state = <>1__state;
				<>l__initialThreadId = Environment.CurrentManagedThreadId;
			}

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

			private bool MoveNext()
			{
				//IL_001f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0024: Unknown result type (might be due to invalid IL or missing references)
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_0033: Unknown result type (might be due to invalid IL or missing references)
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_003f: Unknown result type (might be due to invalid IL or missing references)
				//IL_004a: Unknown result type (might be due to invalid IL or missing references)
				//IL_004f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_0056: Unknown result type (might be due to invalid IL or missing references)
				//IL_0061: Unknown result type (might be due to invalid IL or missing references)
				//IL_0066: Unknown result type (might be due to invalid IL or missing references)
				//IL_006b: 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_007a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0085: Unknown result type (might be due to invalid IL or missing references)
				//IL_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00da: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ee: 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_00fb: 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_0115: Unknown result type (might be due to invalid IL or missing references)
				//IL_0117: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
				{
					<>1__state = -1;
					TileModelSpatialLookupSystemData tileModelLookupSystemData = Core.GenerateCastle._TileModelLookupSystemData;
					TileModelSpatialLookupRO spatialLookupReadOnlyAndComplete = ((TileModelSpatialLookupSystemData)(ref tileModelLookupSystemData)).GetSpatialLookupReadOnlyAndComplete((SystemBase)(object)Core.GenerateCastle);
					ConvertPosToTileGrid(center);
					float2 val = ConvertPosToTileGrid(center - radius);
					float2 val2 = ConvertPosToTileGrid(center + radius);
					BoundsMinMax val3 = default(BoundsMinMax);
					((BoundsMinMax)(ref val3))..ctor(Mathf.FloorToInt(val.x), Mathf.FloorToInt(val.y), Mathf.CeilToInt(val2.x), Mathf.CeilToInt(val2.y));
					<entities>5__2 = ((TileModelSpatialLookupRO)(ref spatialLookupReadOnlyAndComplete)).GetEntities(ref val3, (TileType)255, 16, 16);
					<>7__wrap2 = <entities>5__2.GetEnumerator();
					break;
				}
				case 1:
					<>1__state = -1;
					break;
				}
				while (<>7__wrap2.MoveNext())
				{
					Entity current = <>7__wrap2.Current;
					if (current.Has<T>() && current.Has<Translation>())
					{
						float3 value = current.Read<Translation>().Value;
						if (math.distance(center, ((float3)(ref value)).xz) <= radius)
						{
							<>2__current = current;
							<>1__state = 1;
							return true;
						}
					}
				}
				<entities>5__2.Dispose();
				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();
			}

			[DebuggerHidden]
			IEnumerator<Entity> IEnumerable<Entity>.GetEnumerator()
			{
				//IL_002b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0030: Unknown result type (might be due to invalid IL or missing references)
				<GetAllEntitiesInRadius>d__8<T> <GetAllEntitiesInRadius>d__;
				if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
				{
					<>1__state = 0;
					<GetAllEntitiesInRadius>d__ = this;
				}
				else
				{
					<GetAllEntitiesInRadius>d__ = new <GetAllEntitiesInRadius>d__8<T>(0);
				}
				<GetAllEntitiesInRadius>d__.center = <>3__center;
				<GetAllEntitiesInRadius>d__.radius = <>3__radius;
				return <GetAllEntitiesInRadius>d__;
			}

			[DebuggerHidden]
			IEnumerator IEnumerable.GetEnumerator()
			{
				return ((IEnumerable<Entity>)this).GetEnumerator();
			}
		}

		public static AdminAuthSystem adminAuthSystem = Core.Server.GetExistingSystemManaged<AdminAuthSystem>();

		public static ClanSystem_Server clanSystem = Core.Server.GetExistingSystemManaged<ClanSystem_Server>();

		public static EntityCommandBufferSystem entityCommandBufferSystem = Core.Server.GetExistingSystemManaged<EntityCommandBufferSystem>();

		public static PrefabGUID GetPrefabGUID(Entity entity)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = Core.EntityManager;
			PrefabGUID componentData = default(PrefabGUID);
			try
			{
				componentData = ((EntityManager)(ref entityManager)).GetComponentData<PrefabGUID>(entity);
				return componentData;
			}
			catch
			{
				((PrefabGUID)(ref componentData))..ctor(0);
			}
			return componentData;
		}

		public static bool TryGetClanEntityFromPlayer(Entity User, out Entity ClanEntity)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: 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_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: 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_0044: Unknown result type (might be due to invalid IL or missing references)
			if (User.Read<TeamReference>().Value._Value.ReadBuffer<TeamAllies>().Length > 0)
			{
				ClanEntity = User.Read<TeamReference>().Value._Value.ReadBuffer<TeamAllies>()[0].Value;
				return true;
			}
			ClanEntity = default(Entity);
			return false;
		}

		public static Entity AddItemToInventory(Entity recipient, PrefabGUID guid, int amount)
		{
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0015: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				ServerGameManager serverGameManager = Core.Server.GetExistingSystemManaged<ServerScriptMapper>()._ServerGameManager;
				return ((ServerGameManager)(ref serverGameManager)).TryAddInventoryItem(recipient, guid, amount).NewEntity;
			}
			catch (Exception e)
			{
				Core.LogException(e, "AddItemToInventory");
			}
			return default(Entity);
		}

		public static NativeArray<Entity> GetEntitiesByComponentType<T1>(bool includeAll = false, bool includeDisabled = false, bool includeSpawn = false, bool includePrefab = false, bool includeDestroyed = false)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: 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_0010: 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_0017: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: 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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			EntityQueryOptions val = (EntityQueryOptions)0;
			if (includeAll)
			{
				val = (EntityQueryOptions)(val | 0xC3);
			}
			if (includeDisabled)
			{
				val = (EntityQueryOptions)(val | 2);
			}
			if (includeSpawn)
			{
				val = (EntityQueryOptions)(val | 0x40);
			}
			if (includePrefab)
			{
				val = (EntityQueryOptions)(val | 1);
			}
			if (includeDestroyed)
			{
				val = (EntityQueryOptions)(val | 0x80);
			}
			EntityQueryBuilder val2 = new EntityQueryBuilder(AllocatorHandle.op_Implicit((Allocator)2));
			val2 = ((EntityQueryBuilder)(ref val2)).AddAll(new ComponentType(Il2CppType.Of<T1>(), (AccessMode)0));
			EntityQueryBuilder val3 = ((EntityQueryBuilder)(ref val2)).WithOptions(val);
			EntityManager entityManager = Core.EntityManager;
			EntityQuery val4 = ((EntityManager)(ref entityManager)).CreateEntityQuery(ref val3);
			return ((EntityQuery)(ref val4)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
		}

		public static NativeArray<Entity> GetEntitiesByComponentTypes<T1, T2>(bool includeAll = false, bool includeDisabled = false, bool includeSpawn = false, bool includePrefab = false, bool includeDestroyed = false)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: 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_0010: 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_0017: 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_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: 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_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: 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_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//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_0075: 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_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			EntityQueryOptions val = (EntityQueryOptions)0;
			if (includeAll)
			{
				val = (EntityQueryOptions)(val | 0xC3);
			}
			if (includeDisabled)
			{
				val = (EntityQueryOptions)(val | 2);
			}
			if (includeSpawn)
			{
				val = (EntityQueryOptions)(val | 0x40);
			}
			if (includePrefab)
			{
				val = (EntityQueryOptions)(val | 1);
			}
			if (includeDestroyed)
			{
				val = (EntityQueryOptions)(val | 0x80);
			}
			EntityQueryBuilder val2 = new EntityQueryBuilder(AllocatorHandle.op_Implicit((Allocator)2));
			val2 = ((EntityQueryBuilder)(ref val2)).AddAll(new ComponentType(Il2CppType.Of<T1>(), (AccessMode)0));
			val2 = ((EntityQueryBuilder)(ref val2)).AddAll(new ComponentType(Il2CppType.Of<T2>(), (AccessMode)0));
			EntityQueryBuilder val3 = ((EntityQueryBuilder)(ref val2)).WithOptions(val);
			EntityManager entityManager = Core.EntityManager;
			EntityQuery val4 = ((EntityManager)(ref entityManager)).CreateEntityQuery(ref val3);
			return ((EntityQuery)(ref val4)).ToEntityArray(AllocatorHandle.op_Implicit((Allocator)2));
		}

		[IteratorStateMachine(typeof(<GetAllEntitiesInRadius>d__8<>))]
		public static IEnumerable<Entity> GetAllEntitiesInRadius<T>(float2 center, float radius)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <GetAllEntitiesInRadius>d__8<T>(-2)
			{
				<>3__center = center,
				<>3__radius = radius
			};
		}

		public static Entity FindClosestTilePosition(Vector3 pos, bool ignoreFloors = false)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: 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_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_011e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: 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_00e8: 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_0104: Unknown result type (might be due to invalid IL or missing references)
			TileModelSpatialLookupSystemData tileModelLookupSystemData = Core.GenerateCastle._TileModelLookupSystemData;
			TileModelSpatialLookupRO spatialLookupReadOnlyAndComplete = ((TileModelSpatialLookupSystemData)(ref tileModelLookupSystemData)).GetSpatialLookupReadOnlyAndComplete((SystemBase)(object)Core.GenerateCastle);
			float3 val = ConvertPosToTileGrid(float3.op_Implicit(pos));
			BoundsMinMax val2 = default(BoundsMinMax);
			((BoundsMinMax)(ref val2))..ctor((int)((double)val.x - 2.5), (int)((double)val.z - 2.5), (int)((double)val.x + 2.5), (int)((double)val.z + 2.5));
			Entity result = Entity.Null;
			float num = float.MaxValue;
			NativeList<Entity> entities = ((TileModelSpatialLookupRO)(ref spatialLookupReadOnlyAndComplete)).GetEntities(ref val2, (TileType)255, 16, 16);
			for (int i = 0; i < entities.Length; i++)
			{
				Entity val3 = entities[i];
				if (val3.Has<TilePosition>() && val3.Has<Translation>() && (!ignoreFloors || !val3.Has<CastleFloor>()))
				{
					float3 value = val3.Read<Translation>().Value;
					float num2 = math.distancesq(float3.op_Implicit(pos), value);
					if (num2 < num && GetPrefabGUID(val3).LookupName().StartsWith("TM_"))
					{
						num = num2;
						result = val3;
					}
				}
			}
			entities.Dispose();
			return result;
		}

		public static float2 ConvertPosToTileGrid(float2 pos)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			return new float2((float)(Mathf.FloorToInt(pos.x * 2f) + 6400), (float)(Mathf.FloorToInt(pos.y * 2f) + 6400));
		}

		public static float3 ConvertPosToTileGrid(float3 pos)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			return new float3((float)(Mathf.FloorToInt(pos.x * 2f) + 6400), pos.y, (float)(Mathf.FloorToInt(pos.z * 2f) + 6400));
		}

		public static void RepairGear(Entity Character, bool repair = true)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: 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_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: 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_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: 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_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			Equipment val = Character.Read<Equipment>();
			NativeList<Entity> val2 = default(NativeList<Entity>);
			val2..ctor(AllocatorHandle.op_Implicit((Allocator)2));
			((Equipment)(ref val)).GetAllEquipmentEntities(val2, false);
			Enumerator<Entity> enumerator = val2.GetEnumerator();
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				if (current.Has<Durability>())
				{
					Durability val3 = current.Read<Durability>();
					if (repair)
					{
						val3.Value = val3.MaxDurability;
					}
					else
					{
						val3.Value = 0f;
					}
					current.Write<Durability>(val3);
				}
			}
			val2.Dispose();
			InventoryBuffer val4 = default(InventoryBuffer);
			for (int i = 0; i < 36; i++)
			{
				if (!InventoryUtilities.TryGetItemAtSlot<EntityManager>(Core.EntityManager, Character, i, ref val4))
				{
					continue;
				}
				Entity entity = val4.ItemEntity._Entity;
				if (entity.Has<Durability>())
				{
					Durability val5 = entity.Read<Durability>();
					if (repair)
					{
						val5.Value = val5.MaxDurability;
					}
					else
					{
						val5.Value = 0f;
					}
					entity.Write<Durability>(val5);
				}
			}
		}

		public static void ReviveCharacter(Entity Character, Entity User, ChatCommandContext ctx = null)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: 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_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_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: 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_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: 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_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			Health val = Character.Read<Health>();
			if (ctx != null)
			{
				ctx.Reply("TryGetbuff");
			}
			Entity val2 = default(Entity);
			if (BuffUtility.TryGetBuff<EntityManager>(Core.EntityManager, Character, PrefabIdentifier.op_Implicit(Prefabs.Buff_General_Vampire_Wounded_Buff), ref val2))
			{
				if (ctx != null)
				{
					ctx.Reply("Destroy");
				}
				DestroyUtility.Destroy(Core.EntityManager, val2, (DestroyDebugReason)13, (string)null, 0);
				if (ctx != null)
				{
					ctx.Reply("Health");
				}
				val.Value = ModifiableFloat.op_Implicit(val.MaxHealth);
				val.MaxRecoveryHealth = ModifiableFloat.op_Implicit(val.MaxHealth);
				Character.Write<Health>(val);
			}
			if (val.IsDead)
			{
				if (ctx != null)
				{
					ctx.Reply("Respawn");
				}
				LocalToWorld val3 = Character.Read<LocalToWorld>();
				float3 position = ((LocalToWorld)(ref val3)).Position;
				Nullable_Unboxed<float3> val4 = default(Nullable_Unboxed<float3>);
				val4.value = position;
				Nullable_Unboxed<float3> val5 = val4;
				if (ctx != null)
				{
					ctx.Reply("Respawn2");
				}
				ServerBootstrapSystem existingSystemManaged = Core.Server.GetExistingSystemManaged<ServerBootstrapSystem>();
				EntityCommandBuffer val6 = Core.Server.GetExistingSystemManaged<EntityCommandBufferSystem>().CreateCommandBuffer();
				if (ctx != null)
				{
					ctx.Reply("Respawn3");
				}
				existingSystemManaged.RespawnCharacter(val6, User, val5, Character, default(Entity), -1);
			}
		}

		public static void KickPlayer(Entity userEntity)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: 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_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: 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_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_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = Core.Server.EntityManager;
			User val = userEntity.Read<User>();
			if (val.IsConnected && val.PlatformId != 0L)
			{
				Entity entity = ((EntityManager)(ref entityManager)).CreateEntity((ComponentType[])(object)new ComponentType[3]
				{
					ComponentType.ReadOnly<NetworkEventType>(),
					ComponentType.ReadOnly<SendEventToUser>(),
					ComponentType.ReadOnly<KickEvent>()
				});
				entity.Write<KickEvent>(new KickEvent
				{
					PlatformId = val.PlatformId
				});
				entity.Write<SendEventToUser>(new SendEventToUser
				{
					UserIndex = val.Index
				});
				entity.Write<NetworkEventType>(new NetworkEventType
				{
					EventId = NetworkEvents.EventId_KickEvent,
					IsAdminEvent = false,
					IsDebugEvent = false
				});
			}
		}

		public static void UnlockWaypoints(Entity userEntity)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			EntityManager entityManager = Core.EntityManager;
			DynamicBuffer<UnlockedWaypointElement> val = ((EntityManager)(ref entityManager)).AddBuffer<UnlockedWaypointElement>(userEntity);
			val.Clear();
			Enumerator<Entity> enumerator = GetEntitiesByComponentType<ChunkWaypoint>().GetEnumerator();
			while (enumerator.MoveNext())
			{
				Entity current = enumerator.Current;
				val.Add(new UnlockedWaypointElement
				{
					Waypoint = current.Read<NetworkId>()
				});
			}
		}

		public static void RevealMapForPlayer(Entity userEntity)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: 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_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: 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)
			EntityManager entityManager = Core.EntityManager;
			Enumerator<UserMapZoneElement> enumerator = ((EntityManager)(ref entityManager)).GetBuffer<UserMapZoneElement>(userEntity, false).GetEnumerator();
			while (enumerator.MoveNext())
			{
				UserMapZoneElement current = enumerator.Current;
				NetworkedEntity userZoneEntity = current.UserZoneEntity;
				Entity entityOnServer = ((NetworkedEntity)(ref userZoneEntity)).GetEntityOnServer();
				entityManager = Core.EntityManager;
				DynamicBuffer<UserMapZonePackedRevealElement> buffer = ((EntityManager)(ref entityManager)).GetBuffer<UserMapZonePackedRevealElement>(entityOnServer, false);
				buffer.Clear();
				UserMapZonePackedRevealElement val = default(UserMapZonePackedRevealElement);
				val.PackedPixel = byte.MaxValue;
				UserMapZonePackedRevealElement val2 = val;
				for (int i = 0; i < 8192; i++)
				{
					buffer.Add(val2);
				}
			}
		}
	}
	[BepInPlugin("aa.odjit.KindredCommands", "KindredCommands", "2.5.8")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BasePlugin
	{
		internal static Harmony Harmony;

		internal static ManualLogSource PluginLog;

		public static ManualLogSource LogInstance { get; private set; }

		public override void Load()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Expected O, but got Unknown
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Expected O, but got Unknown
			if (!(Application.productName != "VRisingServer"))
			{
				PluginLog = ((BasePlugin)this).Log;
				ManualLogSource log = ((BasePlugin)this).Log;
				bool flag = default(bool);
				BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(27, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("aa.odjit.KindredCommands");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" version ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("2.5.8");
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" is loaded!");
				}
				log.LogInfo(val);
				LogInstance = ((BasePlugin)this).Log;
				Database.InitConfig();
				Harmony = new Harmony("aa.odjit.KindredCommands");
				Harmony.PatchAll(Assembly.GetExecutingAssembly());
				CommandRegistry.RegisterAll();
			}
		}

		public override bool Unload()
		{
			CommandRegistry.UnregisterAssembly();
			Harmony harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			return true;
		}

		public void OnGameInitialized()
		{
			if (!HasLoaded())
			{
				((BasePlugin)this).Log.LogDebug((object)"Attempt to initialize before everything has loaded.");
			}
			else
			{
				Core.InitializeAfterLoaded();
			}
		}

		private static bool HasLoaded()
		{
			PrefabCollectionSystem existingSystemManaged = Core.Server.GetExistingSystemManaged<PrefabCollectionSystem>();
			if (existingSystemManaged == null)
			{
				return false;
			}
			return existingSystemManaged.SpawnableNameToPrefabGuidDictionary.Count > 0;
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "aa.odjit.KindredCommands";

		public const string PLUGIN_NAME = "KindredCommands";

		public const string PLUGIN_VERSION = "2.5.8";
	}
}
namespace KindredCommands.Services
{
	[HarmonyBefore(new string[] { "gg.deca.VampireCommandFramework" })]
	[HarmonyPatch(typeof(ServerBootstrapSystem), "SendRevealedMapData")]
	public static class RevealedMapDataPatch
	{
		public static void Prefix(ServerBootstrapSystem __instance, Entity userEntity, User user)
		{
			//IL_0019: 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_001f: 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)
			if (Core.ConfigSettings == null)
			{
				Core.InitializeAfterLoaded();
			}
			if (Core.ConfigSettings.RevealMapToAll)
			{
				User val = userEntity.Read<User>();
				if (((FixedString64Bytes)(ref val.CharacterName)).IsEmpty)
				{
					Helper.RevealMapForPlayer(userEntity);
				}
			}
		}
	}
	internal class AdminService
	{
		public static void AdminUser(Entity userEntity)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: 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_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			User val = userEntity.Read<User>();
			EntityManager entityManager = Core.EntityManager;
			EntityArchetype val2 = ((EntityManager)(ref entityManager)).CreateArchetype((ComponentType[])(object)new ComponentType[2]
			{
				ComponentType.ReadWrite<FromCharacter>(),
				ComponentType.ReadWrite<AdminAuthEvent>()
			});
			entityManager = Core.EntityManager;
			((EntityManager)(ref entityManager)).CreateEntity(val2).Write<FromCharacter>(new FromCharacter
			{
				Character = ((NetworkedEntity)(ref val.LocalCharacter)).GetEntityOnServer(),
				User = userEntity
			});
		}
	}
	internal class AnnouncementsService
	{
		public struct Announcement
		{
			public string Name { get; set; }

			public string Time { get; set; }

			public string Message { get; set; }

			public bool OneTime { get; set; }
		}

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

			private object <>2__current;

			public Announcement announcement;

			public AnnouncementsService <>4__this;

			private DateTime <announcementTime>5__2;

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

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

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

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

			private bool MoveNext()
			{
				//IL_0043: Unknown result type (might be due to invalid IL or missing references)
				//IL_0049: Expected O, but got Unknown
				//IL_012c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0131: Unknown result type (might be due to invalid IL or missing references)
				//IL_0133: Unknown result type (might be due to invalid IL or missing references)
				//IL_0107: Unknown result type (might be due to invalid IL or missing references)
				//IL_0111: Expected O, but got Unknown
				int num = <>1__state;
				AnnouncementsService announcementsService = <>4__this;
				if (num != 0)
				{
					if (num != 1)
					{
						return false;
					}
					<>1__state = -1;
					FixedString512Bytes val = FixedString512Bytes.op_Implicit(announcement.Message);
					ServerChatUtils.SendSystemMessageToAllClients(Core.EntityManager, ref val);
					<announcementTime>5__2 = <announcementTime>5__2.AddDays(1.0);
					announcementsService.SortAnnouncements();
					if (announcement.OneTime)
					{
						announcementsService.announcements.Remove(announcement);
						announcementsService.announcementCoroutines.Remove(announcement.Name);
						announcementsService.SaveAnnoucements();
						return false;
					}
				}
				else
				{
					<>1__state = -1;
					if (!DateTime.TryParse(announcement.Time, out <announcementTime>5__2))
					{
						ManualLogSource log = Core.Log;
						bool flag = default(bool);
						BepInExErrorLogInterpolatedStringHandler val2 = new BepInExErrorLogInterpolatedStringHandler(64, 3, ref flag);
						if (flag)
						{
							((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Failed to parse time for announcement ");
							((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(announcement.Name);
							((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" with time ");
							((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(announcement.Time);
							((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" and message \"");
							((BepInExLogInterpolatedStringHandler)val2).AppendFormatted<string>(announcement.Message);
							((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("\"");
						}
						log.LogError(val2);
						return false;
					}
					if (!announcement.OneTime && <announcementTime>5__2 < DateTime.Now)
					{
						<announcementTime>5__2 = <announcementTime>5__2.AddDays(1.0);
					}
				}
				<>2__current = (object)new WaitForSecondsRealtime((float)(<announcementTime>5__2 - DateTime.Now).TotalSeconds);
				<>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();
			}
		}

		private static readonly string CONFIG_PATH = Path.Combine(Paths.ConfigPath, "KindredCommands");

		private static readonly string ANNOUNCEMENTS_PATH = Path.Combine(CONFIG_PATH, "announcements.json");

		private readonly List<Announcement> announcements = new List<Announcement>();

		private Dictionary<string, Coroutine> announcementCoroutines = new Dictionary<string, Coroutine>();

		public AnnouncementsService()
		{
			LoadAnnoucements();
		}

		private void ScheduleAnnouncement(Announcement announcement)
		{
			Coroutine val = Core.StartCoroutine(MessageCoroutine(announcement));
			if (val != null)
			{
				announcementCoroutines[announcement.Name] = val;
			}
		}

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

		public bool AddAnnouncement(string name, string message, DateTime time, bool oneTime)
		{
			string nameLower = name.ToLowerInvariant();
			if (announcements.Where((Announcement a) => a.Name.ToLowerInvariant() == nameLower).Any())
			{
				return false;
			}
			Announcement announcement = default(Announcement);
			announcement.Name = name;
			announcement.Time = time.ToString();
			announcement.Message = message;
			announcement.OneTime = oneTime;
			Announcement announcement2 = announcement;
			announcements.Add(announcement2);
			ScheduleAnnouncement(announcement2);
			SortAnnouncements();
			SaveAnnoucements();
			return true;
		}

		private void SortAnnouncements()
		{
			announcements.Sort(AnnouncementCompare);
			static int AnnouncementCompare(Announcement x, Announcement y)
			{
				if (!DateTime.TryParse(x.Time, out var result))
				{
					return -1;
				}
				if (!DateTime.TryParse(y.Time, out var result2))
				{
					return 1;
				}
				DateTime now = DateTime.Now;
				if (result < now)
				{
					result = result.AddDays(1.0);
				}
				if (result2 < now)
				{
					result2 = result2.AddDays(1.0);
				}
				int num = DateTime.Compare(result, result2);
				if (num == 0)
				{
					num = string.Compare(x.Name, y.Name, StringComparison.InvariantCultureIgnoreCase);
				}
				return num;
			}
		}

		public bool RemoveAnnouncement(string name)
		{
			string nameLower = name.ToLowerInvariant();
			IEnumerable<string> source = from a in announcements
				where a.Name.ToLowerInvariant() == nameLower
				select a into x
				select x.Name;
			if (!source.Any())
			{
				return false;
			}
			name = source.First();
			announcements.RemoveAll((Announcement a) => a.Name == name);
			if (!announcementCoroutines.TryGetValue(name, out var value))
			{
				SaveAnnoucements();
				return true;
			}
			Core.StopCoroutine(value);
			announcementCoroutines.Remove(name);
			SaveAnnoucements();
			return true;
		}

		public IEnumerable<Announcement> GetAnnouncements()
		{
			return announcements;
		}

		private void LoadAnnoucements()
		{
			if (File.Exists(ANNOUNCEMENTS_PATH))
			{
				string json = File.ReadAllText(ANNOUNCEMENTS_PATH);
				announcements.Clear();
				announcements.AddRange(JsonSerializer.Deserialize<Announcement[]>(json));
				SortAnnouncements();
				foreach (Coroutine value in announcementCoroutines.Values)
				{
					Core.StopCoroutine(value);
				}
				announcementCoroutines.Clear();
				{
					foreach (Announcement announcement in announcements)
					{
						ScheduleAnnouncement(announcement);
					}
					return;
				}
			}
			SaveAnnoucements();
		}

		private void SaveAnnoucements()
		{
			if (!Directory.Exists(CONFIG_PATH))
			{
				Directory.CreateDirectory(CONFIG_PATH);
			}
			JsonSerializerOptions options = new JsonSerializerOptions
			{
				WriteIndented = true
			};
			string contents = JsonSerializer.Serialize(announcements, options);
			File.WriteAllText(ANNOUNCEMENTS_PATH, contents);
		}
	}
	internal class AuditMiddleware : CommandMiddleware
	{
		public override void BeforeExecute(ICommandContext ctx, CommandAttribute attribute, MethodInfo method)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			//IL_007f: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Expected O, but got Unknown
			ChatCommandContext val = (ChatCommandContext)ctx;
			string text = method.DeclaringType.Assembly.GetName().Name;
			if (method.DeclaringType.IsDefined(typeof(CommandGroupAttribute)))
			{
				CommandGroupAttribute val2 = (CommandGroupAttribute)Attribute.GetCustomAttribute(method.DeclaringType, typeof(CommandGroupAttribute), inherit: false);
				text = text + "." + val2.Name;
			}
			text = text + "." + attribute.Name;
			Core.AuditService.LogCommandUsage(val.Event.User, text);
		}
	}
	internal class AuditService : IDisposable
	{
		private static readonly string CONFIG_PATH = Path.Combine(Paths.ConfigPath, "KindredCommands");

		private static readonly string AUDIT_PATH = Path.Combine(CONFIG_PATH, "audit-" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".csv");

		private const string DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss.fff";

		private readonly ConcurrentQueue<string> _auditQueue = new ConcurrentQueue<string>();

		private readonly AutoResetEvent _signal = new AutoResetEvent(initialState: false);

		private readonly Task _processingTask;

		private bool _isDisposed;

		private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();

		private static bool inExecuteCommandWithArgs = false;

		private static bool inHelpCmd = false;

		private static bool InExecute
		{
			get
			{
				if (inExecuteCommandWithArgs)
				{
					return !inHelpCmd;
				}
				return false;
			}
		}

		public AuditService()
		{
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Expected O, but got Unknown
			MethodInfo methodInfo = AccessTools.Method(typeof(CommandRegistry), "CanCommandExecute", (Type[])null, (Type[])null);
			HarmonyMethod val = new HarmonyMethod(typeof(AuditService), "CanCommandExecutePostfix", (Type[])null);
			Plugin.Harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, val, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			HookUpForSeeingIfCheckingPermission();
			AuditMiddleware item = new AuditMiddleware();
			CommandRegistry.Middlewares.Add((CommandMiddleware)(object)item);
			Directory.CreateDirectory(CONFIG_PATH);
			_processingTask = Task.Run((Func<Task?>)ProcessQueueAsync, _cancellationTokenSource.Token);
		}

		private async Task ProcessQueueAsync()
		{
			while (!_cancellationTokenSource.Token.IsCancellationRequested)
			{
				await Task.Run(() => _signal.WaitOne(TimeSpan.FromSeconds(1.0)), _cancellationTokenSource.Token);
				string result;
				while (_auditQueue.TryDequeue(out result) && !_cancellationTokenSource.Token.IsCancellationRequested)
				{
					try
					{
						File.AppendAllText(AUDIT_PATH, result);
					}
					catch (Exception ex)
					{
						Console.WriteLine("Error writing to audit log: " + ex.Message);
					}
				}
			}
		}

		private static void CanCommandExecutePostfix(ICommandContext ctx, object command, ref bool __result)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Expected O, but got Unknown
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			if (__result || !InExecute)
			{
				return;
			}
			ChatCommandContext val = (ChatCommandContext)ctx;
			try
			{
				PropertyInfo property = command.GetType().GetProperty("Method");
				if (property == null)
				{
					return;
				}
				MethodInfo methodInfo = property.GetValue(command) as MethodInfo;
				if (methodInfo == null)
				{
					return;
				}
				string text = methodInfo.DeclaringType.Assembly.GetName().Name;
				PropertyInfo proper

NetTopologySuite.dll

Decompiled a day ago
#define TRACE
using System;
using System.Buffers;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.ExceptionServices;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Xml;
using System.Xml.Linq;
using Microsoft.CodeAnalysis;
using NetTopologySuite.Algorithm;
using NetTopologySuite.Algorithm.Construct;
using NetTopologySuite.Algorithm.Distance;
using NetTopologySuite.Algorithm.Locate;
using NetTopologySuite.EdgeGraph;
using NetTopologySuite.Geometries;
using NetTopologySuite.Geometries.Implementation;
using NetTopologySuite.Geometries.Prepared;
using NetTopologySuite.Geometries.Utilities;
using NetTopologySuite.GeometriesGraph;
using NetTopologySuite.GeometriesGraph.Index;
using NetTopologySuite.IO;
using NetTopologySuite.IO.GML2;
using NetTopologySuite.Index;
using NetTopologySuite.Index.Chain;
using NetTopologySuite.Index.HPRtree;
using NetTopologySuite.Index.IntervalRTree;
using NetTopologySuite.Index.KdTree;
using NetTopologySuite.Index.Quadtree;
using NetTopologySuite.Index.Strtree;
using NetTopologySuite.Mathematics;
using NetTopologySuite.Noding;
using NetTopologySuite.Noding.Snap;
using NetTopologySuite.Noding.Snapround;
using NetTopologySuite.Operation;
using NetTopologySuite.Operation.Buffer;
using NetTopologySuite.Operation.Distance;
using NetTopologySuite.Operation.Overlay;
using NetTopologySuite.Operation.Overlay.Snap;
using NetTopologySuite.Operation.OverlayNG;
using NetTopologySuite.Operation.Predicate;
using NetTopologySuite.Operation.Relate;
using NetTopologySuite.Operation.RelateNG;
using NetTopologySuite.Operation.Union;
using NetTopologySuite.Operation.Valid;
using NetTopologySuite.Planargraph;
using NetTopologySuite.Planargraph.Algorithm;
using NetTopologySuite.Precision;
using NetTopologySuite.Shape.Fractal;
using NetTopologySuite.Simplify;
using NetTopologySuite.Triangulate;
using NetTopologySuite.Triangulate.Polygon;
using NetTopologySuite.Triangulate.QuadEdge;
using NetTopologySuite.Triangulate.Tri;
using NetTopologySuite.Utilities;
using RTools_NTS.Util;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyDelaySign(false)]
[assembly: CLSCompliant(true)]
[assembly: ComVisible(false)]
[assembly: Guid("6B7EB658-792E-4178-B853-8AEB851513A9")]
[assembly: InternalsVisibleTo("NetTopologySuite.Tests.NUnit, PublicKey=0024000004800000940000000602000000240000525341310004000001000100e5a9697e3d378de4bdd1607b9a6ea7884823d3909f8de55b573416d9adb0ae25eebc39007d71a7228c500d6e846d54dcc2cd839056c38c0a5e86b73096d90504f753ea67c9b5e61ecfdb8edf0f1dfaf0455e9a0f9e124e16777baefcda2af9a5a9e48f0c3502891c79444dc2d75aa50b75d148e16f1401dcb18bc1638cc764a9")]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("NetTopologySuite - Team")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyCopyright("Copyright © 2006 - 2025 NetTopologySuite - Team, Diego Guidi, John Diss (www.newgrove.com), Felix Obermaier (www.ivv-aachen.de), Todd Jackson, Joe Amenta")]
[assembly: AssemblyDescription("The NTS Topology Suite is an API for modelling and manipulating 2-dimensional linear geometry. It provides numerous geometric predicates and functions. NTS conforms to the Simple Features Specification.")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: AssemblyInformationalVersion("2.6.0 (compatible with JTS 1.20.0)+97d26b92586448b52d5a4f0c060217f94f882c75")]
[assembly: AssemblyProduct("NetTopologySuite")]
[assembly: AssemblyTitle("NetTopologySuite")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/NetTopologySuite/NetTopologySuite")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("2.0.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class IsReadOnlyAttribute : Attribute
	{
	}
}
internal static class Consts
{
	public const string PublicKeyToken = "0024000004800000940000000602000000240000525341310004000001000100e5a9697e3d378de4bdd1607b9a6ea7884823d3909f8de55b573416d9adb0ae25eebc39007d71a7228c500d6e846d54dcc2cd839056c38c0a5e86b73096d90504f753ea67c9b5e61ecfdb8edf0f1dfaf0455e9a0f9e124e16777baefcda2af9a5a9e48f0c3502891c79444dc2d75aa50b75d148e16f1401dcb18bc1638cc764a9";
}
namespace RTools_NTS.Util
{
	public class CharBuffer
	{
		private int capacity = 128;

		private char[] buffer;

		private int headIndex;

		private int tailIndex;

		public int Length
		{
			get
			{
				return tailIndex - headIndex;
			}
			set
			{
				tailIndex = headIndex + value;
				if (tailIndex >= capacity)
				{
					throw new IndexOutOfRangeException("Tail index greater than capacity");
				}
			}
		}

		public int Capacity => capacity;

		public char this[int index]
		{
			get
			{
				return buffer[index + headIndex];
			}
			set
			{
				buffer[index + headIndex] = value;
			}
		}

		public CharBuffer()
		{
			buffer = new char[capacity];
		}

		public CharBuffer(int capacity)
		{
			this.capacity = capacity;
			buffer = new char[capacity];
		}

		protected void Grow(int requestedLen)
		{
			int val = Math.Max(capacity * 2, requestedLen);
			val = Math.Max(val, 16);
			char[] destinationArray = new char[val];
			Array.Copy(buffer, 0, destinationArray, 0, capacity);
			buffer = destinationArray;
			capacity = val;
		}

		protected void CheckCapacity(int requestedLength)
		{
			if (requestedLength + headIndex >= capacity)
			{
				if (requestedLength + headIndex > capacity >> 1 && requestedLength < capacity - 1)
				{
					ShiftToZero();
				}
				else
				{
					Grow(0);
				}
			}
		}

		protected void ShiftToZero()
		{
			int length = Length;
			for (int i = 0; i < length; i++)
			{
				buffer[i] = buffer[i + headIndex];
			}
			headIndex = 0;
			tailIndex = length;
		}

		public void SetBuffer(char[] b, int len)
		{
			capacity = b.Length;
			buffer = b;
			headIndex = 0;
			tailIndex = len;
		}

		public void Append(char c)
		{
			if (tailIndex >= capacity)
			{
				CheckCapacity(Length + 1);
			}
			buffer[tailIndex++] = c;
		}

		public void Append(string s)
		{
			if (s.Length + tailIndex >= capacity)
			{
				CheckCapacity(Length + s.Length);
			}
			for (int i = 0; i < s.Length; i++)
			{
				buffer[tailIndex++] = s[i];
			}
		}

		public void Append(CharBuffer s)
		{
			if (s.Length + tailIndex >= capacity)
			{
				CheckCapacity(Length + s.Length);
			}
			for (int i = 0; i < s.Length; i++)
			{
				buffer[tailIndex++] = s[i];
			}
		}

		public void Remove(int i)
		{
			Remove(i, 1);
		}

		public void Remove(int i, int n)
		{
			n = Math.Min(n, Length);
			if (i == 0)
			{
				headIndex += n;
			}
			else
			{
				Array.Copy(buffer, i + headIndex + n, buffer, i + headIndex, tailIndex - (i + headIndex + n));
			}
		}

		public int IndexOf(char c)
		{
			for (int i = headIndex; i < tailIndex; i++)
			{
				if (buffer[i] == c)
				{
					return i - headIndex;
				}
			}
			return -1;
		}

		public void Clear()
		{
			headIndex = 0;
			tailIndex = 0;
		}

		public override string ToString()
		{
			return new string(buffer, headIndex, tailIndex - headIndex);
		}
	}
	public class StreamTokenizerUntermException : Exception
	{
		public StreamTokenizerUntermException(string msg)
			: base(msg)
		{
		}
	}
	public class StreamTokenizerUntermQuoteException : StreamTokenizerUntermException
	{
		public StreamTokenizerUntermQuoteException(string msg)
			: base(msg)
		{
		}
	}
	public class StreamTokenizerUntermCommentException : StreamTokenizerUntermException
	{
		public StreamTokenizerUntermCommentException(string msg)
			: base(msg)
		{
		}
	}
	[Flags]
	public enum CharTypeBits : byte
	{
		Word = 1,
		Comment = 2,
		Whitespace = 4,
		Quote = 8,
		Digit = 0x10,
		HexDigit = 0x20,
		Eof = 0x40
	}
	public class StreamTokenizerSettings
	{
		private byte[] charTypes;

		private bool grabWhitespace;

		private bool grabEol;

		private bool slashSlashComments;

		private bool slashStarComments;

		private bool grabComments;

		private bool doUntermCheck;

		private bool parseNumbers;

		private bool parseHexNumbers;

		public byte[] CharTypes => charTypes;

		public bool GrabWhitespace
		{
			get
			{
				return grabWhitespace;
			}
			set
			{
				grabWhitespace = value;
			}
		}

		public bool GrabEol
		{
			get
			{
				return grabEol;
			}
			set
			{
				grabEol = value;
			}
		}

		public bool SlashSlashComments
		{
			get
			{
				return slashSlashComments;
			}
			set
			{
				slashSlashComments = value;
			}
		}

		public bool SlashStarComments
		{
			get
			{
				return slashStarComments;
			}
			set
			{
				slashStarComments = value;
			}
		}

		public bool GrabComments
		{
			get
			{
				return grabComments;
			}
			set
			{
				grabComments = value;
			}
		}

		public bool DoUntermCheck
		{
			get
			{
				return doUntermCheck;
			}
			set
			{
				doUntermCheck = value;
			}
		}

		public bool ParseNumbers
		{
			get
			{
				return parseNumbers;
			}
			set
			{
				if (value)
				{
					for (int i = 48; i <= 57; i++)
					{
						charTypes[i] |= 16;
					}
				}
				else
				{
					byte b = 16;
					for (int j = 48; j <= 57; j++)
					{
						charTypes[j] &= (byte)(~b);
					}
				}
				parseNumbers = value;
			}
		}

		public bool ParseHexNumbers
		{
			get
			{
				return parseHexNumbers;
			}
			set
			{
				parseHexNumbers = value;
				if (parseHexNumbers)
				{
					for (int i = 48; i <= 57; i++)
					{
						charTypes[i] |= 32;
					}
					for (int j = 65; j <= 70; j++)
					{
						charTypes[j] |= 32;
					}
					for (int k = 97; k <= 102; k++)
					{
						charTypes[k] |= 32;
					}
					charTypes[120] |= 32;
				}
				else
				{
					byte b = 32;
					for (int l = 65; l <= 70; l++)
					{
						charTypes[l] &= (byte)(~b);
					}
					for (int m = 97; m <= 102; m++)
					{
						charTypes[m] &= (byte)(~b);
					}
					charTypes[120] &= (byte)(~b);
				}
			}
		}

		public StreamTokenizerSettings()
		{
			charTypes = new byte[StreamTokenizer.NChars + 1];
			SetDefaults();
		}

		public StreamTokenizerSettings(StreamTokenizerSettings other)
		{
			Copy(other);
		}

		public void Copy(StreamTokenizerSettings other)
		{
			charTypes = new byte[StreamTokenizer.NChars + 1];
			Array.Copy(other.charTypes, 0, charTypes, 0, charTypes.Length);
			grabWhitespace = other.grabWhitespace;
			grabEol = other.grabEol;
			slashSlashComments = other.slashSlashComments;
			slashStarComments = other.slashStarComments;
			grabComments = other.grabComments;
			doUntermCheck = other.doUntermCheck;
			parseHexNumbers = other.parseHexNumbers;
		}

		public bool SetDefaults()
		{
			slashStarComments = false;
			grabComments = false;
			slashSlashComments = false;
			grabWhitespace = false;
			doUntermCheck = true;
			grabEol = false;
			ResetCharTypeTable();
			ParseNumbers = true;
			ParseHexNumbers = true;
			WordChars(65, 90);
			WordChars(97, 122);
			WhitespaceChars(0, 32);
			QuoteChar(39);
			QuoteChar(34);
			WordChars(48, 57);
			return true;
		}

		public bool SetupForCodeParse()
		{
			GrabWhitespace = true;
			GrabComments = true;
			SlashSlashComments = true;
			DoUntermCheck = true;
			SlashStarComments = true;
			WordChar(95);
			ParseNumbers = true;
			ParseHexNumbers = true;
			return true;
		}

		public void ResetCharTypeTable()
		{
			Array.Clear(charTypes, 0, charTypes.Length);
			charTypes[StreamTokenizer.NChars] = 64;
		}

		public void WordChar(int c)
		{
			charTypes[c] |= 1;
		}

		public void WordChars(int startChar, int endChar)
		{
			for (int i = startChar; i <= endChar; i++)
			{
				charTypes[i] |= 1;
			}
		}

		public void WordChars(string s)
		{
			for (int i = 0; i < s.Length; i++)
			{
				charTypes[(uint)s[i]] |= 1;
			}
		}

		public void WhitespaceChar(int c)
		{
			charTypes[c] = 4;
		}

		public void WhitespaceChars(int startChar, int endChar)
		{
			for (int i = startChar; i <= endChar; i++)
			{
				charTypes[i] = 4;
			}
		}

		public void OrdinaryChars(int startChar, int endChar)
		{
			for (int i = startChar; i <= endChar; i++)
			{
				charTypes[i] = 0;
			}
		}

		public void OrdinaryChar(int c)
		{
			charTypes[c] = 0;
		}

		public void CommentChar(int c)
		{
			charTypes[c] = 2;
		}

		public void QuoteChar(int c)
		{
			charTypes[c] = 8;
		}

		public string CharTypeToString(byte ctype)
		{
			StringBuilder stringBuilder = new StringBuilder();
			if (IsCharType(ctype, CharTypeBits.Quote))
			{
				stringBuilder.Append('q');
			}
			if (IsCharType(ctype, CharTypeBits.Comment))
			{
				stringBuilder.Append('m');
			}
			if (IsCharType(ctype, CharTypeBits.Whitespace))
			{
				stringBuilder.Append('w');
			}
			if (IsCharType(ctype, CharTypeBits.Digit))
			{
				stringBuilder.Append('d');
			}
			if (IsCharType(ctype, CharTypeBits.Word))
			{
				stringBuilder.Append('a');
			}
			if (IsCharType(ctype, CharTypeBits.Eof))
			{
				stringBuilder.Append('e');
			}
			if (stringBuilder.Length == 0)
			{
				stringBuilder.Append('c');
			}
			return stringBuilder.ToString();
		}

		public bool IsCharType(byte ctype, CharTypeBits type)
		{
			return ((uint)ctype & (uint)type) != 0;
		}

		public bool IsCharType(char c, CharTypeBits type)
		{
			return ((uint)charTypes[(uint)c] & (uint)type) != 0;
		}

		public bool IsCharType(int c, CharTypeBits type)
		{
			return ((uint)charTypes[c] & (uint)type) != 0;
		}

		public void Display()
		{
			Display(string.Empty);
		}

		public void Display(string prefix)
		{
		}
	}
	public class StreamTokenizer : IEnumerable<Token>, IEnumerable
	{
		private enum NextTokenState
		{
			Start,
			Whitespace,
			Word,
			Quote,
			EndQuote,
			MaybeNumber,
			MaybeComment,
			MaybeHex,
			HexGot0x,
			HexNumber,
			LineComment,
			BlockComment,
			EndBlockComment,
			Char,
			Eol,
			Eof,
			Invalid
		}

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

			private Token <>2__current;

			public StreamTokenizer <>4__this;

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

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

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

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

			private bool MoveNext()
			{
				int num = <>1__state;
				StreamTokenizer streamTokenizer = <>4__this;
				Token token;
				switch (num)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					streamTokenizer.lineNumber = 1;
					goto IL_005d;
				case 1:
					<>1__state = -1;
					goto IL_005d;
				case 2:
					{
						<>1__state = -1;
						return false;
					}
					IL_005d:
					if (streamTokenizer.NextToken(out token))
					{
						if (token == null)
						{
							throw new NullReferenceException("StreamTokenizer: Tokenize: Got a null token from NextToken.");
						}
						<>2__current = token;
						<>1__state = 1;
						return true;
					}
					<>2__current = token;
					<>1__state = 2;
					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 readonly int NChars = 128;

		private static readonly int Eof = NChars;

		private TextReader textReader;

		private int lineNumber;

		private CharBuffer backString;

		private CharBuffer nextTokenSb;

		private CharBuffer tmpSb;

		private CharBuffer expSb;

		private StreamTokenizerSettings settings;

		public TextReader TextReader
		{
			get
			{
				return textReader;
			}
			set
			{
				textReader = value;
			}
		}

		public StreamTokenizerSettings Settings => settings;

		public StreamTokenizer()
		{
			Initialize();
		}

		public StreamTokenizer(TextReader sr)
		{
			Initialize();
			textReader = sr;
		}

		public StreamTokenizer(TextReader sr, StreamTokenizerSettings tokenizerSettings)
		{
			settings = tokenizerSettings;
			Initialize();
			textReader = sr;
		}

		public StreamTokenizer(string str)
		{
			Initialize();
			textReader = new StringReader(str);
		}

		private void Initialize()
		{
			backString = new CharBuffer(32);
			nextTokenSb = new CharBuffer(1024);
			InitializeStream();
			if (settings == null)
			{
				settings = new StreamTokenizerSettings();
				settings.SetDefaults();
			}
			expSb = new CharBuffer();
			tmpSb = new CharBuffer();
		}

		private void InitializeStream()
		{
			lineNumber = 1;
			textReader = null;
		}

		public void Display()
		{
			Display(string.Empty);
		}

		public void Display(string prefix)
		{
			if (settings != null)
			{
				settings.Display(prefix + "    ");
			}
		}

		private NextTokenState PickNextState(byte ctype, int c)
		{
			return PickNextState(ctype, c, NextTokenState.Start);
		}

		private NextTokenState PickNextState(byte ctype, int c, NextTokenState excludeState)
		{
			if (c == 47)
			{
				return NextTokenState.MaybeComment;
			}
			if (excludeState != NextTokenState.MaybeHex && settings.ParseHexNumbers && c == 48)
			{
				return NextTokenState.MaybeHex;
			}
			if (excludeState != NextTokenState.MaybeNumber && settings.ParseNumbers && (settings.IsCharType(ctype, CharTypeBits.Digit) || c == 45 || c == 46))
			{
				return NextTokenState.MaybeNumber;
			}
			if (settings.IsCharType(ctype, CharTypeBits.Word))
			{
				return NextTokenState.Word;
			}
			if (settings.GrabEol && c == 10)
			{
				return NextTokenState.Eol;
			}
			if (settings.IsCharType(ctype, CharTypeBits.Whitespace))
			{
				return NextTokenState.Whitespace;
			}
			if (settings.IsCharType(ctype, CharTypeBits.Comment))
			{
				return NextTokenState.LineComment;
			}
			if (settings.IsCharType(ctype, CharTypeBits.Quote))
			{
				return NextTokenState.Quote;
			}
			if (c == Eof || settings.IsCharType(ctype, CharTypeBits.Eof))
			{
				return NextTokenState.Eof;
			}
			return NextTokenState.Char;
		}

		private int GetNextChar()
		{
			int result;
			if (backString.Length > 0)
			{
				result = backString[0];
				backString.Remove(0, 1);
				return result;
			}
			if (textReader == null)
			{
				return Eof;
			}
			try
			{
				while ((result = textReader.Read()) == 13)
				{
				}
			}
			catch (Exception)
			{
				return Eof;
			}
			if (result == 10)
			{
				lineNumber++;
			}
			else if (result < 0)
			{
				result = Eof;
			}
			return result;
		}

		public bool NextToken(out Token token)
		{
			token = null;
			int num = 0;
			NextTokenState nextTokenState = NextTokenState.Start;
			int num2 = 0;
			byte b = 64;
			if (nextTokenSb.Length > 0)
			{
				num2 = nextTokenSb[nextTokenSb.Length - 1];
				b = settings.CharTypes[num2];
				nextTokenState = PickNextState(b, num2);
			}
			int num3 = 0;
			int num4 = 0;
			bool flag = false;
			int num5 = lineNumber;
			num = num2;
			bool flag2 = false;
			while (!flag2)
			{
				num2 = num;
				num = GetNextChar();
				byte ctype = (byte)((num >= settings.CharTypes.Length) ? 1 : settings.CharTypes[num]);
				switch (nextTokenState)
				{
				case NextTokenState.Start:
					nextTokenState = PickNextState(ctype, num);
					num5 = lineNumber;
					break;
				case NextTokenState.Char:
					token = new CharToken((char)num2, num5);
					flag2 = true;
					nextTokenSb.Length = 0;
					break;
				case NextTokenState.Word:
					if (!settings.IsCharType(ctype, CharTypeBits.Word) && !settings.IsCharType(ctype, CharTypeBits.Digit))
					{
						token = new WordToken(nextTokenSb.ToString(), num5);
						flag2 = true;
						nextTokenSb.Length = 0;
					}
					break;
				case NextTokenState.Whitespace:
					if (!settings.IsCharType(ctype, CharTypeBits.Whitespace) || (settings.GrabEol && num == 10))
					{
						if (settings.GrabWhitespace)
						{
							token = new WhitespaceToken(nextTokenSb.ToString(), num5);
							flag2 = true;
							nextTokenSb.Length = 0;
						}
						else
						{
							nextTokenSb.Length = 0;
							num5 = lineNumber;
							nextTokenState = PickNextState(ctype, num);
						}
					}
					break;
				case NextTokenState.EndQuote:
					token = new QuoteToken(nextTokenSb.ToString(), num5);
					flag2 = true;
					nextTokenSb.Length = 0;
					break;
				case NextTokenState.Quote:
					if (num == nextTokenSb[0])
					{
						int num6 = 0;
						int num7 = nextTokenSb.Length - 1;
						while (num7 >= 0 && nextTokenSb[num7] == '\\')
						{
							num6++;
							num7--;
						}
						if (num6 % 2 == 0)
						{
							nextTokenState = NextTokenState.EndQuote;
						}
					}
					if (nextTokenState != NextTokenState.EndQuote && num == Eof)
					{
						if (settings.DoUntermCheck)
						{
							nextTokenSb.Length = 0;
							throw new StreamTokenizerUntermQuoteException("Unterminated quote");
						}
						token = new QuoteToken(nextTokenSb.ToString(), num5);
						flag2 = true;
						nextTokenSb.Length = 0;
					}
					break;
				case NextTokenState.MaybeComment:
					if (num == Eof)
					{
						token = new CharToken(nextTokenSb.ToString(), num5);
						flag2 = true;
						nextTokenSb.Length = 0;
					}
					else if (settings.SlashSlashComments && num == 47)
					{
						nextTokenState = NextTokenState.LineComment;
					}
					else if (settings.SlashStarComments && num == 42)
					{
						nextTokenState = NextTokenState.BlockComment;
					}
					else
					{
						token = new CharToken(nextTokenSb.ToString(), num5);
						flag2 = true;
						nextTokenSb.Length = 0;
					}
					break;
				case NextTokenState.LineComment:
					if (num == Eof)
					{
						if (settings.GrabComments)
						{
							token = new CommentToken(nextTokenSb.ToString(), num5);
							flag2 = true;
							nextTokenSb.Length = 0;
						}
						else
						{
							nextTokenSb.Length = 0;
							num5 = lineNumber;
							nextTokenState = PickNextState(ctype, num);
						}
					}
					else if (num == 10)
					{
						if (settings.GrabComments)
						{
							token = new CommentToken(nextTokenSb.ToString(), num5);
							flag2 = true;
							nextTokenSb.Length = 0;
						}
						else
						{
							nextTokenSb.Length = 0;
							num5 = lineNumber;
							nextTokenState = PickNextState(ctype, num);
						}
					}
					break;
				case NextTokenState.BlockComment:
					if (num == Eof)
					{
						if (settings.DoUntermCheck)
						{
							nextTokenSb.Length = 0;
							throw new StreamTokenizerUntermCommentException("Unterminated comment.");
						}
						if (settings.GrabComments)
						{
							token = new CommentToken(nextTokenSb.ToString(), num5);
							flag2 = true;
							nextTokenSb.Length = 0;
						}
						else
						{
							nextTokenSb.Length = 0;
							num5 = lineNumber;
							nextTokenState = PickNextState(ctype, num);
						}
					}
					else if (num == 47 && num2 == 42)
					{
						nextTokenState = NextTokenState.EndBlockComment;
					}
					break;
				case NextTokenState.EndBlockComment:
					if (settings.GrabComments)
					{
						token = new CommentToken(nextTokenSb.ToString(), num5);
						flag2 = true;
						nextTokenSb.Length = 0;
					}
					else
					{
						nextTokenSb.Length = 0;
						num5 = lineNumber;
						nextTokenState = PickNextState(ctype, num);
					}
					break;
				case NextTokenState.MaybeHex:
					if (num != 120)
					{
						nextTokenSb.Append((char)num);
						backString.Append(nextTokenSb);
						nextTokenSb.Length = 0;
						num = backString[0];
						backString.Remove(0, 1);
						nextTokenState = PickNextState(settings.CharTypes[num], num, NextTokenState.MaybeHex);
					}
					else
					{
						nextTokenState = NextTokenState.HexGot0x;
					}
					break;
				case NextTokenState.HexGot0x:
					if (!settings.IsCharType(ctype, CharTypeBits.HexDigit))
					{
						nextTokenSb.Append((char)num);
						backString.Append(nextTokenSb);
						nextTokenSb.Length = 0;
						num = backString[0];
						backString.Remove(0, 1);
						nextTokenState = PickNextState(settings.CharTypes[num], num, NextTokenState.MaybeHex);
					}
					else
					{
						nextTokenState = NextTokenState.HexNumber;
					}
					break;
				case NextTokenState.HexNumber:
					if (!settings.IsCharType(ctype, CharTypeBits.HexDigit))
					{
						token = IntToken.ParseHex(nextTokenSb.ToString(), num5);
						flag2 = true;
						nextTokenSb.Length = 0;
					}
					break;
				case NextTokenState.MaybeNumber:
				{
					bool flag3 = false;
					if (settings.IsCharType(ctype, CharTypeBits.Digit) || settings.IsCharType(num2, CharTypeBits.Digit))
					{
						flag = true;
					}
					switch (num)
					{
					case 46:
						num3++;
						if (num3 > 1)
						{
							flag3 = true;
						}
						break;
					case 69:
					case 101:
					{
						num4++;
						if (!flag)
						{
							flag3 = true;
							break;
						}
						if (num4 > 1)
						{
							flag3 = true;
							break;
						}
						flag3 = true;
						expSb.Clear();
						expSb.Append((char)num);
						if (GrabInt(expSb, allowPlus: true, out var thisChar))
						{
							nextTokenSb.Append(expSb);
							num = thisChar;
						}
						break;
					}
					default:
						if (num == Eof)
						{
							flag3 = true;
						}
						else if ((!settings.IsCharType(ctype, CharTypeBits.Digit) && num != 101 && num != 69 && num != 45 && num != 46) || (num == 43 && num4 == 0))
						{
							flag3 = true;
						}
						else if (num == 45 && num2 != 101 && num2 != 69)
						{
							flag3 = true;
						}
						break;
					}
					if (!flag3)
					{
						break;
					}
					if (flag)
					{
						if (nextTokenSb.IndexOf('.') >= 0 || nextTokenSb.IndexOf('e') >= 0 || nextTokenSb.IndexOf('E') >= 0 || nextTokenSb.Length >= 19)
						{
							token = new FloatToken(nextTokenSb.ToString(), num5);
						}
						else
						{
							token = new IntToken(nextTokenSb.ToString(), num5);
						}
						flag2 = true;
						nextTokenSb.Length = 0;
					}
					else
					{
						nextTokenSb.Append((char)num);
						backString.Append(nextTokenSb);
						nextTokenSb.Length = 0;
						num = backString[0];
						backString.Remove(0, 1);
						nextTokenState = PickNextState(settings.CharTypes[num], num, NextTokenState.MaybeNumber);
					}
					break;
				}
				case NextTokenState.Eol:
					token = new EolToken(num5 - 1);
					flag2 = true;
					nextTokenSb.Length = 0;
					break;
				case NextTokenState.Eof:
					token = new EofToken(num5);
					flag2 = true;
					nextTokenSb.Length = 0;
					return false;
				default:
					return false;
				}
				if (num != Eof)
				{
					nextTokenSb.Append((char)num);
				}
			}
			return true;
		}

		private bool GrabInt(CharBuffer sb, bool allowPlus, out char thisChar)
		{
			tmpSb.Clear();
			thisChar = (char)GetNextChar();
			if (thisChar == Eof)
			{
				return false;
			}
			if (thisChar == '+')
			{
				if (!allowPlus)
				{
					backString.Append(thisChar);
					return false;
				}
				tmpSb.Append(thisChar);
			}
			else if (thisChar == '-')
			{
				tmpSb.Append(thisChar);
			}
			else
			{
				if (!settings.IsCharType(thisChar, CharTypeBits.Digit))
				{
					backString.Append(thisChar);
					return false;
				}
				backString.Append(thisChar);
			}
			bool flag = false;
			while ((thisChar = (char)GetNextChar()) != Eof && settings.IsCharType(thisChar, CharTypeBits.Digit))
			{
				flag = true;
				tmpSb.Append(thisChar);
			}
			if (flag)
			{
				sb.Append(tmpSb);
				return true;
			}
			backString.Append(tmpSb);
			if (thisChar != Eof)
			{
				backString.Append(thisChar);
			}
			return false;
		}

		public bool Tokenize(IList<Token> tokens)
		{
			lineNumber = 1;
			Token token;
			while (NextToken(out token))
			{
				if (token == null)
				{
					throw new NullReferenceException("StreamTokenizer: Tokenize: Got a null token from NextToken.");
				}
				tokens.Add(token);
			}
			tokens.Add(token);
			return true;
		}

		public bool TokenizeReader(TextReader tr, IList<Token> tokens)
		{
			textReader = tr;
			return Tokenize(tokens);
		}

		public bool TokenizeFile(string fileName, IList<Token> tokens)
		{
			FileInfo fileInfo = new FileInfo(fileName);
			FileStream fileStream = null;
			try
			{
				fileStream = fileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.None);
				textReader = new StreamReader(fileStream);
			}
			catch (DirectoryNotFoundException)
			{
			}
			try
			{
				if (!Tokenize(tokens))
				{
					textReader.Dispose();
					fileStream?.Dispose();
					return false;
				}
			}
			catch (StreamTokenizerUntermException ex2)
			{
				textReader.Dispose();
				fileStream?.Dispose();
				throw ex2;
			}
			if (textReader != null)
			{
				textReader.Dispose();
			}
			fileStream?.Dispose();
			return true;
		}

		public Token[] TokenizeFile(string fileName)
		{
			List<Token> list = new List<Token>();
			if (!TokenizeFile(fileName, list))
			{
				return null;
			}
			if (list.Count > 0)
			{
				return list.ToArray();
			}
			return null;
		}

		public bool TokenizeString(string str, IList<Token> tokens)
		{
			textReader = new StringReader(str);
			return Tokenize(tokens);
		}

		public bool TokenizeStream(Stream s, IList<Token> tokens)
		{
			textReader = new StreamReader(s);
			return Tokenize(tokens);
		}

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

		IEnumerator IEnumerable.GetEnumerator()
		{
			return GetEnumerator();
		}
	}
	public abstract class Token
	{
		private readonly int _lineNumber;

		protected object obj;

		private bool untermError;

		private string untermErrorMsg;

		public int LineNumber => _lineNumber;

		public object Object => obj;

		public bool UntermError
		{
			get
			{
				return untermError;
			}
			set
			{
				untermError = value;
			}
		}

		public string UntermErrorMsg
		{
			get
			{
				return untermErrorMsg;
			}
			set
			{
				untermError = true;
				untermErrorMsg = value;
			}
		}

		public virtual string StringValue => "unset";

		public Token(int line)
		{
			obj = null;
			untermError = false;
			_lineNumber = line;
		}

		public override bool Equals(object other)
		{
			if (other == null)
			{
				return false;
			}
			if (!(other is Token))
			{
				return false;
			}
			return obj.Equals(((Token)other).obj);
		}

		public bool Equals(string s)
		{
			if (s == null)
			{
				return false;
			}
			return StringValue.Equals(s);
		}

		public bool Equals(char c)
		{
			if (!(this is CharToken))
			{
				return false;
			}
			return (this as CharToken).Object.Equals(c);
		}

		public static bool operator ==(Token t, object o)
		{
			if ((object)t == null)
			{
				if (o == null)
				{
					return true;
				}
				return false;
			}
			if (o == null)
			{
				return false;
			}
			return t.Equals(o);
		}

		public static bool operator !=(Token t, object o)
		{
			if ((object)t == null)
			{
				if (o == null)
				{
					return false;
				}
				return true;
			}
			return !t.Equals(o);
		}

		public static bool operator ==(Token t, char c)
		{
			return t?.Equals(c) ?? false;
		}

		public static bool operator !=(Token t, char c)
		{
			if ((object)t == null)
			{
				return false;
			}
			return !t.Equals(c);
		}

		public static bool operator ==(Token t, string s)
		{
			if ((object)t == null)
			{
				if (s == null)
				{
					return true;
				}
				return false;
			}
			return t.Equals(s);
		}

		public static bool operator !=(Token t, string s)
		{
			if ((object)t == null)
			{
				if (s == null)
				{
					return false;
				}
				return true;
			}
			return !t.Equals(s);
		}

		public override int GetHashCode()
		{
			return ToString().GetHashCode();
		}

		public string ToLineString()
		{
			return $"{ToDebugString()}: line {_lineNumber}";
		}

		public virtual string ToDebugString()
		{
			return $"{ToString()}: line {_lineNumber}";
		}

		public object ConvertToType(Type t)
		{
			return Convert.ChangeType(StringValue, t, CultureInfo.InvariantCulture);
		}
	}
	public class EolToken : Token
	{
		public override string StringValue => ToString();

		public EolToken()
			: base(0)
		{
		}

		public EolToken(int line)
			: base(line)
		{
		}

		public override string ToDebugString()
		{
			return "Eol";
		}

		public override string ToString()
		{
			return "\n";
		}

		public override bool Equals(object other)
		{
			if (!(other is EolToken))
			{
				return false;
			}
			return true;
		}

		public override int GetHashCode()
		{
			return ToString().GetHashCode();
		}
	}
	public class EofToken : Token
	{
		public override string StringValue => ToString();

		public EofToken()
			: base(0)
		{
		}

		public EofToken(int line)
			: base(line)
		{
		}

		public override string ToString()
		{
			return string.Empty;
		}

		public override string ToDebugString()
		{
			return "Eof";
		}

		public override bool Equals(object other)
		{
			if (!(other is EofToken))
			{
				return false;
			}
			return true;
		}

		public override int GetHashCode()
		{
			return ToString().GetHashCode();
		}
	}
	public abstract class StringToken : Token
	{
		public override string StringValue => (string)obj;

		public StringToken(string s)
			: base(0)
		{
			obj = s;
		}

		public StringToken(string s, int line)
			: base(line)
		{
			obj = s;
		}

		public override string ToDebugString()
		{
			return GetType().Name + ":'" + (string)obj + "'";
		}

		public override string ToString()
		{
			return (string)obj;
		}

		public override int GetHashCode()
		{
			return ToString().GetHashCode();
		}
	}
	public class WordToken : StringToken
	{
		public WordToken(string s)
			: base(s)
		{
		}

		public WordToken(string s, int line)
			: base(s, line)
		{
		}
	}
	public class QuoteToken : StringToken
	{
		public QuoteToken(string s)
			: base(s)
		{
		}

		public QuoteToken(string s, int line)
			: base(s, line)
		{
		}
	}
	public class CommentToken : StringToken
	{
		public CommentToken(string s)
			: base(s)
		{
		}

		public CommentToken(string s, int line)
			: base(s, line)
		{
		}
	}
	public class WhitespaceToken : StringToken
	{
		public WhitespaceToken(string s)
			: base(s)
		{
		}

		public WhitespaceToken(string s, int line)
			: base(s, line)
		{
		}
	}
	public class CharToken : Token
	{
		public override string StringValue => $"{(char)obj}";

		public CharToken(string s, int line)
			: base(line)
		{
			if (s.Length > 0)
			{
				obj = s[0];
			}
		}

		public CharToken(char c)
			: base(0)
		{
			obj = c;
		}

		public CharToken(char c, int line)
			: base(line)
		{
			obj = c;
		}

		public override string ToDebugString()
		{
			return $"CharToken: {(char)obj}";
		}

		public override string ToString()
		{
			return $"{(char)obj}";
		}

		public override int GetHashCode()
		{
			return ToString().GetHashCode();
		}

		public override bool Equals(object other)
		{
			if (other == null)
			{
				return false;
			}
			if (!GetType().Equals(other.GetType()))
			{
				return false;
			}
			if (obj == null || ((CharToken)other).obj == null)
			{
				return false;
			}
			if (((char)obj).Equals((char)((CharToken)other).Object))
			{
				return true;
			}
			return false;
		}
	}
	public class FloatToken : Token
	{
		private NumberFormatInfo numberFormatInfo;

		public override string StringValue
		{
			get
			{
				if (obj != null)
				{
					return string.Format(GetNumberFormatInfo(), "{0:R}", (double)obj);
				}
				return $"null";
			}
		}

		private NumberFormatInfo GetNumberFormatInfo()
		{
			if (numberFormatInfo == null)
			{
				numberFormatInfo = new NumberFormatInfo();
				numberFormatInfo.NumberDecimalSeparator = ".";
			}
			return numberFormatInfo;
		}

		public FloatToken(string s)
			: base(0)
		{
			try
			{
				obj = double.Parse(s, GetNumberFormatInfo());
			}
			catch (Exception)
			{
				obj = null;
			}
		}

		public FloatToken(float f)
			: base(0)
		{
			try
			{
				obj = (double)f;
			}
			catch (Exception)
			{
				obj = null;
			}
		}

		public FloatToken(double d)
			: base(0)
		{
			try
			{
				obj = d;
			}
			catch (Exception)
			{
				obj = null;
			}
		}

		public FloatToken(string s, int line)
			: base(line)
		{
			try
			{
				obj = double.Parse(s, GetNumberFormatInfo());
			}
			catch (Exception)
			{
				obj = null;
			}
		}

		public FloatToken(double f, int line)
			: base(line)
		{
			try
			{
				obj = f;
			}
			catch (Exception)
			{
				obj = null;
			}
		}

		public override string ToDebugString()
		{
			if (obj != null)
			{
				return $"FloatToken: {(double)obj:R}";
			}
			return $"FloatToken: null";
		}

		public override string ToString()
		{
			if (obj != null)
			{
				return $"{(double)obj:R}";
			}
			return $"null";
		}

		public override int GetHashCode()
		{
			return ToString().GetHashCode();
		}

		public override bool Equals(object other)
		{
			if (other == null)
			{
				return false;
			}
			if (!GetType().Equals(other.GetType()))
			{
				return false;
			}
			if (obj == null || ((FloatToken)other).obj == null)
			{
				return false;
			}
			if (((double)obj).Equals((double)((FloatToken)other).Object))
			{
				return true;
			}
			return false;
		}
	}
	public class IntToken : Token
	{
		public override string StringValue
		{
			get
			{
				if (obj != null)
				{
					return $"{obj}";
				}
				return $"null";
			}
		}

		public IntToken(int i)
			: base(0)
		{
			obj = i;
		}

		public IntToken(long i)
			: base(0)
		{
			obj = i;
		}

		public IntToken(string s)
			: base(0)
		{
			Parse(s);
		}

		public IntToken(string s, int line)
			: base(line)
		{
			Parse(s);
		}

		public IntToken(int i, int line)
			: base(line)
		{
			obj = i;
		}

		public IntToken(long l, int line)
			: base(line)
		{
			obj = l;
		}

		public static IntToken ParseHex(string s, int lineNumber)
		{
			IntToken intToken = null;
			try
			{
				return new IntToken(Convert.ToInt32(s, 16), lineNumber);
			}
			catch
			{
				return new IntToken(Convert.ToInt64(s, 16), lineNumber);
			}
		}

		private void Parse(string s)
		{
			if (int.TryParse(s, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out var result))
			{
				base.obj = result;
				return;
			}
			if (long.TryParse(s, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out var result2))
			{
				base.obj = result2;
				return;
			}
			int[] array = new int[3] { 16, 2, 8 };
			foreach (int fromBase in array)
			{
				try
				{
					base.obj = Convert.ToInt32(s, fromBase);
					return;
				}
				catch
				{
					try
					{
						base.obj = Convert.ToInt64(s, fromBase);
						return;
					}
					catch
					{
					}
				}
			}
			base.obj = null;
		}

		public override string ToDebugString()
		{
			if (obj != null)
			{
				return $"IntToken: {obj}";
			}
			return $"IntToken: null";
		}

		public override string ToString()
		{
			if (obj != null)
			{
				return $"{obj}";
			}
			return $"null";
		}

		public override int GetHashCode()
		{
			return ToString().GetHashCode();
		}

		public override bool Equals(object other)
		{
			if (other == null)
			{
				return false;
			}
			if (!GetType().Equals(other.GetType()))
			{
				return false;
			}
			if (obj == null || ((IntToken)other).obj == null)
			{
				return false;
			}
			if (!obj.GetType().Equals(((IntToken)other).obj.GetType()))
			{
				return false;
			}
			if (obj is int)
			{
				if (((int)obj).Equals((int)((IntToken)other).Object))
				{
					return true;
				}
			}
			else if (((long)obj).Equals((long)((IntToken)other).Object))
			{
				return true;
			}
			return false;
		}
	}
	public enum VerbosityLevel
	{
		Error,
		Warn,
		Info,
		Debug
	}
}
namespace NetTopologySuite
{
	public class NtsGeometryServices
	{
		private readonly struct GeometryFactoryKey : IEquatable<GeometryFactoryKey>
		{
			public PrecisionModel PrecisionModel { get; }

			public NetTopologySuite.Algorithm.ElevationModel ElevationModel { get; }

			public CoordinateSequenceFactory CoordinateSequenceFactory { get; }

			public int SRID { get; }

			public GeometryFactoryKey(PrecisionModel precisionModel, NetTopologySuite.Algorithm.ElevationModel elevationModel, int srid, CoordinateSequenceFactory factory)
			{
				PrecisionModel = precisionModel;
				ElevationModel = elevationModel;
				CoordinateSequenceFactory = factory;
				SRID = srid;
			}

			public override int GetHashCode()
			{
				return (PrecisionModel, CoordinateSequenceFactory, SRID, ElevationModel).GetHashCode();
			}

			public override bool Equals(object obj)
			{
				if (obj is GeometryFactoryKey other)
				{
					return Equals(other);
				}
				return false;
			}

			public bool Equals(GeometryFactoryKey other)
			{
				if (SRID == other.SRID && object.Equals(CoordinateSequenceFactory, other.CoordinateSequenceFactory) && object.Equals(PrecisionModel, other.PrecisionModel))
				{
					return object.Equals(ElevationModel, other.ElevationModel);
				}
				return false;
			}
		}

		private static volatile NtsGeometryServices s_instance = new NtsGeometryServices();

		[NonSerialized]
		private readonly ConcurrentDictionary<GeometryFactoryKey, GeometryFactory> m_factories = new ConcurrentDictionary<GeometryFactoryKey, GeometryFactory>();

		public static NtsGeometryServices Instance
		{
			get
			{
				return s_instance;
			}
			set
			{
				s_instance = value ?? throw new ArgumentNullException("value");
			}
		}

		public GeometryOverlay GeometryOverlay { get; }

		public GeometryRelate GeometryRelate { get; }

		public CoordinateEqualityComparer CoordinateEqualityComparer { get; }

		public int DefaultSRID { get; }

		public CoordinateSequenceFactory DefaultCoordinateSequenceFactory { get; }

		public PrecisionModel DefaultPrecisionModel { get; }

		public NetTopologySuite.Algorithm.ElevationModel DefaultElevationModel { get; }

		internal int NumFactories => m_factories.Count;

		public NtsGeometryServices()
			: this(GeometryOverlay.Legacy)
		{
		}

		public NtsGeometryServices(GeometryOverlay geometryOverlay)
			: this(CoordinateArraySequenceFactory.Instance, PrecisionModel.Floating.Value, -1, geometryOverlay, new CoordinateEqualityComparer())
		{
		}

		public NtsGeometryServices(GeometryRelate geometryRelate)
			: this(CoordinateArraySequenceFactory.Instance, PrecisionModel.Floating.Value, -1, GeometryOverlay.Legacy, geometryRelate, new CoordinateEqualityComparer())
		{
		}

		public NtsGeometryServices(GeometryOverlay geometryOverlay, GeometryRelate geometryRelate)
			: this(CoordinateArraySequenceFactory.Instance, PrecisionModel.Floating.Value, -1, geometryOverlay, geometryRelate, new CoordinateEqualityComparer())
		{
		}

		public NtsGeometryServices(PrecisionModel precisionModel)
			: this(CoordinateArraySequenceFactory.Instance, precisionModel, -1, GeometryOverlay.Legacy, new CoordinateEqualityComparer())
		{
		}

		public NtsGeometryServices(PrecisionModel precisionModel, int srid)
			: this(CoordinateArraySequenceFactory.Instance, precisionModel, srid, GeometryOverlay.Legacy, new CoordinateEqualityComparer())
		{
		}

		public NtsGeometryServices(CoordinateSequenceFactory coordinateSequenceFactory)
			: this(coordinateSequenceFactory, PrecisionModel.Floating.Value, -1, GeometryOverlay.Legacy, new CoordinateEqualityComparer())
		{
		}

		public NtsGeometryServices(CoordinateSequenceFactory coordinateSequenceFactory, PrecisionModel precisionModel, int srid)
			: this(coordinateSequenceFactory, precisionModel, srid, GeometryOverlay.Legacy, new CoordinateEqualityComparer())
		{
		}

		public NtsGeometryServices(CoordinateSequenceFactory coordinateSequenceFactory, PrecisionModel precisionModel, int srid, GeometryOverlay geometryOverlay, CoordinateEqualityComparer coordinateEqualityComparer)
			: this(coordinateSequenceFactory, precisionModel, srid, geometryOverlay, GeometryRelate.Legacy, coordinateEqualityComparer)
		{
		}

		public NtsGeometryServices(CoordinateSequenceFactory coordinateSequenceFactory, PrecisionModel precisionModel, int srid, GeometryOverlay geometryOverlay, GeometryRelate geometryRelate, CoordinateEqualityComparer coordinateEqualityComparer)
			: this(coordinateSequenceFactory, precisionModel, srid, geometryOverlay, geometryRelate, coordinateEqualityComparer, null)
		{
		}

		public NtsGeometryServices(CoordinateSequenceFactory coordinateSequenceFactory, PrecisionModel precisionModel, int srid, GeometryOverlay geometryOverlay, GeometryRelate geometryRelate, CoordinateEqualityComparer coordinateEqualityComparer, NetTopologySuite.Algorithm.ElevationModel elevationModel)
		{
			DefaultCoordinateSequenceFactory = coordinateSequenceFactory ?? throw new ArgumentNullException("coordinateSequenceFactory");
			DefaultPrecisionModel = precisionModel ?? throw new ArgumentNullException("precisionModel");
			DefaultSRID = srid;
			DefaultElevationModel = elevationModel;
			GeometryOverlay = geometryOverlay ?? throw new ArgumentNullException("geometryOverlay");
			GeometryRelate = geometryRelate ?? throw new ArgumentNullException("geometryRelate");
			CoordinateEqualityComparer = coordinateEqualityComparer ?? throw new ArgumentNullException("coordinateEqualityComparer");
		}

		[Obsolete("Will be removed in a future version")]
		public PrecisionModel CreatePrecisionModel(PrecisionModels modelType)
		{
			return new PrecisionModel(modelType);
		}

		[Obsolete("Will be removed in a future version")]
		public PrecisionModel CreatePrecisionModel(PrecisionModel precisionModel)
		{
			return new PrecisionModel(precisionModel);
		}

		[Obsolete("Will be removed in a future version")]
		public PrecisionModel CreatePrecisionModel(double scale)
		{
			return new PrecisionModel(scale);
		}

		public GeometryFactory CreateGeometryFactory()
		{
			return CreateGeometryFactory(DefaultSRID);
		}

		public GeometryFactory CreateGeometryFactory(int srid)
		{
			return CreateGeometryFactory(DefaultPrecisionModel, srid, DefaultCoordinateSequenceFactory);
		}

		public GeometryFactory CreateGeometryFactory(CoordinateSequenceFactory coordinateSequenceFactory)
		{
			return CreateGeometryFactory(DefaultPrecisionModel, DefaultSRID, coordinateSequenceFactory);
		}

		public GeometryFactory CreateGeometryFactory(PrecisionModel precisionModel)
		{
			return CreateGeometryFactory(precisionModel, DefaultSRID, DefaultCoordinateSequenceFactory);
		}

		public GeometryFactory CreateGeometryFactory(PrecisionModel precisionModel, int srid)
		{
			return CreateGeometryFactory(precisionModel, srid, DefaultCoordinateSequenceFactory);
		}

		public GeometryFactory CreateGeometryFactory(PrecisionModel precisionModel, int srid, CoordinateSequenceFactory coordinateSequenceFactory)
		{
			return CreateGeometryFactory(precisionModel, DefaultElevationModel, srid, coordinateSequenceFactory);
		}

		public GeometryFactory CreateGeometryFactory(PrecisionModel precisionModel, NetTopologySuite.Algorithm.ElevationModel elevationModel, int srid, CoordinateSequenceFactory coordinateSequenceFactory)
		{
			if ((object)precisionModel == null)
			{
				throw new ArgumentNullException("precisionModel");
			}
			if (coordinateSequenceFactory == null)
			{
				throw new ArgumentNullException("coordinateSequenceFactory");
			}
			return m_factories.GetOrAdd(new GeometryFactoryKey(precisionModel, elevationModel, srid, coordinateSequenceFactory), (GeometryFactoryKey key) => CreateGeometryFactoryCore(key.PrecisionModel, key.ElevationModel, key.SRID, key.CoordinateSequenceFactory));
		}

		protected virtual GeometryFactory CreateGeometryFactoryCore(PrecisionModel precisionModel, int srid, CoordinateSequenceFactory coordinateSequenceFactory)
		{
			return CreateGeometryFactoryCore(precisionModel, null, srid, coordinateSequenceFactory);
		}

		protected virtual GeometryFactory CreateGeometryFactoryCore(PrecisionModel precisionModel, NetTopologySuite.Algorithm.ElevationModel elevationModel, int srid, CoordinateSequenceFactory coordinateSequenceFactory)
		{
			return new GeometryFactory(precisionModel, elevationModel, srid, coordinateSequenceFactory, this);
		}
	}
}
namespace NetTopologySuite.Utilities
{
	public sealed class AlternativePriorityQueue<TPriority, TData> : IEnumerable<PriorityQueueNode<TPriority, TData>>, IEnumerable
	{
		private const int DefaultCapacity = 4;

		private readonly List<PriorityQueueNode<TPriority, TData>> nodes;

		private readonly IComparer<TPriority> priorityComparer;

		public int Count { get; private set; }

		public PriorityQueueNode<TPriority, TData> Head => nodes[1];

		public AlternativePriorityQueue()
			: this(4)
		{
		}

		public AlternativePriorityQueue(int capacity)
			: this(capacity, (IComparer<TPriority>)null)
		{
		}

		public AlternativePriorityQueue(IComparer<TPriority> priorityComparer)
			: this(4, priorityComparer)
		{
		}

		public AlternativePriorityQueue(int capacity, IComparer<TPriority> priorityComparer)
		{
			if (capacity < 1)
			{
				throw new ArgumentOutOfRangeException("capacity", "Capacity must be greater than zero.");
			}
			nodes = new List<PriorityQueueNode<TPriority, TData>>(capacity + 1);
			for (int i = 0; i <= capacity; i++)
			{
				nodes.Add(null);
			}
			Count = 0;
			this.priorityComparer = priorityComparer ?? Comparer<TPriority>.Default;
		}

		public AlternativePriorityQueue(AlternativePriorityQueue<TPriority, TData> copyFrom)
		{
			if (copyFrom == null)
			{
				throw new ArgumentNullException("copyFrom");
			}
			nodes = new List<PriorityQueueNode<TPriority, TData>>(copyFrom.nodes.Count);
			priorityComparer = copyFrom.priorityComparer;
			for (int i = 0; i < copyFrom.nodes.Count; i++)
			{
				PriorityQueueNode<TPriority, TData> priorityQueueNode = copyFrom.nodes[i];
				PriorityQueueNode<TPriority, TData> item = ((priorityQueueNode == null) ? null : new PriorityQueueNode<TPriority, TData>(priorityQueueNode));
				nodes.Add(item);
			}
		}

		public void Clear()
		{
			nodes.Clear();
			nodes.Add(null);
			nodes.Add(null);
			Count = 0;
		}

		public bool Contains(PriorityQueueNode<TPriority, TData> node)
		{
			if (node != null && node.QueueIndex < nodes.Count)
			{
				return nodes[node.QueueIndex] == node;
			}
			return false;
		}

		public void Enqueue(PriorityQueueNode<TPriority, TData> node, TPriority priority)
		{
			if (node == null)
			{
				throw new ArgumentNullException("node");
			}
			node.Priority = priority;
			node.QueueIndex = ++Count;
			if (nodes.Count <= Count)
			{
				nodes.Add(null);
			}
			nodes[Count] = node;
			HeapifyUp(nodes[Count]);
		}

		public PriorityQueueNode<TPriority, TData> Dequeue()
		{
			PriorityQueueNode<TPriority, TData> head = Head;
			Remove(head);
			return head;
		}

		public void ChangePriority(PriorityQueueNode<TPriority, TData> node, TPriority priority)
		{
			if (node == null)
			{
				throw new ArgumentNullException("node");
			}
			node.Priority = priority;
			OnNodeUpdated(node);
		}

		public bool Remove(PriorityQueueNode<TPriority, TData> node)
		{
			if (!Contains(node))
			{
				return false;
			}
			if (Count <= 1)
			{
				nodes[1] = null;
				Count = 0;
				return true;
			}
			bool flag = false;
			PriorityQueueNode<TPriority, TData> priorityQueueNode = nodes[Count];
			if (node.QueueIndex != Count)
			{
				Swap(node, priorityQueueNode);
				flag = true;
			}
			int count = Count - 1;
			Count = count;
			nodes[node.QueueIndex] = null;
			if (flag)
			{
				OnNodeUpdated(priorityQueueNode);
			}
			return true;
		}

		public IEnumerator<PriorityQueueNode<TPriority, TData>> GetEnumerator()
		{
			return nodes.Skip(1).Take(Count).GetEnumerator();
		}

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

		private void HeapifyUp(PriorityQueueNode<TPriority, TData> node)
		{
			int num = node.QueueIndex / 2;
			while (num >= 1)
			{
				PriorityQueueNode<TPriority, TData> priorityQueueNode = nodes[num];
				if (!HasHigherPriority(priorityQueueNode, node))
				{
					Swap(node, priorityQueueNode);
					num = node.QueueIndex / 2;
					continue;
				}
				break;
			}
		}

		private void HeapifyDown(PriorityQueueNode<TPriority, TData> node)
		{
			int num = node.QueueIndex;
			while (true)
			{
				PriorityQueueNode<TPriority, TData> priorityQueueNode = node;
				int num2 = 2 * num;
				if (num2 > Count)
				{
					node.QueueIndex = num;
					nodes[num] = node;
					return;
				}
				PriorityQueueNode<TPriority, TData> priorityQueueNode2 = nodes[num2];
				if (HasHigherPriority(priorityQueueNode2, priorityQueueNode))
				{
					priorityQueueNode = priorityQueueNode2;
				}
				int num3 = num2 + 1;
				if (num3 <= Count)
				{
					PriorityQueueNode<TPriority, TData> priorityQueueNode3 = nodes[num3];
					if (HasHigherPriority(priorityQueueNode3, priorityQueueNode))
					{
						priorityQueueNode = priorityQueueNode3;
					}
				}
				if (priorityQueueNode == node)
				{
					break;
				}
				nodes[num] = priorityQueueNode;
				int queueIndex = priorityQueueNode.QueueIndex;
				priorityQueueNode.QueueIndex = num;
				num = queueIndex;
			}
			node.QueueIndex = num;
			nodes[num] = node;
		}

		private void OnNodeUpdated(PriorityQueueNode<TPriority, TData> node)
		{
			int num = node.QueueIndex / 2;
			PriorityQueueNode<TPriority, TData> lower = nodes[num];
			if (num > 0 && HasHigherPriority(node, lower))
			{
				HeapifyUp(node);
			}
			else
			{
				HeapifyDown(node);
			}
		}

		private void Swap(PriorityQueueNode<TPriority, TData> node1, PriorityQueueNode<TPriority, TData> node2)
		{
			nodes[node1.QueueIndex] = node2;
			nodes[node2.QueueIndex] = node1;
			int queueIndex = node1.QueueIndex;
			node1.QueueIndex = node2.QueueIndex;
			node2.QueueIndex = queueIndex;
		}

		private bool HasHigherPriority(PriorityQueueNode<TPriority, TData> higher, PriorityQueueNode<TPriority, TData> lower)
		{
			return priorityComparer.Compare(higher.Priority, lower.Priority) < 0;
		}
	}
	public static class Assert
	{
		public static void IsTrue(bool assertion)
		{
			IsTrue(assertion, null);
		}

		public static void IsTrue(bool assertion, string message)
		{
			if (assertion)
			{
				return;
			}
			if (message == null)
			{
				throw new AssertionFailedException();
			}
			throw new AssertionFailedException(message);
		}

		public static void IsEquals(object expectedValue, object actualValue)
		{
			IsEquals(expectedValue, actualValue, null);
		}

		public static void IsEquals(object expectedValue, object actualValue, string message)
		{
			if (actualValue.Equals(expectedValue))
			{
				return;
			}
			string arg = ((message != null) ? (": " + message) : string.Empty);
			throw new AssertionFailedException(string.Format(CultureInfo.InvariantCulture, "Expected {0} but encountered {1}{2}", expectedValue, actualValue, arg));
		}

		public static void ShouldNeverReachHere()
		{
			ShouldNeverReachHere(null);
		}

		public static void ShouldNeverReachHere(string message)
		{
			string arg = ((message != null) ? (": " + message) : string.Empty);
			throw new AssertionFailedException($"Should never reach here{arg}");
		}
	}
	public class AssertionFailedException : ApplicationException
	{
		public AssertionFailedException()
		{
		}

		public AssertionFailedException(string message)
			: base(message)
		{
		}
	}
	internal static class BitTweaks
	{
		internal static short ReverseByteOrder(short value)
		{
			return (short)ReverseByteOrder((ushort)value);
		}

		internal static int ReverseByteOrder(int value)
		{
			return (int)ReverseByteOrder((uint)value);
		}

		internal static long ReverseByteOrder(long value)
		{
			return (long)ReverseByteOrder((ulong)value);
		}

		internal static float ReverseByteOrder(float value)
		{
			byte[] bytes = BitConverter.GetBytes(value);
			Array.Reverse((Array)bytes, 0, 4);
			return BitConverter.ToSingle(bytes, 0);
		}

		internal static double ReverseByteOrder(double value)
		{
			return BitConverter.Int64BitsToDouble(ReverseByteOrder(BitConverter.DoubleToInt64Bits(value)));
		}

		internal static ushort ReverseByteOrder(ushort value)
		{
			return (ushort)(((value & 0xFF) << 8) | ((value & 0xFF00) >> 8));
		}

		internal static uint ReverseByteOrder(uint value)
		{
			return ((value & 0xFF) << 24) | ((value & 0xFF00) << 8) | ((value & 0xFF0000) >> 8) | ((value & 0xFF000000u) >> 24);
		}

		internal static ulong ReverseByteOrder(ulong value)
		{
			return ((value & 0xFF) << 56) | ((value & 0xFF00) << 40) | ((value & 0xFF0000) << 24) | ((value & 0xFF000000u) << 8) | ((value & 0xFF00000000L) >> 8) | ((value & 0xFF0000000000L) >> 24) | ((value & 0xFF000000000000L) >> 40) | ((value & 0xFF00000000000000uL) >> 56);
		}
	}
	public class CoordinateArrayFilter : ICoordinateFilter
	{
		private readonly Coordinate[] _pts;

		private int _n;

		public Coordinate[] Coordinates => _pts;

		public CoordinateArrayFilter(int size)
		{
			_pts = new Coordinate[size];
		}

		public void Filter(Coordinate coord)
		{
			_pts[_n++] = coord;
		}
	}
	public class CoordinateCompare : IComparer
	{
		public int Compare(object x, object y)
		{
			if (x is Coordinate && y is Coordinate)
			{
				Coordinate coordinate = (Coordinate)x;
				Coordinate coordinate2 = (Coordinate)y;
				if (coordinate.X < coordinate2.X)
				{
					return -1;
				}
				if (coordinate.X > coordinate2.X)
				{
					return 1;
				}
				if (coordinate.Y < coordinate2.Y)
				{
					return -1;
				}
				if (coordinate.Y > coordinate2.Y)
				{
					return 1;
				}
				return 0;
			}
			throw new ArgumentException("Wrong arguments type: Coordinate expected");
		}
	}
	public class CoordinateCountFilter : ICoordinateFilter
	{
		private int _n;

		public int Count => _n;

		public void Filter(Coordinate coord)
		{
			_n++;
		}
	}
	public class Degrees
	{
		public static double ToRadians(double degrees)
		{
			return degrees * (Math.PI / 180.0);
		}
	}
	[Obsolete]
	public static class EnumUtility
	{
		public static object Parse(Type type, string value)
		{
			return Enum.Parse(type, value, ignoreCase: false);
		}

		public static string Format(Type type, object value, string formatString)
		{
			return Enum.Format(type, value, formatString);
		}
	}
	public class FunctionsUtil
	{
		public static readonly Envelope DefaultEnvelope = new Envelope(0.0, 100.0, 0.0, 100.0);

		private static readonly GeometryFactory Factory = new GeometryFactory();

		public static Envelope GetEnvelopeOrDefault(Geometry g)
		{
			if (!(g == null))
			{
				return g.EnvelopeInternal;
			}
			return DefaultEnvelope;
		}

		public static GeometryFactory GetFactoryOrDefault(Geometry g)
		{
			if (!(g == null))
			{
				return g.Factory;
			}
			return Factory;
		}

		public static GeometryFactory GetFactoryOrDefault(IEnumerable<Geometry> gs)
		{
			if (gs == null)
			{
				return Factory;
			}
			foreach (Geometry g in gs)
			{
				if (g != null)
				{
					return g.Factory ?? Factory;
				}
			}
			return Factory;
		}

		[Obsolete]
		public static Geometry BuildGeometry(List<Geometry> geoms, Geometry parentGeom)
		{
			return BuildGeometry((IList<Geometry>)geoms, parentGeom);
		}

		public static Geometry BuildGeometry(IList<Geometry> geoms, Geometry parentGeom)
		{
			if (geoms.Count <= 0)
			{
				return null;
			}
			if (geoms.Count == 1)
			{
				return geoms[0];
			}
			if (parentGeom != null && parentGeom.OgcGeometryType == OgcGeometryType.GeometryCollection)
			{
				return parentGeom.Factory.CreateGeometryCollection(GeometryFactory.ToGeometryArray(geoms));
			}
			return GetFactoryOrDefault(geoms).BuildGeometry(geoms);
		}

		public static Geometry BuildGeometry(params Geometry[] geoms)
		{
			return GetFactoryOrDefault(geoms).CreateGeometryCollection(geoms);
		}

		public static Geometry BuildGeometry(Geometry a, Geometry b)
		{
			int num = 0;
			if (a != null)
			{
				num++;
			}
			if (b != null)
			{
				num++;
			}
			Geometry[] array = new Geometry[num];
			num = 0;
			if (a != null)
			{
				array[num++] = a;
			}
			if (b != null)
			{
				array[num] = b;
			}
			return GetFactoryOrDefault(array).CreateGeometryCollection(array);
		}
	}
	public class GeometricShapeFactory
	{
		protected class Dimensions
		{
			private Coordinate _base;

			private Coordinate _centre;

			private double _width;

			private double _height;

			public Coordinate Base
			{
				get
				{
					return _base;
				}
				set
				{
					_base = value;
				}
			}

			public Coordinate Centre
			{
				get
				{
					if (_centre == null)
					{
						_centre = ((Base != null) ? new Coordinate(Base.X + Width * 0.5, Base.Y + Height * 0.5) : new Coordinate(0.0, 0.0));
					}
					return _centre;
				}
				set
				{
					_centre = value;
				}
			}

			public double Width
			{
				get
				{
					return _width;
				}
				set
				{
					_width = value;
				}
			}

			public double Height
			{
				get
				{
					return _height;
				}
				set
				{
					_height = value;
				}
			}

			public double Size
			{
				set
				{
					Height = value;
					Width = value;
				}
			}

			public double MinSize => Math.Min(Width, Height);

			public Envelope Envelope
			{
				get
				{
					if (Base != null)
					{
						return new Envelope(Base.X, Base.X + Width, Base.Y, Base.Y + Height);
					}
					if (Centre != null)
					{
						return new Envelope(Centre.X - Width / 2.0, Centre.X + Width / 2.0, Centre.Y - Height / 2.0, Centre.Y + Height / 2.0);
					}
					return new Envelope(0.0, Width, 0.0, Height);
				}
				set
				{
					_width = value.Width;
					_height = value.Height;
					_base = new Coordinate(value.MinX, value.MinY);
					_centre = value.Centre.Copy();
				}
			}
		}

		protected GeometryFactory GeomFact;

		protected PrecisionModel PrecModel;

		private readonly Dimensions _dim = new Dimensions();

		private int _nPts = 100;

		private double _rotationAngle;

		public Coordinate Base
		{
			set
			{
				_dim.Base = value;
			}
		}

		public Coordinate Centre
		{
			set
			{
				_dim.Centre = value;
			}
		}

		public Envelope Envelope
		{
			get
			{
				return _dim.Envelope;
			}
			set
			{
				_dim.Envelope = value;
			}
		}

		public int NumPoints
		{
			get
			{
				return _nPts;
			}
			set
			{
				_nPts = value;
			}
		}

		public double Size
		{
			set
			{
				_dim.Size = value;
			}
		}

		public double Width
		{
			get
			{
				return _dim.Width;
			}
			set
			{
				_dim.Width = value;
			}
		}

		public double Height
		{
			get
			{
				return _dim.Height;
			}
			set
			{
				_dim.Height = value;
			}
		}

		public double Rotation
		{
			get
			{
				return _rotationAngle;
			}
			set
			{
				_rotationAngle = value;
			}
		}

		public GeometricShapeFactory()
			: this(new GeometryFactory())
		{
		}

		public GeometricShapeFactory(GeometryFactory geomFact)
		{
			GeomFact = geomFact;
			PrecModel = geomFact.PrecisionModel;
		}

		protected Geometry Rotate(Geometry geom)
		{
			if (_rotationAngle != 0.0)
			{
				Coordinate centre = _dim.Centre;
				AffineTransformation filter = AffineTransformation.RotationInstance(_rotationAngle, centre.X, centre.Y);
				geom.Apply(filter);
			}
			return geom;
		}

		protected Coordinate CreateCoord(double x, double y)
		{
			Coordinate coordinate = new Coordinate(x, y);
			PrecModel.MakePrecise(coordinate);
			return coordinate;
		}

		protected Coordinate CreateCoordTrans(double x, double y, Coordinate trans)
		{
			return CreateCoord(x + trans.X, y + trans.Y);
		}

		public Polygon CreateRectangle()
		{
			int num = 0;
			int num2 = _nPts / 4;
			if (num2 < 1)
			{
				num2 = 1;
			}
			double num3 = _dim.Envelope.Width / (double)num2;
			double num4 = _dim.Envelope.Height / (double)num2;
			Coordinate[] array = new Coordinate[4 * num2 + 1];
			Envelope envelope = _dim.Envelope;
			for (int i = 0; i < num2; i++)
			{
				double x = envelope.MinX + (double)i * num3;
				double minY = envelope.MinY;
				array[num++] = CreateCoord(x, minY);
			}
			for (int i = 0; i < num2; i++)
			{
				double maxX = envelope.MaxX;
				double y = envelope.MinY + (double)i * num4;
				array[num++] = CreateCoord(maxX, y);
			}
			for (int i = 0; i < num2; i++)
			{
				double x2 = envelope.MaxX - (double)i * num3;
				double maxY = envelope.MaxY;
				array[num++] = CreateCoord(x2, maxY);
			}
			for (int i = 0; i < num2; i++)
			{
				double minX = envelope.MinX;
				double y2 = envelope.MaxY - (double)i * num4;
				array[num++] = CreateCoord(minX, y2);
			}
			array[num] = array[0].Copy();
			LinearRing shell = GeomFact.CreateLinearRing(array);
			Polygon geom = GeomFact.CreatePolygon(shell);
			return (Polygon)Rotate(geom);
		}

		public Polygon CreateCircle()
		{
			Envelope envelope = _dim.Envelope;
			double num = envelope.Width / 2.0;
			double num2 = envelope.Height / 2.0;
			double num3 = envelope.MinX + num;
			double num4 = envelope.MinY + num2;
			Coordinate[] array = new Coordinate[_nPts + 1];
			int num5 = 0;
			for (int i = 0; i < _nPts; i++)
			{
				double ang = (double)i * (Math.PI * 2.0 / (double)_nPts);
				double x = num * AngleUtility.CosSnap(ang) + num3;
				double y = num2 * AngleUtility.SinSnap(ang) + num4;
				Coordinate coordinate = CreateCoord(x, y);
				array[num5++] = coordinate;
			}
			array[num5] = array[0];
			LinearRing shell = GeomFact.CreateLinearRing(array);
			Polygon geom = GeomFact.CreatePolygon(shell);
			return (Polygon)Rotate(geom);
		}

		public Polygon CreateEllipse()
		{
			Envelope envelope = _dim.Envelope;
			double num = envelope.Width / 2.0;
			double num2 = envelope.Height / 2.0;
			double num3 = envelope.MinX + num;
			double num4 = envelope.MinY + num2;
			Coordinate[] array = new Coordinate[_nPts + 1];
			int num5 = 0;
			for (int i = 0; i < _nPts; i++)
			{
				double num6 = (double)i * (Math.PI * 2.0 / (double)_nPts);
				double x = num * Math.Cos(num6) + num3;
				double y = num2 * Math.Sin(num6) + num4;
				array[num5++] = CreateCoord(x, y);
			}
			array[num5] = array[0].Copy();
			LinearRing shell = GeomFact.CreateLinearRing(array);
			Polygon geom = GeomFact.CreatePolygon(shell);
			return (Polygon)Rotate(geom);
		}

		public Polygon CreateSquircle()
		{
			return CreateSupercircle(4.0);
		}

		public Polygon CreateSupercircle(double power)
		{
			double y = 1.0 / power;
			double num = _dim.MinSize / 2.0;
			Coordinate centre = _dim.Centre;
			double num2 = Math.Pow(num, power);
			double num3 = num;
			double num4 = Math.Pow(num2 / 2.0, y);
			int num5 = _nPts / 8;
			Coordinate[] array = new Coordinate[num5 * 8 + 1];
			double num6 = num4 / (double)num5;
			for (int i = 0; i <= num5; i++)
			{
				double num7 = 0.0;
				double num8 = num3;
				if (i != 0)
				{
					num7 = num6 * (double)i;
					double num9 = Math.Pow(num7, power);
					num8 = Math.Pow(num2 - num9, y);
				}
				array[i] = CreateCoordTrans(num7, num8, centre);
				array[2 * num5 - i] = CreateCoordTrans(num8, num7, centre);
				array[2 * num5 + i] = CreateCoordTrans(num8, 0.0 - num7, centre);
				array[4 * num5 - i] = CreateCoordTrans(num7, 0.0 - num8, centre);
				array[4 * num5 + i] = CreateCoordTrans(0.0 - num7, 0.0 - num8, centre);
				array[6 * num5 - i] = CreateCoordTrans(0.0 - num8, 0.0 - num7, centre);
				array[6 * num5 + i] = CreateCoordTrans(0.0 - num8, num7, centre);
				array[8 * num5 - i] = CreateCoordTrans(0.0 - num7, num8, centre);
			}
			array[^1] = array[0].Copy();
			LinearRing shell = GeomFact.CreateLinearRing(array);
			Polygon geom = GeomFact.CreatePolygon(shell);
			return (Polygon)Rotate(geom);
		}

		public LineString CreateArc(double startAng, double angExtent)
		{
			Envelope envelope = _dim.Envelope;
			double num = envelope.Width / 2.0;
			double num2 = envelope.Height / 2.0;
			double num3 = envelope.MinX + num;
			double num4 = envelope.MinY + num2;
			double num5 = angExtent;
			if (num5 <= 0.0 || num5 > Math.PI * 2.0)
			{
				num5 = Math.PI * 2.0;
			}
			double num6 = num5 / (double)(_nPts - 1);
			Coordinate[] array = new Coordinate[_nPts];
			int num7 = 0;
			for (int i = 0; i < _nPts; i++)
			{
				double ang = startAng + (double)i * num6;
				double x = num * AngleUtility.CosSnap(ang) + num3;
				double y = num2 * AngleUtility.SinSnap(ang) + num4;
				Coordinate coordinate = CreateCoord(x, y);
				array[num7++] = coordinate;
			}
			LineString geom = GeomFact.CreateLineString(array);
			return (LineString)Rotate(geom);
		}

		public Polygon CreateArcPolygon(double startAng, double angExtent)
		{
			Envelope envelope = _dim.Envelope;
			double num = envelope.Width / 2.0;
			double num2 = envelope.Height / 2.0;
			double num3 = envelope.MinX + num;
			double num4 = envelope.MinY + num2;
			double num5 = angExtent;
			if (num5 <= 0.0 || num5 > Math.PI * 2.0)
			{
				num5 = Math.PI * 2.0;
			}
			double num6 = num5 / (double)(_nPts - 1);
			Coordinate[] array = new Coordinate[_nPts + 2];
			int num7 = 0;
			array[num7++] = CreateCoord(num3, num4);
			for (int i = 0; i < _nPts; i++)
			{
				double ang = startAng + num6 * (double)i;
				double x = num * AngleUtility.CosSnap(ang) + num3;
				double y = num2 * AngleUtility.SinSnap(ang) + num4;
				array[num7++] = CreateCoord(x, y);
			}
			array[num7] = CreateCoord(num3, num4);
			LinearRing shell = GeomFact.CreateLinearRing(array);
			Polygon geom = GeomFact.CreatePolygon(shell);
			return (Polygon)Rotate(geom);
		}
	}
	public sealed class Global
	{
		private readonly NumberFormatInfo _nfi;

		private static readonly Global global = new Global();

		private Global()
		{
			_nfi = new NumberFormatInfo();
			_nfi.NumberDecimalSeparator = ".";
		}

		public static NumberFormatInfo GetNfi()
		{
			return global._nfi;
		}
	}
	[Obsolete]
	public static class Guard
	{
		public static void IsNotNull(object candidate, string propertyName)
		{
			if (candidate == null)
			{
				throw new ArgumentNullException(propertyName);
			}
		}
	}
	public class HexConverter
	{
		private HexConverter()
		{
		}

		public static string ConvertAny2Any(string valueIn, int baseIn, int baseOut)
		{
			string result = "Error";
			valueIn = valueIn.ToUpper();
			if (baseIn < 2 || baseIn > 36 || baseOut < 2 || baseOut > 36)
			{
				return result;
			}
			if (valueIn.Trim().Length == 0)
			{
				return result;
			}
			if (baseIn == baseOut)
			{
				return valueIn;
			}
			double num = 0.0;
			try
			{
				if (baseIn == 10)
				{
					num = double.Parse(valueIn);
				}
				else
				{
					char[] array = valueIn.ToCharArray();
					int num2 = array.Length;
					for (int i = 0; i < array.Length; i++)
					{
						int num3 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".IndexOf(array[i]);
						if (num3 < 0 || num3 > baseIn - 1)
						{
							return result;
						}
						num2--;
						num += (double)num3 * Math.Pow(baseIn, num2);
					}
				}
				if (baseOut == 10)
				{
					result = num.ToString();
				}
				else
				{
					result = string.Empty;
					while (num > 0.0)
					{
						int num4 = (int)(num % (double)baseOut);
						num = (num - (double)num4) / (double)baseOut;
						result = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(num4, 1) + result;
					}
				}
			}
			catch (Exception ex)
			{
				result = ex.Message;
			}
			return result;
		}
	}
	public class Memory
	{
		public const double KB = 1024.0;

		public const double MB = 1048576.0;

		public const double GB = 1073741824.0;

		public static long Total => GC.GetTotalMemory(forceFullCollection: true);

		public static string TotalString => Format(Total);

		public static string Format(long mem)
		{
			if ((double)mem < 2048.0)
			{
				return mem + " bytes";
			}
			if ((double)mem < 2097152.0)
			{
				return Round((double)mem / 1024.0) + " KB";
			}
			if ((double)mem < 2147483648.0)
			{
				return Round((double)mem / 1048576.0) + " MB";
			}
			return Round((double)mem / 1073741824.0) + " GB";
		}

		public static double Round(double d)
		{
			return Math.Ceiling(d * 100.0) / 100.0;
		}
	}
	public class PriorityQueue<T> : IEnumerable<T>, IEnumerable where T : IComparable<T>
	{
		private class DataEnumerator : IEnumerator<T>, IEnumerator, IDisposable
		{
			private readonly IEnumerator<PriorityQueueNode<T, T>> _pqnEnumerator;

			public T Current
			{
				get
				{
					PriorityQueueNode<T, T> current = _pqnEnumerator.Current;
					if (current == null)
					{
						return default(T);
					}
					return current.Data;
				}
			}

			object IEnumerator.Current => Current;

			public DataEnumerator(IEnumerator<PriorityQueueNode<T, T>> pqnEnumerator)
			{
				_pqnEnumerator = pqnEnumerator;
			}

			public void Dispose()
			{
				_pqnEnumerator.Dispose();
			}

			public bool MoveNext()
			{
				return _pqnEnumerator.MoveNext();
			}

			public void Reset()
			{
				_pqnEnumerator.Reset();
			}
		}

		private readonly AlternativePriorityQueue<T, T> _queue;

		public int Size => _queue.Count;

		public PriorityQueue()
		{
			_queue = new AlternativePriorityQueue<T, T>();
		}

		public PriorityQueue(int capacity, IComparer<T> comparer)
		{
			_queue = new AlternativePriorityQueue<T, T>(capacity, comparer);
		}

		public void Add(T x)
		{
			PriorityQueueNode<T, T> node = new PriorityQueueNode<T, T>(x);
			_queue.Enqueue(node, x);
		}

		public bool IsEmpty()
		{
			return _queue.Count == 0;
		}

		public void Clear()
		{
			_queue.Clear();
		}

		public T Poll()
		{
			PriorityQueueNode<T, T> priorityQueueNode = _queue.Dequeue();
			if (priorityQueueNode != null)
			{
				return priorityQueueNode.Data;
			}
			return default(T);
		}

		public T Peek()
		{
			PriorityQueueNode<T, T> head = _queue.Head;
			if (head != null)
			{
				return head.Data;
			}
			return default(T);
		}

		public IEnumerator<T> GetEnumerator()
		{
			return new DataEnumerator(_queue.GetEnumerator());
		}

		IEnumerator IEnumerable.GetEnumerator()
		{
			return GetEnumerator();
		}
	}
	public sealed class PriorityQueueNode<TPriority, TData>
	{
		private readonly TData data;

		public TData Data => data;

		public TPriority Priority { get; internal set; }

		internal int QueueIndex { get; set; }

		public PriorityQueueNode(TData data)
		{
			this.data = data;
		}

		internal PriorityQueueNode(PriorityQueueNode<TPriority, TData> copyFrom)
		{
			data = copyFrom.data;
			Priority = copyFrom.Priority;
			QueueIndex = copyFrom.QueueIndex;
		}
	}
	public class Radians
	{
		public static double ToDegrees(double radians)
		{
			return radians * (180.0 / Math.PI);
		}
	}
	internal class ReverseOrder : IComparer
	{
		public int Compare(object x, object y)
		{
			return Comparer<object>.Default.Compare(x, y) * -1;
		}
	}
	internal sealed class TokenStream
	{
		private bool? prevMoveNextResult;

		private Token nextToken;

		public IEnumerator<Token> Enumerator { get; }

		public TokenStream(IEnumerator<Token> enumerator)
		{
			Enumerator = enumerator;
		}

		public Token NextToken(bool advance)
		{
			if (!prevMoveNextResult.HasValue)
			{
				ReadNextToken();
			}
			Token result = nextToken;
			if (advance)
			{
				ReadNextToken();
			}
			return result;
		}

		private void ReadNextToken()
		{
			if (Enumerator.MoveNext())
			{
				prevMoveNextResult = true;
				nextToken = Enumerator.Current;
				if (nextToken == null)
				{
					throw new InvalidOperationException("Token list contains a null value.");
				}
			}
			else
			{
				prevMoveNextResult = false;
				nextToken = null;
			}
		}
	}
	public class UniqueCoordinateArrayFilter : ICoordinateFilter
	{
		private readonly ISet<Coordinate> _coordSet = new HashSet<Coordinate>();

		private readonly List<Coordinate> _list = new List<Coordinate>();

		public Coordinate[] Coordinates => _list.ToArray();

		public static Coordinate[] FilterCoordinates(Coordinate[] coords)
		{
			UniqueCoordinateArrayFilter uniqueCoordinateArrayFilter = new UniqueCoordinateArrayFilter();
			for (int i = 0; i < coords.Length; i++)
			{
				uniqueCoordinateArrayFilter.Filter(coords[i]);
			}
			return uniqueCoordinateArrayFilter.Coordinates;
		}

		public void Filter(Coordinate coord)
		{
			if (_coordSet.Add(coord))
			{
				_list.Add(coord);
			}
		}
	}
}
namespace NetTopologySuite.Triangulate
{
	public class ConformingDelaunayTriangulationBuilder
	{
		private ICollection<Coordinate> _siteCoords;

		private Geometry _constraintLines;

		private double _tolerance;

		private QuadEdgeSubdivision _subdiv;

		private readonly IDictionary<Coordinate, Vertex> _constraintVertexMap = new SortedDictionary<Coordinate, Vertex>();

		public Geometry Constraints
		{
			set
			{
				_constraintLines = value;
			}
		}

		public double Tolerance
		{
			get
			{
				return _tolerance;
			}
			set
			{
				_tolerance = value;
			}
		}

		public void SetSites(Geometry sites)
		{
			_siteCoords = DelaunayTriangulationBuilder.ExtractUniqueCoordinates(sites);
		}

		private void Create()
		{
			if (_subdiv == null)
			{
				Envelope envelope = DelaunayTriangulationBuilder.Envelope(_siteCoords);
				List<Segment> segments = new List<Segment>();
				if (_constraintLines != null)
				{
					envelope.ExpandToInclude(_constraintLines.EnvelopeInternal);
					CreateVertices(_constraintLines);
					segments = CreateConstraintSegments(_constraintLines);
				}
				ConformingDelaunayTriangulator conformingDelaunayTriangulator = new ConformingDelaunayTriangulator(CreateSiteVertices(_siteCoords), _tolerance);
				conformingDelaunayTriangulator.SetConstraints(segments, new List<Vertex>(_constraintVertexMap.Values));
				conformingDelaunayTriangulator.FormInitialDelaunay();
				conformingDelaunayTriangulator.EnforceConstraints();
				_subdiv = conformingDelaunayTriangulator.Subdivision;
			}
		}

		private IEnumerable<Vertex> CreateSiteVertices(IEnumerable<Coordinate> coords)
		{
			List<Vertex> list = new List<Vertex>();
			foreach (Coordinate coord in coords)
			{
				if (!_constraintVertexMap.ContainsKey(coord))
				{
					list.Add(new ConstraintVertex(coord));
				}
			}
			return list;
		}

		private void CreateVertices(Geometry geom)
		{
			Coordinate[] coordinates = geom.Coordinates;
			for (int i = 0; i < coordinates.Length; i++)
			{
				ConstraintVertex value = new ConstraintVertex(coordinates[i]);
				_constraintVertexMap[coordinates[i]] = value;
			}
		}

		private static List<Segment> CreateConstraintSegments(Geometry geom)
		{
			ReadOnlyCollection<Geometry> lines = LinearComponentExtracter.GetLines(geom);
			List<Segment> list = new List<Segment>();
			foreach (LineString item in lines)
			{
				CreateConstraintSegments(item, list);
			}
			return list;
		}

		private static void CreateConstraintSegments(LineString line, IList<Segment> constraintSegs)
		{
			Coordinate[] coordinates = line.Coordinates;
			for (int i = 1; i < coordinates.Length; i++)
			{
				constraintSegs.Add(new Segment(coordinates[i - 1], coordinates[i]));
			}
		}

		public QuadEdgeSubdivision GetSubdivision()
		{
			Create();
			return _subdiv;
		}

		public MultiLineString GetEdges(GeometryFactory geomFact)
		{
			Create();
			return _subdiv.GetEdges(geomFact);
		}

		public GeometryCollection GetTriangles(GeometryFactory geomFact)
		{
			Create();
			return _subdiv.GetTriangles(geomFact);
		}
	}
	public class ConformingDelaunayTriangulator
	{
		private readonly IList<Vertex> _initialVertices;

		private IList<Vertex> _segVertices;

		private IList<Segment> _segments = new List<Segment>();

		private QuadEdgeSubdivision _subdiv;

		private IncrementalDelaunayTriangulator _incDel;

		private Geometry _convexHull;

		private IConstraintSplitPointFinder _splitFinder = new NonEncroachingSplitPointFinder();

		private readonly KdTree<Vertex> _kdt;

		private ConstraintVertexFactory _vertexFactory;

		private Envelope _computeAreaEnv;

		private Coordinate _splitPt;

		private readonly double _tolerance;

		private const int MaxSplitIteration = 99;

		public IConstraintSplitPointFinder SplitPointFinder
		{
			get
			{
				return _splitFinder;
			}
			set
			{
				_splitFinder = value;
			}
		}

		public double Tolerance => _tolerance;

		public ConstraintVertexFactory VertexFactory
		{
			get
			{
				return _vertexFactory;
			}
			set
			{
				_vertexFactory = value;
			}
		}

		public QuadEdgeSubdivision Subdivision => _subdiv;

		public KdTree<Vertex> KDT => _kdt;

		public IList<Vertex> InitialVertices => _initialVertices;

		public ICollection<Segment> ConstraintSegments => _segments;

		public Geometry ConvexHull => _convexHull;

		private static Envelope ComputeVertexEnvelope(IEnumerable<Vertex> vertices)
		{
			Envelope envelope = new Envelope();
			foreach (Vertex vertex in vertices)
			{
				envelope.ExpandToInclude(vertex.Coordinate);
			}
			return envelope;
		}

		public ConformingDelaunayTriangulator(IEnumerable<Vertex> initialVertices, double tolerance)
		{
			_initialVertices = new List<Vertex>(initialVertices);
			_tolerance = tolerance;
			_kdt = new KdTree<Vertex>(tolerance);
		}

		public void SetConstraints(IList<Segment> segments, IList<Vertex> segVertices)
		{
			_segments = segments;
			_segVertices = segVertices;
		}

		private void ComputeBoundingBox()
		{
			Envelope env = ComputeVertexEnvelope(_initialVertices);
			Envelope other = ComputeVertexEnvelope(_segVertices);
			Envelope envelope = new Envelope(env);
			envelope.ExpandToInclude(other);
			double val = envelope.Width * 0.2;
			double val2 = envelope.Height * 0.2;
			double distance = Math.Max(val, val2);
			_computeAreaEnv = new Envelope(envelope);
			_computeAreaEnv.ExpandBy(distance);
		}

		private void ComputeConvexHull()
		{
			GeometryFactory geomFactory = new GeometryFactory();
			ConvexHull convexHull = new ConvexHull(GetPointArray(), geomFactory);
			_convexHull = convexHull.GetConvexHull();
		}

		private Coordinate[] GetPointArray()
		{
			Coordinate[] array = new Coordinate[_initialVertices.Count + _segVertices.Count];
			int num = 0;
			foreach (Vertex initialVertex in _initialVertices)
			{
				array[num++] = initialVertex.Coordinate;
			}
			foreach (Vertex segVertex in _segVertices)
			{
				array[num++] = segVertex.Coordinate;
			}
			return array;
		}

		private ConstraintVertex CreateVertex(Coordinate p)
		{
			ConstraintVertex constraintVertex = null;
			if (_vertexFactory != null)
			{
				return _vertexFactory.CreateVertex(p, null);
			}
			return new ConstraintVertex(p);
		}

		private ConstraintVertex CreateVertex(Coordinate p, Segment seg)
		{
			ConstraintVertex constraintVertex = ((_vertexFactory == null) ? new ConstraintVertex(p) : _vertexFactory.CreateVertex(p, seg));
			constraintVertex.IsOnConstraint = true;
			return constraintVertex;
		}

		private void InsertSites(ICollection<Vertex> vertices)
		{
			foreach (Vertex vertex in vertices)
			{
				InsertSite((ConstraintVertex)vertex);
			}
		}

		private ConstraintVertex InsertSite(ConstraintVertex v)
		{
			KdNode<Vertex> kdNode = _kdt.Insert(v.Coordinate, v);
			if (!kdNode.IsRepeated)
			{
				_incDel.InsertSite(v);
				return v;
			}
			ConstraintVertex obj = (ConstraintVertex)kdNode.Data;
			obj.Merge(v);
			return obj;
		}

		public void InsertSite(Coordinate p)
		{
			InsertSite(CreateVertex(p));
		}

		public void FormInitialDelaunay()
		{
			ComputeBoundingBox();
			_subdiv = new QuadEdgeSubdivision(_computeAreaEnv, _tolerance);
			_subdiv.SetLocator(new LastFoundQuadEdgeLocator(_subdiv));
			_incDel = new IncrementalDelaunayTriangulator(_subdiv);
			InsertSites(_initialVertices);
		}

		public void EnforceConstraints()
		{
			AddConstraintVertices();
			int num = 0;
			int num2;
			do
			{
				num2 = EnforceGabriel(_segments);
				num++;
			}
			while (num2 > 0 && num < 99);
			if (num == 99 && !Debugger.IsAttached)
			{
				throw new ConstraintEnforcementException("Too many splitting iterations while enforcing constraints.  Last split point was at: ", _splitPt);
			}
		}

		private void AddConstraintVertices()
		{
			ComputeConvexHull();
			InsertSites(_segVertices);
		}

		private int EnforceGabriel(ICollection<Segment> segsToInsert)
		{
			List<Segment> list = new List<Segment>();
			int num = 0;
			List<Segment> list2 = new List<Segment>();
			foreach (Segment item3 in segsToInsert)
			{
				Coordinate coordinate = FindNonGabrielPoint(item3);
				if (coordinate != null)
				{
					_splitPt = _splitFinder.FindSplitPoint(item3, coordinate);
					ConstraintVertex constraintVertex = CreateVertex(_splitPt, item3);
					InsertSite(constraintVertex).Coordinate.Equals2D(_splitPt);
					Segment item = new Segment(item3.StartX, item3.StartY, item3.StartZ, constraintVertex.X, constraintVertex.Y, constraintVertex.Z, item3.Data);
					Segment item2 = new Segment(constraintVertex.X, constraintVertex.Y, constraintVertex.Z, item3.EndX, item3.EndY, item3.EndZ, item3.Data);
					list.Add(item);
					list.Add(item2);
					list2.Add(item3);
					num++;
				}
			}
			foreach (Segment item4 in list2)
			{
				segsToInsert.Remove(item4);
			}
			foreach (Segment item5 in list)
			{
				segsToInsert.Add(item5);
			}
			return num;
		}

		private Coordinate FindNonGabrielPoint(Segment seg)
		{
			Coordinate start = seg.Start;
			Coordinate end = seg.End;
			Coordinate coordinate = new Coordinate((start.X + end.X) / 2.0, (start.Y + end.Y) / 2.0);
			double num = start.Distance(coordinate);
			Envelope envelope = new Envelope(coordinate);
			envelope.ExpandBy(num);
			IList<KdNode<Vertex>> list = _kdt.Query(envelope);
			Coordinate coordinate2 = null;
			double num2 = double.MaxValue;
			foreach (KdNode<Vertex> item in list)
			{
				Coordinate coordinate3 = item.Coordinate;
				if (coordinate3.Equals2D(start) || coordinate3.Equals2D(end))
				{
					continue;
				}
				double num3 = coordinate.Distance(coordinate3);
				if (num3 < num)
				{
					double num4 = num3;
					if (coordinate2 == null || num4 < num2)
					{
						coordinate2 = coordinate3;
						num2 = num4;
					}
				}
			}
			return coordinate2;
		}
	}
	public class ConstraintEnforcementException : Exception
	{
		private readonly Coordinate _pt;

		public Coordinate Coordinate => _pt;

		private static string MsgWithCoord(string msg, Coordinate pt)
		{
			if (pt != null)
			{
				return msg + " [ " + WKTWriter.ToPoint(pt) + " ]";
			}
			return msg;
		}

		public ConstraintEnforcementException(string msg)
			: base(msg)
		{
		}

		public ConstraintEnforcementException(string msg, Coordinate pt)
			: base(MsgWithCoord(msg, pt))
		{
			_pt = pt.Copy();
		}
	}
	public class ConstraintVertex : Vertex
	{
		private bool isOnConstraint;

		private object constraint;

		public bool IsOnConstraint
		{
			get
			{
				return isOnConstraint;
			}
			set
			{
				isOnConstraint = value;
			}
		}

		public object Constraint
		{
			get
			{
				return constraint;
			}
			set
			{
				isOnConstraint = true;
				constraint = value;
			}
		}

		public ConstraintVertex(Coordinate p)
			: base(p)
		{
		}

		protected internal void Merge(ConstraintVertex other)
		{
			if (other.isOnConstraint)
			{
				isOnConstraint = true;
				constraint = other.constraint;
			}
		}
	}
	public interface ConstraintVertexFactory
	{
		ConstraintVertex CreateVertex(Coordinate p, Segment constraintSeg);
	}
	public class DelaunayTriangulationBuilder
	{
		private ICollection<Coordinate> _siteCoords;

		private double _tolerance;

		private QuadEdgeSubdivision _subdiv;

		public double Tolerance
		{
			set
			{
				_tolerance = value;
			}
		}

		public static CoordinateList ExtractUniqueCoordinates(Geometry geom)
		{
			if (geom == null)
			{
				return new CoordinateList();
			}
			return Unique(geom.Coordinates);
		}

		public static CoordinateList Unique(Coordinate[] coords)
		{
			Coordinate[] array = CoordinateArrays.CopyDeep(coords);
			Array.Sort(array);
			return new CoordinateList(array, allowRepeated: false);
		}

		public static IList<Vertex> ToVertices(ICollection<Coordinate> coords)
		{
			List<Vertex> list = new List<Vertex>();
			foreach (Coordinate coord in coords)
			{
				list.Add(new Vertex(coord));
			}
			return list;
		}

		public static Envelope Envelope(ICollection<Coordinate> coords)
		{
			Envelope envelope = new Envelope();
			foreach (Coordinate coord in coords)
			{
				envelope.ExpandToInclude(coord);
			}
			return envelope;
		}

		public void SetSites(Geometry geom)
		{
			_siteCoords = ExtractUniqueCoordinates(geom);
		}

		public void SetSites(ICollection<Coordinate> coords)
		{
			_siteCoords = Unique(CoordinateArrays.ToCoordinateArray(coords));
		}

		private void Create()
		{
			if (_subdiv == null)
			{
				Envelope env = Envelope(_siteCoords);
				IList<Vertex> vertices = ToVertices(_siteCoords);
				_subdiv = new QuadEdgeSubdivision(env, _tolerance);
				new IncrementalDelaunayTriangulator(_subdiv).InsertSites(vertices);
			}
		}

		public QuadEdgeSubdivision GetSubdivision()
		{
			Create();
			return _subdiv;
		}

		public MultiLineString GetEdges(GeometryFactory geomFact)
		{
			Create();
			return _subdiv.GetEdges(geomFact);
		}

		public GeometryCollection GetTriangles(GeometryFactory geomFact)
		{
			Create();
			return _subdiv.GetTriangles(geomFact);
		}
	}
	public interface IConstraintSplitPointFinder
	{
		Coordinate FindSplitPoint(Segment seg, Coordinate encroachPt);
	}
	public class IncrementalDelaunayTriangulator
	{
		private readonly QuadEdgeSubdivision _subdiv;

		private bool _isUsingTolerance;

		private bool _isForceConvex = true;

		public bool ForceConvex
		{
			get
			{
				return _isForceConvex;
			}
			set
			{
				_isForceConvex = value;
			}
		}

		public IncrementalDelaunayTriangulator(QuadEdgeSubdivision subdiv)
		{
			_subdiv = subdiv;
			_isUsingTolerance = subdiv.Tolerance > 0.0;
		}

		public void InsertSites(ICollection<Vertex> vertices)
		{
			foreach (Vertex vertex in vertices)
			{
				InsertSite(vertex);
			}
		}

		public NetTopologySuite.Triangulate.QuadEdge.QuadEdge InsertSite(Vertex v)
		{
			NetTopologySuite.Triangulate.QuadEdge.QuadEdge quadEdge = _subdiv.Locate(v);
			if (_subdiv.IsVertexOfEdge(quadEdge, v))
			{
				return quadEdge;
			}
			if (_subdiv.IsOnEdge(quadEdge, v.Coordinate))
			{
				quadEdge = quadEdge.OPrev;
				_subdiv.Delete(quadEdge.ONext);
			}
			NetTopologySuite.Triangulate.QuadEdge.QuadEdge quadEdge2 = _subdiv.MakeEdge(quadEdge.Orig, v);
			NetTopologySuite.Triangulate.QuadEdge.QuadEdge.Splice(quadEdge2, quadEdge);
			NetTopologySuite.Triangulate.QuadEdge.QuadEdge quadEdge3 = quadEdge2;
			do
			{
				quadEdge2 = _subdiv.Connect(quadEdge, quadEdge2.Sym);
				quadEdge = quadEdge2.OPrev;
			}
			while (quadEdge.LNext != quadEdge3);
			while (true)
			{
				NetTopologySuite.Triangulate.QuadEdge.QuadEdge oPrev = quadEdge.OPrev;
				bool flag = oPrev.Dest.RightOf(quadEdge) && v.IsInCircle(quadEdge.Orig, oPrev.Dest, quadEdge.Dest);
				if (_isForceConvex)
				{
					if (IsConcaveBoundary(quadEdge))
					{
						flag = true;
					}
					else if (IsBetweenFrameAndInserted(quadEdge, v))
					{
						flag = false;
					}
				}
				if (flag)
				{
					NetTopologySuite.Triangulate.QuadEdge.QuadEdge.Swap(quadEdge);
					quadEdge = quadEdge.OPrev;
					continue;
				}
				if (quadEdge.ONext == quadEdge3)
				{
					break;
				}
				quadEdge = quadEdge.ONext.LPrev;
			}
			return quadEdge2;
		}

		private bool IsConcaveBoundary(NetTopologySuite.Triangulate.QuadEdge.QuadEdge e)
		{
			if (_subdiv.IsFrameVertex(e.Dest))
			{
				return IsConcaveAtOrigin(e);
			}
			if (_subdiv.IsFrameVertex(e.Orig))
			{
				return IsConcaveAtOrigin(e.Sym);
			}
			return false;
		}

		private static bool IsConcaveAtOrigin(NetTopologySuite.Triangulate.QuadEdge.QuadEdge e)
		{
			Coordinate coordinate = e.Orig.Coordinate;
			Coordinate coordinate2 = e.OPrev.Dest.Coordinate;
			Coordinate coordinate3 = e.ONext.Dest.Coordinate;
			return OrientationIndex.CounterClockwise == Orientation.Index(coordinate2, coordinate3, coordinate);
		}

		private bool IsBetweenFrameAndInserted(NetTopologySuite.Triangulate.QuadEdge.QuadEdge e, Vertex vInsert)
		{
			Vertex dest = e.ONext.Dest;
			Vertex dest2 = e.OPrev.Dest;
			if (dest != vInsert || !_subdiv.IsFrameVertex(dest2))
			{
				if (dest2 == vInsert)
				{
					return _subdiv.IsFrameVertex(dest);
				}
				return false;
			}
			return true;
		}
	}
	public class MidpointSplitPointFinder : IConstraintSplitPointFinder
	{
		public Coordinate FindSplitPoint(Segment seg, Coordinate encroachPt)
		{
			Coordinate start = seg.Start;
			Coordinate end = seg.End;
			return new Coordinate((start.X + end.X) / 2.0, (start.Y + end.Y) / 2.0);
		}
	}
	public class NonEncroachingSplitPointFinder : IConstraintSplitPointFinder
	{
		public Coordinate FindSplitPoint(Segment seg, Coordinate encroachPt)
		{
			LineSegment lineSegment = seg.LineSegment;
			double num = lineSegment.Length / 2.0;
			SplitSegment splitSegment = new SplitSegment(lineSegment);
			Coordinate coordinate = ProjectedSplitPoint(seg, encroachPt);
			double num2 = coordinate.Distance(encroachPt) * 2.0 * 0.8;
			if (num2 > num)
			{
				num2 = num;
			}
			splitSegment.MinimumLength = num2;
			splitSegment.SplitAt(coordinate);
			return splitSegment.SplitPoint;
		}

		public static Coordinate ProjectedSplitPoint(Segment seg, Coordinate encroachPt)
		{
			return seg.LineSegment.Project(encroachPt);
		}
	}
	public class Segment
	{
		private readonly LineSegment _ls;

		public Coordinate Start => _ls.GetCoordinate(0);

		public Coordinate End => _ls.GetCoordinate(1);

		public double StartX => _ls.GetCoordinate(0).X;

		public double StartY => _ls.GetCoordinate(0).Y;

		public double StartZ => _ls.GetCoordinate(0).Z;

		public double EndX => _ls.GetCoordinate(1).X;

		public double EndY => _ls.GetCoordinate(1).Y;

		public double EndZ => _ls.GetCoordinate(1).Z;

		public LineSegment LineSegment => _ls;

		public object Data { get; set; }

		public Segment(double x1, double y1, double z1, double x2, double y2, double z2)
			: this(new CoordinateZ(x1, y1, z1), new CoordinateZ(x2, y2, z2))
		{
		}

		public Segment(double x1, double y1, double z1, double x2, double y2, double z2, object data)
			: this(new CoordinateZ(x1, y1, z1), new CoordinateZ(x2, y2, z2), data)
		{
		}

		public Segment(Coordinate p0, Coordinate p1, object data)
		{
			_ls = new LineSegment(p0, p1);
			Data = data;
		}

		public Segment(Coordinate p0, Coordinate p1)
		{
			_ls = new LineSegment(p0, p1);
		}

		public bool EqualsTopologically(Segment s)
		{
			return _ls.EqualsTopologically(s.LineSegment);
		}

		public Coordinate Intersection(Segment s)
		{
			return _ls.Intersection(s.LineSegment);
		}

		public override string ToString()
		{
			return _ls.ToString();
		}
	}
	public class SplitSegment
	{
		private readonly LineSegment _seg;

		private readonly double _segLen;

		private Coordinate _splitPt;

		private double _minimumLen;

		public double MinimumLength
		{
			get
			{
				return _minimumLen;
			}
			set
			{
				_minimumLen = value;
			}
		}

		public Coordinate SplitPoint => _splitPt;

		private static Coordinate PointAlongReverse(LineSegment seg, double segmentLengthFraction)
		{
			return new Coordinate
			{
				X = seg.P1.X - segmentLengthFraction * (seg.P1.X - seg.P0.X),
				Y = seg.P1.Y - segmentLengthFraction * (seg.P1.Y - seg.P0.Y)
			};
		}

		public SplitSegment(LineSegment seg)
		{
			_seg = seg;
			_segLen = seg.Length;
		}

		public void SplitAt(double length, Coordinate endPt)
		{
			double segmentLengthFraction = GetConstrainedLength(length) / _segLen;
			if (endPt.Equals2D(_seg.P0))
			{
				_splitPt = _seg.PointAlong(segmentLengthFraction);
			}
			else
			{
				_splitPt = PointAlongReverse(_seg, segmentLengthFraction);
			}
		}

		public void SplitAt(Coordinate pt)
		{
			double segmentLengthFraction = _minimumLen / _segLen;
			if (pt.Distance(_seg.P0) < _minimumLen)
			{
				_splitPt = _seg.PointAlong(segmentLengthFraction);
			}
			else if (pt.Distance(_seg.P1) < _minimumLen)
			{
				_splitPt = PointAlongReverse(_seg, segmentLengthFraction);
			}
			else
			{
				_splitPt = pt;
			}
		}

		private double GetConstrainedLength(double len)
		{
			if (len < _minimumLen)
			{
				return _minimumLen;
			}
			return len;
		}
	}
	public class VertexTaggedGeometryDataMapper
	{
		private readonly IDictionary<Coordinate, object> _coordDataMap = new SortedDictionary<Coordinate, object>();

		public IList<Coordinate> Coordinates => new List<Coordinate>(_coordDataMap.Keys);

		public void LoadSourceGeometries(Geometry geoms)
		{
			for (int i = 0; i < geoms.NumGeometries; i++)
			{
				Geometry geometryN = geoms.GetGeometryN(i);
				LoadVertices(geometryN.Coordinates, geometryN.UserData);
			}
		}

		public void LoadSourceGeometries(ICollection<Geometry> geoms)
		{
			foreach (Geometry geom in geoms)
			{
				LoadVertices(geom.Coordinates, geom.UserData);
			}
		}

		public void LoadSourceGeometries(GeometryCollection geomColl)
		{
			for (int i = 0; i < geomColl.NumGeometries; i++)
			{
				Geometry geometryN = geomColl.GetGeometryN(i);
				LoadVertices(geometryN.Coordinates, geometryN.UserData);
			}
		}

		private void LoadVertices(Coordinate[] pts, object data)
		{
			for (int i = 0; i < pts.Length; i++)
			{
				_coordDataMap.Add(pts[i], data);
			}
		}

		public void TransferData(Geometry targetGeom)
		{
			for (int i = 0; i < targetGeom.NumGeometries; i++)
			{
				Geometry geometryN = targetGeom.GetGeometryN(i);
				Coordinate coordinate = (Coordinate)geometryN.UserData;
				if (coordinate != null)
				{
					geometryN.UserData = _coordDataMap[coordinate];
				}
			}
		}
	}
	public class VoronoiDiagramBuilder
	{
		private ICollection<Coordinate> _siteCoords;

		private double _tolerance;

		private QuadEdgeSubdivision _subdiv;

		private Envelope _clipEnv;

		private Envelope _diagramEnv;

		public Envelope ClipEnvelope
		{
			set
			{
				_clipEnv = value;
			}
		}

		public double Tolerance
		{
			set
			{
				_tolerance = value;
			}
		}

		public void SetSites(Geometry geom)
		{
			_siteCoords = DelaunayTriangulationBuilder.ExtractUniqueCoordinates(geom);
		}

		public void SetSites(ICollection<Coordinate> coords)
		{
			_siteCoords = DelaunayTriangulationBuilder.Unique(CoordinateArrays.ToCoordinateArray(coords));
		}

		private void Create()
		{
			if (_subdiv == null)
			{
				_diagramEnv = _clipEnv;
				if (_diagramEnv == null)
				{
					_diagramEnv = DelaunayTriangulationBuilder.Envelope(_siteCoords);
					double diameter = _diagramEnv.Diameter;
					_diagramEnv.ExpandBy(diameter);
				}
				IList<Vertex> vertices = DelaunayTriangulationBuilder.ToVertices(_siteCoords);
				_subdiv = new QuadEdgeSubdivision(_diagramEnv, _tolerance);
				IncrementalDelaunayTriangulator incrementalDelaunayTriangulator = new IncrementalDelaunayTriangulator(_subdiv);
				incrementalDelaunayTriangulator.ForceConvex = false;
				incrementalDelaunayTriangulator.InsertSites(vertices);
			}
		}

		public QuadEdgeSubdivision GetSubdivision()
		{
			Create();
			return _subdiv;
		}

		public GeometryCollection GetDiagram(GeometryFactory geomFact)
		{
			Create();
			return ClipGeometryCollection(_subdiv.GetVoronoiDiagram(geomFact), _diagramEnv);
		}

		private static GeometryCollection ClipGeometryCollection(GeometryCollection geom, Envelope clipEnv)
		{
			Geometry geometry = geom.Factory.ToGeometry(clipEnv);
			List<Geometry> list = new List<Geometry>();
			for (int i = 0; i < geom.NumGeometries; i++)
			{
				Geometry geometryN = geom.GetGeometryN(i);
				Geometry geometry2 = null;
				if (clipEnv.Contains(geometryN.EnvelopeInternal))
				{
					geometry2 = geometryN;
				}
				else if (clipEnv.Intersects(geometryN.EnvelopeInternal))
				{
					geometry2 = geometry.Intersection(geometryN);
					geometry2.UserData = geometryN.UserData;
				}
				if (geometry2 != null && !geometry2.IsEmpty)
				{
					list.Add(geometry2);
				}
			}
			return geom.Factory.CreateGeometryCollection(GeometryFactory.ToGeometryArray(list));
		}
	}
}
namespace NetTopologySuite.Triangulate.Tri
{
	public class Tri
	{
		private const string INVALID_TRI_INDEX = "Invalid Tri index: {0}";

		private Coordinate _p0;

		private Coordinate _p1;

		private Coordinate _p2;

		private Tri _tri0;

		private Tri _tri1;

		private Tri _tri2;

		protected Coordinate P0 => _p0;

		protected Coordinate P1 => _p1;

		protected Coordinate P2 => _p2;

		protected Tri Tri0 => _tri0;

		protected Tri Tri1 => _tri1;

		protected Tri Tri2 => _tri2;

		public int NumAdjacent
		{
			get
			{
				int num = 0;
				if (_tri0 != null)
				{
					num++;
				}
				if (_tri1 != null)
				{
					num++;
				}
				if (_tri2 != null)
				{
					num++;
				}
				return num;
			}
		}

		public double Area => Triangle.Area(_p0, _p1, _p2);

		public double Length => Triangle.Length(_p0, _p1, _p2);

		public static Geometry ToGeometry(ICollection<Tri> tris, GeometryFactory geomFact)
		{
			Geometry[] array = new Geometry[tris.Count];
			int num = 0;
			foreach (Tri tri in tris)
			{
				array[num++] = tri.ToPolygon(geomFact);
			}
			return geomFact.CreateGeometryCollection(array);
		}

		public static double AreaOf(IEnumerable<Tri> triList)
		{
			double num = 0.0;
			foreach (Tri tri in triList)
			{
				num += tri.Area;
			}
			return num;
		}

		public static void Validate(IEnumerable<Tri> triList)
		{
			foreach (Tri tri in triList)
			{
				tri.Validate();
			}
		}

		public static Tri Create(Coordinate p0, Coordinate p1, Coordinate p2)
		{
			return new Tri(p0, p1, p2);
		}

		public static Tri Create(Coordinate[] pts)
		{
			return new Tri(pts[0], pts[1], pts[2]);
		}

		public Tri(Coordinate p0, Coordinate p1, Coordinate p2)
		{
			_p0 = p0;
			_p1 = p1;
			_p2 = p2;
		}

		public void SetAdjacent(Tri tri0, Tri tri1, Tri tri2)
		{
			_tri0 = tri0;
			_tri1 = tri1;
			_tri2 = tri2;
		}

		public void SetAdjacent(Coordinate pt, Tri tri)
		{
			int index = GetIndex(pt);
			SetTri(index, tri);
		}

		public void SetTri(int edgeIndex, Tri tri)
		{
			switch (edgeIndex)
			{
			case 0:
				_tri0 = tri;
				break;