Decompiled source of Serilog Pack v0.4.2

BepInEx/core/Serilog-Pack/Serilog.Sinks.BepInEx.dll

Decompiled 9 months ago
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using Serilog.Configuration;
using Serilog.Core;
using Serilog.Data;
using Serilog.Events;
using Serilog.Formatting.Json;
using Serilog.Parsing;
using Serilog.Sinks.BepInEx;
using Serilog.Sinks.BepInEx.Extensions;
using Serilog.Sinks.BepInEx.Formatting;
using Serilog.Sinks.BepInEx.Output;
using Serilog.Sinks.BepInEx.Rendering;
using Serilog.Sinks.BepInEx.Themes;
using Sigurd.AvaloniaBepInExConsole.Common;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Sigurd Team")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyDescription("This package provides a Serilog sink that redirects events to the BepInEx Logger via an `ILogSource.`")]
[assembly: AssemblyFileVersion("0.4.2.0")]
[assembly: AssemblyInformationalVersion("0.4.2+92c05d81ec3d4862a84ddbeecdb80c536e42e757")]
[assembly: AssemblyProduct("Serilog.Sinks.BepInEx")]
[assembly: AssemblyTitle("Serilog.Sinks.BepInEx")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/lc-sigurd/serilog-sinks-bepinex")]
[assembly: InternalsVisibleTo("Serilog.Sinks.BepInEx.Tests")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[assembly: TypeForwardedTo(typeof(IAnsiFormattable))]
[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 System.Runtime.Versioning
{
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class RequiresPreviewFeaturesAttribute : Attribute
	{
		public string? Message { get; }

		public string? Url { get; set; }

		public RequiresPreviewFeaturesAttribute()
		{
		}

		public RequiresPreviewFeaturesAttribute(string? message)
		{
			Message = message;
		}
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class CallerArgumentExpressionAttribute : Attribute
	{
		public string ParameterName { get; }

		public CallerArgumentExpressionAttribute(string parameterName)
		{
			ParameterName = parameterName;
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class CollectionBuilderAttribute : Attribute
	{
		public Type BuilderType { get; }

		public string MethodName { get; }

		public CollectionBuilderAttribute(Type builderType, string methodName)
		{
			BuilderType = builderType;
			MethodName = methodName;
		}
	}
	[AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class CompilerFeatureRequiredAttribute : Attribute
	{
		public const string RefStructs = "RefStructs";

		public const string RequiredMembers = "RequiredMembers";

		public string FeatureName { get; }

		public bool IsOptional { get; set; }

		public CompilerFeatureRequiredAttribute(string featureName)
		{
			FeatureName = featureName;
		}
	}
	[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class InterpolatedStringHandlerArgumentAttribute : Attribute
	{
		public string[] Arguments { get; }

		public InterpolatedStringHandlerArgumentAttribute(string argument)
		{
			Arguments = new string[1] { argument };
		}

		public InterpolatedStringHandlerArgumentAttribute(params string[] arguments)
		{
			Arguments = arguments;
		}
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class InterpolatedStringHandlerAttribute : Attribute
	{
	}
	[EditorBrowsable(EditorBrowsableState.Never)]
	[ExcludeFromCodeCoverage]
	internal static class IsExternalInit
	{
	}
	[AttributeUsage(AttributeTargets.Method, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class ModuleInitializerAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class RequiredMemberAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
	[EditorBrowsable(EditorBrowsableState.Never)]
	[ExcludeFromCodeCoverage]
	internal sealed class RequiresLocationAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Event | AttributeTargets.Interface, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class SkipLocalsInitAttribute : Attribute
	{
	}
}
namespace System.Diagnostics.CodeAnalysis
{
	[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Module | AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class ExperimentalAttribute : Attribute
	{
		public string DiagnosticId { get; }

		public string? UrlFormat { get; set; }

		public ExperimentalAttribute(string diagnosticId)
		{
			DiagnosticId = diagnosticId;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
	[ExcludeFromCodeCoverage]
	internal sealed class MemberNotNullAttribute : Attribute
	{
		public string[] Members { get; }

		public MemberNotNullAttribute(string member)
		{
			Members = new string[1] { member };
		}

		public MemberNotNullAttribute(params string[] members)
		{
			Members = members;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)]
	[ExcludeFromCodeCoverage]
	internal sealed class MemberNotNullWhenAttribute : Attribute
	{
		public bool ReturnValue { get; }

		public string[] Members { get; }

		public MemberNotNullWhenAttribute(bool returnValue, string member)
		{
			ReturnValue = returnValue;
			Members = new string[1] { member };
		}

		public MemberNotNullWhenAttribute(bool returnValue, params string[] members)
		{
			ReturnValue = returnValue;
			Members = members;
		}
	}
	[AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class SetsRequiredMembersAttribute : Attribute
	{
	}
	[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class StringSyntaxAttribute : Attribute
	{
		public const string CompositeFormat = "CompositeFormat";

		public const string DateOnlyFormat = "DateOnlyFormat";

		public const string DateTimeFormat = "DateTimeFormat";

		public const string EnumFormat = "EnumFormat";

		public const string GuidFormat = "GuidFormat";

		public const string Json = "Json";

		public const string NumericFormat = "NumericFormat";

		public const string Regex = "Regex";

		public const string TimeOnlyFormat = "TimeOnlyFormat";

		public const string TimeSpanFormat = "TimeSpanFormat";

		public const string Uri = "Uri";

		public const string Xml = "Xml";

		public string Syntax { get; }

		public object?[] Arguments { get; }

		public StringSyntaxAttribute(string syntax)
		{
			Syntax = syntax;
			Arguments = new object[0];
		}

		public StringSyntaxAttribute(string syntax, params object?[] arguments)
		{
			Syntax = syntax;
			Arguments = arguments;
		}
	}
	[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Parameter, AllowMultiple = false, Inherited = false)]
	[ExcludeFromCodeCoverage]
	internal sealed class UnscopedRefAttribute : Attribute
	{
	}
}
namespace Serilog
{
	public static class BepInExLoggerConfigurationExtensions
	{
		private const string DefaultBepInExConsoleOutputTemplate = "[{Timestamp:HH:mm:ss}] [{SourceName}/{Level:u3}] {Message:lj}{NewLine}{Exception}";

		public static LoggerConfiguration BepInExLogger(this LoggerSinkConfiguration sinkConfiguration, string logSourceName, string outputTemplate = "[{Timestamp:HH:mm:ss}] [{SourceName}/{Level:u3}] {Message:lj}{NewLine}{Exception}", IFormatProvider? formatProvider = null, BepInExConsoleTheme? theme = null)
		{
			if (sinkConfiguration == null)
			{
				throw new ArgumentNullException("sinkConfiguration");
			}
			if (logSourceName == null)
			{
				throw new ArgumentNullException("logSourceName");
			}
			if (theme == null)
			{
				theme = AnsiBepInExConsoleTheme.Literate;
			}
			SerilogLogSource logSource = new SerilogLogSource(logSourceName);
			return sinkConfiguration.Sink((ILogEventSink)(object)new BepInExLogSink(logSource, theme, outputTemplate, formatProvider), (LogEventLevel)0, (LoggingLevelSwitch)null);
		}
	}
}
namespace Serilog.Sinks.BepInEx
{
	public record BepInExLogContext
	{
		public required LogLevel Level { get; init; }

		public required string SourceName { get; init; }

		public static BepInExLogContext FromLogEvent(LogEvent logEvent, string sourceName)
		{
			//IL_000e: 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_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			LogEvent logEvent2 = logEvent;
			LogLevel level = logEvent2.Level.ToBepInExLevel();
			return new BepInExLogContext
			{
				Level = level,
				SourceName = sourceName
			};
		}

		[CompilerGenerated]
		protected virtual bool PrintMembers(StringBuilder builder)
		{
			//IL_0013: 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)
			RuntimeHelpers.EnsureSufficientExecutionStack();
			builder.Append("Level = ");
			LogLevel level = Level;
			builder.Append(((object)(LogLevel)(ref level)).ToString());
			builder.Append(", SourceName = ");
			builder.Append((object?)SourceName);
			return true;
		}

		[CompilerGenerated]
		[SetsRequiredMembers]
		protected BepInExLogContext(BepInExLogContext original)
		{
			//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)
			Level = original.Level;
			SourceName = original.SourceName;
		}

		public BepInExLogContext()
		{
		}
	}
	public class BepInExLogSink : ILogEventSink, IDisposable
	{
		private const int DefaultWriteBufferCapacity = 256;

		private readonly IBepInExTextFormatter _plainFormatter;

		private readonly IBepInExTextFormatter _formatter;

		private readonly BepInExConsoleTheme _theme;

		private readonly SerilogLogSource _logSource;

		public BepInExLogSink(SerilogLogSource logSource, BepInExConsoleTheme theme, string outputTemplate, IFormatProvider? formatProvider)
		{
			_logSource = logSource ?? throw new ArgumentNullException("logSource");
			_theme = theme ?? throw new ArgumentNullException("theme");
			if (outputTemplate == null)
			{
				throw new ArgumentNullException("outputTemplate");
			}
			_plainFormatter = new OutputTemplateRenderer(BepInExConsoleTheme.None, outputTemplate, formatProvider);
			_formatter = new OutputTemplateRenderer(theme, outputTemplate, formatProvider);
			Logger.Sources.Add((ILogSource)(object)_logSource);
		}

		public void Emit(LogEvent logEvent)
		{
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			if (!_theme.CanBuffer)
			{
				throw new NotSupportedException("BepInEx log themes must support buffering.");
			}
			BepInExLogContext bepInExLogContext = BepInExLogContext.FromLogEvent(logEvent, _logSource.SourceName);
			StringWriter stringWriter = new StringWriter(new StringBuilder(256));
			_plainFormatter.Format(logEvent, bepInExLogContext, stringWriter);
			string plainMessage = stringWriter.ToString().TrimEnd();
			StringWriter stringWriter2 = new StringWriter(new StringBuilder(256));
			_formatter.Format(logEvent, bepInExLogContext, stringWriter2);
			string ansiFormattedMessage = stringWriter2.ToString().TrimEnd();
			_logSource.Log(bepInExLogContext.Level, plainMessage, ansiFormattedMessage);
		}

		public void Dispose()
		{
			Logger.Sources.Remove((ILogSource)(object)_logSource);
			_logSource.Dispose();
		}
	}
	public static class ExceptionRenderStyleFlagsExtensions
	{
		public static bool Has(this ExceptionRenderStyleFlags @this, ExceptionRenderStyleFlags flags)
		{
			return (@this & flags) == flags;
		}
	}
	[Flags]
	public enum ExceptionRenderStyleFlags
	{
		Default = 0,
		IncludeInner = 1,
		IncludeStackTrace = 2,
		IncludeType = 4
	}
	public class SerilogLogEventArgs : LogEventArgs, IAnsiFormattable
	{
		private readonly string _formattedData;

		public SerilogLogEventArgs(string data, string formattedData, LogLevel level, ILogSource source)
			: base((object)data, level, source)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			_formattedData = formattedData;
		}

		public override string ToString()
		{
			return $"{((LogEventArgs)this).Data}";
		}

		public string ToAnsiFormattedString()
		{
			return _formattedData;
		}
	}
	public class SerilogLogSource : ILogSource, IDisposable
	{
		public string SourceName { get; }

		public event EventHandler<LogEventArgs>? LogEvent;

		public SerilogLogSource(string sourceName)
		{
			SourceName = sourceName;
		}

		public void Dispose()
		{
		}

		public void Log(LogLevel level, string plainMessage, string ansiFormattedMessage)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			this.LogEvent?.Invoke(this, (LogEventArgs)(object)new SerilogLogEventArgs(plainMessage, ansiFormattedMessage, level, (ILogSource)(object)this));
		}
	}
}
namespace Serilog.Sinks.BepInEx.Themes
{
	public class AnsiBepInExConsoleTheme : BepInExConsoleTheme
	{
		private readonly IReadOnlyDictionary<BepInExConsoleThemeStyle, string> _styles;

		public static AnsiBepInExConsoleTheme Code { get; } = AnsiBepInExConsoleThemes.Code;


		public static AnsiBepInExConsoleTheme Grayscale { get; } = AnsiBepInExConsoleThemes.Grayscale;


		public static AnsiBepInExConsoleTheme Literate { get; } = AnsiBepInExConsoleThemes.Literate;


		public static AnsiBepInExConsoleTheme Sixteen { get; } = AnsiBepInExConsoleThemes.Sixteen;


		public override bool CanBuffer => true;

		public AnsiBepInExConsoleTheme(IReadOnlyDictionary<BepInExConsoleThemeStyle, string> styles)
		{
			if (styles == null)
			{
				throw new ArgumentNullException("styles");
			}
			_styles = styles.ToDictionary<KeyValuePair<BepInExConsoleThemeStyle, string>, BepInExConsoleThemeStyle, string>((KeyValuePair<BepInExConsoleThemeStyle, string> kv) => kv.Key, (KeyValuePair<BepInExConsoleThemeStyle, string> kv) => kv.Value);
		}

		protected virtual string GetReset(BepInExLogContext context)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return context.Level.GetLevelAnsiReset();
		}

		protected override int GetResetCharCount(BepInExLogContext context)
		{
			return GetReset(context).Length;
		}

		public override int Set(BepInExLogContext context, TextWriter output, BepInExConsoleThemeStyle style)
		{
			if (_styles.TryGetValue(style, out string value))
			{
				output.Write(value);
				return value.Length;
			}
			return 0;
		}

		public override void Reset(BepInExLogContext context, TextWriter output)
		{
			output.Write(GetReset(context));
		}
	}
	internal static class AnsiBepInExConsoleThemes
	{
		public static AnsiBepInExConsoleTheme Literate { get; } = new AnsiBepInExConsoleTheme(new Dictionary<BepInExConsoleThemeStyle, string>
		{
			[BepInExConsoleThemeStyle.Text] = "\u001b[38;5;0015m",
			[BepInExConsoleThemeStyle.SecondaryText] = "\u001b[38;5;0007m",
			[BepInExConsoleThemeStyle.TertiaryText] = "\u001b[38;5;0008m",
			[BepInExConsoleThemeStyle.SuccessText] = "\u001b[38;5;0113m",
			[BepInExConsoleThemeStyle.DangerText] = "\u001b[38;5;0208m",
			[BepInExConsoleThemeStyle.WarningText] = "\u001b[38;5;0011m",
			[BepInExConsoleThemeStyle.ExceptionText] = "\u001b[38;5;0009m",
			[BepInExConsoleThemeStyle.Invalid] = "\u001b[38;5;0011m",
			[BepInExConsoleThemeStyle.Null] = "\u001b[38;5;0027m",
			[BepInExConsoleThemeStyle.Name] = "\u001b[38;5;0007m",
			[BepInExConsoleThemeStyle.String] = "\u001b[38;5;0045m",
			[BepInExConsoleThemeStyle.Number] = "\u001b[38;5;0200m",
			[BepInExConsoleThemeStyle.Boolean] = "\u001b[38;5;0027m",
			[BepInExConsoleThemeStyle.Scalar] = "\u001b[38;5;0085m",
			[BepInExConsoleThemeStyle.LevelVerbose] = "\u001b[38;5;0007m",
			[BepInExConsoleThemeStyle.LevelDebug] = "\u001b[38;5;0007m",
			[BepInExConsoleThemeStyle.LevelInformation] = "\u001b[38;5;0015m",
			[BepInExConsoleThemeStyle.LevelWarning] = "\u001b[38;5;0011m",
			[BepInExConsoleThemeStyle.LevelError] = "\u001b[38;5;0015m\u001b[48;5;0196m",
			[BepInExConsoleThemeStyle.LevelFatal] = "\u001b[38;5;0015m\u001b[48;5;0196m"
		});


		public static AnsiBepInExConsoleTheme Grayscale { get; } = new AnsiBepInExConsoleTheme(new Dictionary<BepInExConsoleThemeStyle, string>
		{
			[BepInExConsoleThemeStyle.Text] = "\u001b[37;1m",
			[BepInExConsoleThemeStyle.SecondaryText] = "\u001b[37m",
			[BepInExConsoleThemeStyle.TertiaryText] = "\u001b[30;1m",
			[BepInExConsoleThemeStyle.Invalid] = "\u001b[37;1m\u001b[47m",
			[BepInExConsoleThemeStyle.Null] = "\u001b[1m\u001b[37;1m",
			[BepInExConsoleThemeStyle.Name] = "\u001b[37m",
			[BepInExConsoleThemeStyle.String] = "\u001b[1m\u001b[37;1m",
			[BepInExConsoleThemeStyle.Number] = "\u001b[1m\u001b[37;1m",
			[BepInExConsoleThemeStyle.Boolean] = "\u001b[1m\u001b[37;1m",
			[BepInExConsoleThemeStyle.Scalar] = "\u001b[1m\u001b[37;1m",
			[BepInExConsoleThemeStyle.LevelVerbose] = "\u001b[30;1m",
			[BepInExConsoleThemeStyle.LevelDebug] = "\u001b[30;1m",
			[BepInExConsoleThemeStyle.LevelInformation] = "\u001b[37;1m",
			[BepInExConsoleThemeStyle.LevelWarning] = "\u001b[37;1m\u001b[47m",
			[BepInExConsoleThemeStyle.LevelError] = "\u001b[30m\u001b[47m",
			[BepInExConsoleThemeStyle.LevelFatal] = "\u001b[30m\u001b[47m"
		});


		public static AnsiBepInExConsoleTheme Code { get; } = new AnsiBepInExConsoleTheme(new Dictionary<BepInExConsoleThemeStyle, string>
		{
			[BepInExConsoleThemeStyle.Text] = "\u001b[38;5;0253m",
			[BepInExConsoleThemeStyle.SecondaryText] = "\u001b[38;5;0246m",
			[BepInExConsoleThemeStyle.TertiaryText] = "\u001b[38;5;0242m",
			[BepInExConsoleThemeStyle.SuccessText] = "\u001b[38;5;0113m",
			[BepInExConsoleThemeStyle.DangerText] = "\u001b[38;5;0208m",
			[BepInExConsoleThemeStyle.WarningText] = "\u001b[38;5;0011m",
			[BepInExConsoleThemeStyle.ExceptionText] = "\u001b[38;5;0009m",
			[BepInExConsoleThemeStyle.Invalid] = "\u001b[33;1m",
			[BepInExConsoleThemeStyle.Null] = "\u001b[38;5;0038m",
			[BepInExConsoleThemeStyle.Name] = "\u001b[38;5;0081m",
			[BepInExConsoleThemeStyle.String] = "\u001b[38;5;0216m",
			[BepInExConsoleThemeStyle.Number] = "\u001b[38;5;151m",
			[BepInExConsoleThemeStyle.Boolean] = "\u001b[38;5;0038m",
			[BepInExConsoleThemeStyle.Scalar] = "\u001b[38;5;0079m",
			[BepInExConsoleThemeStyle.LevelVerbose] = "\u001b[37m",
			[BepInExConsoleThemeStyle.LevelDebug] = "\u001b[37m",
			[BepInExConsoleThemeStyle.LevelInformation] = "\u001b[37;1m",
			[BepInExConsoleThemeStyle.LevelWarning] = "\u001b[38;5;0229m",
			[BepInExConsoleThemeStyle.LevelError] = "\u001b[38;5;0197m\u001b[48;5;0238m",
			[BepInExConsoleThemeStyle.LevelFatal] = "\u001b[38;5;0197m\u001b[48;5;0238m"
		});


		public static AnsiBepInExConsoleTheme Sixteen { get; } = new AnsiBepInExConsoleTheme(new Dictionary<BepInExConsoleThemeStyle, string>
		{
			[BepInExConsoleThemeStyle.Text] = "",
			[BepInExConsoleThemeStyle.SecondaryText] = "",
			[BepInExConsoleThemeStyle.TertiaryText] = "",
			[BepInExConsoleThemeStyle.SuccessText] = "\u001b[92m",
			[BepInExConsoleThemeStyle.DangerText] = "\u001b[31m",
			[BepInExConsoleThemeStyle.WarningText] = "\u001b[93m",
			[BepInExConsoleThemeStyle.ExceptionText] = "\u001b[91m",
			[BepInExConsoleThemeStyle.Invalid] = "\u001b[33m",
			[BepInExConsoleThemeStyle.Null] = "\u001b[34m",
			[BepInExConsoleThemeStyle.Name] = "",
			[BepInExConsoleThemeStyle.String] = "\u001b[36m",
			[BepInExConsoleThemeStyle.Number] = "\u001b[35m",
			[BepInExConsoleThemeStyle.Boolean] = "\u001b[34m",
			[BepInExConsoleThemeStyle.Scalar] = "\u001b[32m",
			[BepInExConsoleThemeStyle.LevelVerbose] = "",
			[BepInExConsoleThemeStyle.LevelDebug] = "\u001b[1m",
			[BepInExConsoleThemeStyle.LevelInformation] = "\u001b[96m",
			[BepInExConsoleThemeStyle.LevelWarning] = "\u001b[93m",
			[BepInExConsoleThemeStyle.LevelError] = "\u001b[91m",
			[BepInExConsoleThemeStyle.LevelFatal] = "\u001b[91m"
		});

	}
	internal static class AnsiEscapeSequence
	{
		public const string Unthemed = "";

		public const string Reset = "\u001b[0m";

		public const string Bold = "\u001b[1m";

		public const string Black = "\u001b[30m";

		public const string Red = "\u001b[31m";

		public const string Green = "\u001b[32m";

		public const string Yellow = "\u001b[33m";

		public const string Blue = "\u001b[34m";

		public const string Magenta = "\u001b[35m";

		public const string Cyan = "\u001b[36m";

		public const string White = "\u001b[37m";

		public const string BrightBlack = "\u001b[90m";

		public const string BrightRed = "\u001b[91m";

		public const string BrightGreen = "\u001b[92m";

		public const string BrightYellow = "\u001b[93m";

		public const string BrightBlue = "\u001b[94m";

		public const string BrightMagenta = "\u001b[95m";

		public const string BrightCyan = "\u001b[96m";

		public const string BrightWhite = "\u001b[97m";
	}
	public abstract class BepInExConsoleTheme
	{
		public static BepInExConsoleTheme None { get; } = new EmptyBepInExConsoleTheme();


		public abstract bool CanBuffer { get; }

		public abstract int Set(BepInExLogContext context, TextWriter output, BepInExConsoleThemeStyle style);

		public abstract void Reset(BepInExLogContext context, TextWriter output);

		protected abstract int GetResetCharCount(BepInExLogContext context);

		internal BepInExStyleReset Apply(BepInExLogContext context, TextWriter output, BepInExConsoleThemeStyle style, ref int invisibleCharacterCount)
		{
			invisibleCharacterCount += Set(context, output, style);
			invisibleCharacterCount += GetResetCharCount(context);
			return new BepInExStyleReset(this, context, output);
		}
	}
	public enum BepInExConsoleThemeStyle
	{
		Text,
		BepInExText,
		SecondaryText,
		TertiaryText,
		SuccessText,
		DangerText,
		WarningText,
		ExceptionText,
		Invalid,
		Null,
		Name,
		String,
		Number,
		Boolean,
		Scalar,
		LevelVerbose,
		LevelDebug,
		LevelInformation,
		LevelWarning,
		LevelError,
		LevelFatal
	}
	internal struct BepInExStyleReset : IDisposable
	{
		private readonly BepInExConsoleTheme _theme;

		private readonly TextWriter _output;

		private readonly BepInExLogContext _logContext;

		public BepInExStyleReset(BepInExConsoleTheme theme, BepInExLogContext context, TextWriter output)
		{
			_theme = theme;
			_output = output;
			_logContext = context;
		}

		public void Dispose()
		{
			_theme.Reset(_logContext, _output);
		}
	}
	internal class EmptyBepInExConsoleTheme : BepInExConsoleTheme
	{
		public override bool CanBuffer => true;

		protected override int GetResetCharCount(BepInExLogContext context)
		{
			return 0;
		}

		public override int Set(BepInExLogContext context, TextWriter output, BepInExConsoleThemeStyle style)
		{
			return 0;
		}

		public override void Reset(BepInExLogContext context, TextWriter output)
		{
		}
	}
	public sealed class MessageClass : ILogEventEnricher
	{
		public const string PropertyName = "MessageClass";

		public static MessageClass Default = new MessageClass("Default", BepInExConsoleThemeStyle.BepInExText);

		public static MessageClass Standard = new MessageClass("Standard", BepInExConsoleThemeStyle.Text);

		public static MessageClass Success = new MessageClass("Success", BepInExConsoleThemeStyle.SuccessText);

		public static MessageClass Danger = new MessageClass("Danger", BepInExConsoleThemeStyle.DangerText);

		public static MessageClass Warning = new MessageClass("Warning", BepInExConsoleThemeStyle.WarningText);

		public string Name { get; }

		public BepInExConsoleThemeStyle Style { get; }

		private MessageClass(string name, BepInExConsoleThemeStyle style)
		{
			Name = name;
			Style = style;
		}

		public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			if (logEvent == null)
			{
				throw new ArgumentNullException("logEvent");
			}
			if (propertyFactory == null)
			{
				throw new ArgumentNullException("propertyFactory");
			}
			logEvent.AddOrUpdateProperty(new LogEventProperty("MessageClass", (LogEventPropertyValue)new ScalarValue((object)this)));
		}
	}
}
namespace Serilog.Sinks.BepInEx.Rendering
{
	internal static class AlignmentExtensions
	{
		public static Alignment Widen(this Alignment alignment, int amount)
		{
			//IL_0002: 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)
			return new Alignment(((Alignment)(ref alignment)).Direction, ((Alignment)(ref alignment)).Width + amount);
		}
	}
	internal static class Casing
	{
		public static string Format(string value, string? format = null)
		{
			if (!(format == "u"))
			{
				if (format == "w")
				{
					return value.ToLowerInvariant();
				}
				return value;
			}
			return value.ToUpperInvariant();
		}
	}
	internal static class Padding
	{
		private static readonly char[] PaddingChars = new string(' ', 80).ToCharArray();

		public static void Apply(TextWriter output, string value, Alignment? alignment)
		{
			//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_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: 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_0049: 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_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Invalid comparison between Unknown and I4
			if (alignment.HasValue)
			{
				int length = value.Length;
				Alignment value2 = alignment.Value;
				if (length < ((Alignment)(ref value2)).Width)
				{
					value2 = alignment.Value;
					int num = ((Alignment)(ref value2)).Width - value.Length;
					value2 = alignment.Value;
					if ((int)((Alignment)(ref value2)).Direction == 0)
					{
						output.Write(value);
					}
					if (num <= PaddingChars.Length)
					{
						output.Write(PaddingChars, 0, num);
					}
					else
					{
						output.Write(new string(' ', num));
					}
					value2 = alignment.Value;
					if ((int)((Alignment)(ref value2)).Direction == 1)
					{
						output.Write(value);
					}
					return;
				}
			}
			output.Write(value);
		}
	}
	internal class ThemedMessageTemplateRenderer
	{
		private readonly BepInExConsoleTheme _theme;

		private readonly ThemedValueFormatter _valueFormatter;

		private readonly bool _isLiteral;

		private static readonly BepInExConsoleTheme NoTheme = new EmptyBepInExConsoleTheme();

		private readonly ThemedValueFormatter _unthemedValueFormatter;

		public ThemedMessageTemplateRenderer(BepInExConsoleTheme theme, ThemedValueFormatter valueFormatter, bool isLiteral)
		{
			_theme = theme ?? throw new ArgumentNullException("theme");
			_valueFormatter = valueFormatter;
			_isLiteral = isLiteral;
			_unthemedValueFormatter = valueFormatter.SwitchTheme(NoTheme);
		}

		public int Render(MessageTemplate template, IReadOnlyDictionary<string, LogEventPropertyValue> properties, BepInExLogContext context, TextWriter output)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			int num = 0;
			foreach (MessageTemplateToken token in template.Tokens)
			{
				TextToken val = (TextToken)(object)((token is TextToken) ? token : null);
				if (val != null)
				{
					num += RenderTextToken(val, properties, context, output);
					continue;
				}
				PropertyToken pt = (PropertyToken)token;
				num += RenderPropertyToken(pt, properties, context, output);
			}
			return num;
		}

		private int RenderTextToken(TextToken tt, IReadOnlyDictionary<string, LogEventPropertyValue> properties, BepInExLogContext context, TextWriter output)
		{
			IReadOnlyDictionary<string, LogEventPropertyValue> properties2 = properties;
			int invisibleCharacterCount = 0;
			using (_theme.Apply(context, output, GetDefaultedContextTextThemeStyle(), ref invisibleCharacterCount))
			{
				output.Write(tt.Text);
				return invisibleCharacterCount;
			}
			BepInExConsoleThemeStyle? GetContextTextThemeStyle()
			{
				if (!properties2.TryGetValue("MessageClass", out LogEventPropertyValue value))
				{
					return null;
				}
				ScalarValue val = (ScalarValue)(object)((value is ScalarValue) ? value : null);
				if (val == null)
				{
					return null;
				}
				if (val.Value is MessageClass messageClass)
				{
					return messageClass.Style;
				}
				return null;
			}
			BepInExConsoleThemeStyle GetDefaultedContextTextThemeStyle()
			{
				return GetContextTextThemeStyle() ?? MessageClass.Default.Style;
			}
		}

		private int RenderPropertyToken(PropertyToken pt, IReadOnlyDictionary<string, LogEventPropertyValue> properties, BepInExLogContext context, TextWriter output)
		{
			//IL_00c8: 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_00ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			if (!properties.TryGetValue(pt.PropertyName, out LogEventPropertyValue value))
			{
				int invisibleCharacterCount = 0;
				using (_theme.Apply(context, output, BepInExConsoleThemeStyle.Invalid, ref invisibleCharacterCount))
				{
					output.Write(((object)pt).ToString());
					return invisibleCharacterCount;
				}
			}
			if (!pt.Alignment.HasValue)
			{
				return RenderValue(_theme, _valueFormatter, value, context, output, pt.Format);
			}
			StringWriter stringWriter = new StringWriter();
			if (!_theme.CanBuffer)
			{
				return RenderAlignedPropertyTokenUnbuffered(pt, context, output, value);
			}
			int num = RenderValue(_theme, _valueFormatter, value, context, stringWriter, pt.Format);
			string text = stringWriter.ToString();
			int num2 = text.Length - num;
			Alignment value2 = pt.Alignment.Value;
			if (num2 >= ((Alignment)(ref value2)).Width)
			{
				output.Write(text);
			}
			else
			{
				Padding.Apply(output, text, pt.Alignment.Value.Widen(num));
			}
			return num;
		}

		private int RenderAlignedPropertyTokenUnbuffered(PropertyToken pt, BepInExLogContext context, TextWriter output, LogEventPropertyValue propertyValue)
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: 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_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			if (!pt.Alignment.HasValue)
			{
				throw new ArgumentException("The PropertyToken should have a non-null Alignment.", "pt");
			}
			StringWriter stringWriter = new StringWriter();
			RenderValue(NoTheme, _unthemedValueFormatter, propertyValue, context, stringWriter, pt.Format);
			int length = stringWriter.ToString().Length;
			Alignment value = pt.Alignment.Value;
			if (length >= ((Alignment)(ref value)).Width)
			{
				return RenderValue(_theme, _valueFormatter, propertyValue, context, output, pt.Format);
			}
			value = pt.Alignment.Value;
			if ((int)((Alignment)(ref value)).Direction == 0)
			{
				int result = RenderValue(_theme, _valueFormatter, propertyValue, context, output, pt.Format);
				Padding.Apply(output, string.Empty, pt.Alignment.Value.Widen(-length));
				return result;
			}
			Padding.Apply(output, string.Empty, pt.Alignment.Value.Widen(-length));
			return RenderValue(_theme, _valueFormatter, propertyValue, context, output, pt.Format);
		}

		private int RenderValue(BepInExConsoleTheme theme, ThemedValueFormatter valueFormatter, LogEventPropertyValue propertyValue, BepInExLogContext context, TextWriter output, string? format)
		{
			if (_isLiteral)
			{
				ScalarValue val = (ScalarValue)(object)((propertyValue is ScalarValue) ? propertyValue : null);
				if (val != null && val.Value is string)
				{
					int invisibleCharacterCount = 0;
					using (theme.Apply(context, output, BepInExConsoleThemeStyle.String, ref invisibleCharacterCount))
					{
						output.Write(val.Value);
						return invisibleCharacterCount;
					}
				}
			}
			return valueFormatter.Format(propertyValue, context, output, format, _isLiteral);
		}
	}
}
namespace Serilog.Sinks.BepInEx.Output
{
	internal class EventPropertyTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly BepInExConsoleTheme _theme;

		private readonly PropertyToken _token;

		private readonly IFormatProvider? _formatProvider;

		public EventPropertyTokenRenderer(BepInExConsoleTheme theme, PropertyToken token, IFormatProvider? formatProvider)
		{
			_theme = theme;
			_token = token;
			_formatProvider = formatProvider;
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			if (!logEvent.Properties.TryGetValue(_token.PropertyName, out var value))
			{
				Padding.Apply(output, string.Empty, _token.Alignment);
				return;
			}
			int invisibleCharacterCount = 0;
			using (_theme.Apply(context, output, BepInExConsoleThemeStyle.SecondaryText, ref invisibleCharacterCount))
			{
				TextWriter textWriter = (_token.Alignment.HasValue ? new StringWriter() : output);
				ScalarValue val = (ScalarValue)(object)((value is ScalarValue) ? value : null);
				if (val != null && val.Value is string value2)
				{
					string value3 = Casing.Format(value2, _token.Format);
					textWriter.Write(value3);
				}
				else
				{
					value.Render(textWriter, _token.Format, _formatProvider);
				}
				if (_token.Alignment.HasValue)
				{
					string value4 = textWriter.ToString();
					Padding.Apply(output, value4, _token.Alignment);
				}
			}
		}
	}
	internal class ExceptionTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly BepInExConsoleTheme _theme;

		private const ExceptionRenderStyleFlags ExceptionRenderStyle = ExceptionRenderStyleFlags.IncludeInner | ExceptionRenderStyleFlags.IncludeStackTrace | ExceptionRenderStyleFlags.IncludeType;

		public ExceptionTokenRenderer(BepInExConsoleTheme theme, PropertyToken pt)
		{
			_theme = theme;
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			if (logEvent.Exception == null)
			{
				return;
			}
			StringReader stringReader = new StringReader(logEvent.RenderException(ExceptionRenderStyleFlags.IncludeInner | ExceptionRenderStyleFlags.IncludeStackTrace | ExceptionRenderStyleFlags.IncludeType));
			while (true)
			{
				string text = stringReader.ReadLine();
				if (text != null)
				{
					BepInExConsoleThemeStyle style = (LineIsStackTrace(text) ? BepInExConsoleThemeStyle.TertiaryText : BepInExConsoleThemeStyle.ExceptionText);
					int invisibleCharacterCount = 0;
					using (_theme.Apply(context, output, style, ref invisibleCharacterCount))
					{
						output.Write(text);
					}
					output.WriteLine();
					continue;
				}
				break;
			}
			static int LeadingSpaceCount(string line)
			{
				return line.TakeWhile((char c) => c == ' ').Count();
			}
			static bool LineIsStackTrace(string line)
			{
				return LeadingSpaceCount(line) % 4 == 3;
			}
		}
	}
	internal static class LevelOutputFormat
	{
		private static readonly string[][] TitleCaseLevelMap = new string[6][]
		{
			new string[7] { "V", "Vb", "Vrb", "Verb", "Verbo", "Verbos", "Verbose" },
			new string[5] { "D", "De", "Dbg", "Dbug", "Debug" },
			new string[11]
			{
				"I", "In", "Inf", "Info", "Infor", "Inform", "Informa", "Informat", "Informati", "Informatio",
				"Information"
			},
			new string[7] { "W", "Wn", "Wrn", "Warn", "Warni", "Warnin", "Warning" },
			new string[5] { "E", "Er", "Err", "Eror", "Error" },
			new string[5] { "F", "Fa", "Ftl", "Fatl", "Fatal" }
		};

		private static readonly string[][] LowerCaseLevelMap = new string[6][]
		{
			new string[7] { "v", "vb", "vrb", "verb", "verbo", "verbos", "verbose" },
			new string[5] { "d", "de", "dbg", "dbug", "debug" },
			new string[11]
			{
				"i", "in", "inf", "info", "infor", "inform", "informa", "informat", "informati", "informatio",
				"information"
			},
			new string[7] { "w", "wn", "wrn", "warn", "warni", "warnin", "warning" },
			new string[5] { "e", "er", "err", "eror", "error" },
			new string[5] { "f", "fa", "ftl", "fatl", "fatal" }
		};

		private static readonly string[][] UpperCaseLevelMap = new string[6][]
		{
			new string[7] { "V", "VB", "VRB", "VERB", "VERBO", "VERBOS", "VERBOSE" },
			new string[5] { "D", "DE", "DBG", "DBUG", "DEBUG" },
			new string[11]
			{
				"I", "IN", "INF", "INFO", "INFOR", "INFORM", "INFORMA", "INFORMAT", "INFORMATI", "INFORMATIO",
				"INFORMATION"
			},
			new string[7] { "W", "WN", "WRN", "WARN", "WARNI", "WARNIN", "WARNING" },
			new string[5] { "E", "ER", "ERR", "EROR", "ERROR" },
			new string[5] { "F", "FA", "FTL", "FATL", "FATAL" }
		};

		public static string GetLevelMoniker(LogEventLevel value, string? format = null)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Expected I4, but got Unknown
			int num = (int)value;
			if ((num < 0 || num > 5) ? true : false)
			{
				return Casing.Format(((object)(LogEventLevel)(ref value)).ToString(), format);
			}
			if (format == null || (format.Length != 2 && format.Length != 3))
			{
				return Casing.Format(GetLevelMoniker(TitleCaseLevelMap, num), format);
			}
			int num2 = format[1] - 48;
			if (format.Length == 3)
			{
				num2 *= 10;
				num2 += format[2] - 48;
			}
			if (num2 < 1)
			{
				return string.Empty;
			}
			return format[0] switch
			{
				'w' => GetLevelMoniker(LowerCaseLevelMap, num, num2), 
				'u' => GetLevelMoniker(UpperCaseLevelMap, num, num2), 
				't' => GetLevelMoniker(TitleCaseLevelMap, num, num2), 
				_ => Casing.Format(GetLevelMoniker(TitleCaseLevelMap, num), format), 
			};
		}

		private static string GetLevelMoniker(string[][] caseLevelMap, int index, int width)
		{
			string[] array = caseLevelMap[index];
			return array[Math.Min(width, array.Length) - 1];
		}

		private static string GetLevelMoniker(string[][] caseLevelMap, int index)
		{
			return caseLevelMap[index][^1];
		}
	}
	internal class LevelTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly BepInExConsoleTheme _theme;

		private readonly PropertyToken _levelToken;

		private static readonly Dictionary<LogEventLevel, BepInExConsoleThemeStyle> Levels = new Dictionary<LogEventLevel, BepInExConsoleThemeStyle>
		{
			{
				(LogEventLevel)0,
				BepInExConsoleThemeStyle.LevelVerbose
			},
			{
				(LogEventLevel)1,
				BepInExConsoleThemeStyle.LevelDebug
			},
			{
				(LogEventLevel)2,
				BepInExConsoleThemeStyle.LevelInformation
			},
			{
				(LogEventLevel)3,
				BepInExConsoleThemeStyle.LevelWarning
			},
			{
				(LogEventLevel)4,
				BepInExConsoleThemeStyle.LevelError
			},
			{
				(LogEventLevel)5,
				BepInExConsoleThemeStyle.LevelFatal
			}
		};

		public LevelTokenRenderer(BepInExConsoleTheme theme, PropertyToken levelToken)
		{
			_theme = theme;
			_levelToken = levelToken;
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			//IL_0001: 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)
			string levelMoniker = LevelOutputFormat.GetLevelMoniker(logEvent.Level, _levelToken.Format);
			if (!Levels.TryGetValue(logEvent.Level, out var value))
			{
				value = BepInExConsoleThemeStyle.Invalid;
			}
			int invisibleCharacterCount = 0;
			using (_theme.Apply(context, output, value, ref invisibleCharacterCount))
			{
				Padding.Apply(output, levelMoniker, _levelToken.Alignment);
			}
		}
	}
	internal class MessageTemplateOutputTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly BepInExConsoleTheme _theme;

		private readonly PropertyToken _token;

		private readonly ThemedMessageTemplateRenderer _renderer;

		public MessageTemplateOutputTokenRenderer(BepInExConsoleTheme theme, PropertyToken token, IFormatProvider? formatProvider)
		{
			_theme = theme ?? throw new ArgumentNullException("theme");
			_token = token ?? throw new ArgumentNullException("token");
			bool isLiteral = false;
			bool flag = false;
			if (token.Format != null)
			{
				for (int i = 0; i < token.Format.Length; i++)
				{
					if (token.Format[i] == 'l')
					{
						isLiteral = true;
					}
					else if (token.Format[i] == 'j')
					{
						flag = true;
					}
				}
			}
			_renderer = new ThemedMessageTemplateRenderer(theme, flag ? ((ThemedValueFormatter)new ThemedJsonValueFormatter(theme, formatProvider)) : ((ThemedValueFormatter)new ThemedDisplayValueFormatter(theme, formatProvider)), isLiteral);
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			//IL_0074: 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)
			if (!_token.Alignment.HasValue || !_theme.CanBuffer)
			{
				_renderer.Render(logEvent.MessageTemplate, logEvent.Properties, context, output);
				return;
			}
			StringWriter stringWriter = new StringWriter();
			int amount = _renderer.Render(logEvent.MessageTemplate, logEvent.Properties, context, stringWriter);
			string value = stringWriter.ToString();
			Padding.Apply(output, value, _token.Alignment.Value.Widen(amount));
		}
	}
	internal class NewLineTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly Alignment? _alignment;

		public NewLineTokenRenderer(Alignment? alignment)
		{
			_alignment = alignment;
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			//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)
			if (_alignment.HasValue)
			{
				Padding.Apply(output, Environment.NewLine, _alignment.Value.Widen(Environment.NewLine.Length));
			}
			else
			{
				output.WriteLine();
			}
		}
	}
	internal class OutputTemplateRenderer : IBepInExTextFormatter
	{
		private readonly OutputTemplateTokenRenderer[] _renderers;

		public OutputTemplateRenderer(BepInExConsoleTheme theme, string outputTemplate, IFormatProvider? formatProvider)
		{
			//IL_0014: 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_006a: Expected O, but got Unknown
			if (outputTemplate == null)
			{
				throw new ArgumentNullException("outputTemplate");
			}
			MessageTemplate val = new MessageTemplateParser().Parse(outputTemplate);
			List<OutputTemplateTokenRenderer> list = new List<OutputTemplateTokenRenderer>();
			foreach (MessageTemplateToken token in val.Tokens)
			{
				TextToken val2 = (TextToken)(object)((token is TextToken) ? token : null);
				if (val2 != null)
				{
					list.Add(new TextTokenRenderer(theme, val2.Text));
					continue;
				}
				PropertyToken val3 = (PropertyToken)token;
				if (val3.PropertyName == "Level")
				{
					list.Add(new LevelTokenRenderer(theme, val3));
				}
				else if (val3.PropertyName == "SourceName")
				{
					list.Add(new SourceNameRenderer(theme, val3));
				}
				else if (val3.PropertyName == "NewLine")
				{
					list.Add(new NewLineTokenRenderer(val3.Alignment));
				}
				else if (val3.PropertyName == "TraceId")
				{
					list.Add(new TraceIdTokenRenderer(theme, val3));
				}
				else if (val3.PropertyName == "SpanId")
				{
					list.Add(new SpanIdTokenRenderer(theme, val3));
				}
				else if (val3.PropertyName == "Exception")
				{
					list.Add(new ExceptionTokenRenderer(theme, val3));
				}
				else if (val3.PropertyName == "Message")
				{
					list.Add(new MessageTemplateOutputTokenRenderer(theme, val3, formatProvider));
				}
				else if (val3.PropertyName == "Timestamp")
				{
					list.Add(new TimestampTokenRenderer(theme, val3, formatProvider));
				}
				else if (val3.PropertyName == "Properties")
				{
					list.Add(new PropertiesTokenRenderer(theme, val3, val, formatProvider));
				}
				else
				{
					list.Add(new EventPropertyTokenRenderer(theme, val3, formatProvider));
				}
			}
			_renderers = list.ToArray();
		}

		public void Format(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			if (logEvent == null)
			{
				throw new ArgumentNullException("logEvent");
			}
			if (output == null)
			{
				throw new ArgumentNullException("output");
			}
			OutputTemplateTokenRenderer[] renderers = _renderers;
			for (int i = 0; i < renderers.Length; i++)
			{
				renderers[i].Render(logEvent, context, output);
			}
		}
	}
	internal abstract class OutputTemplateTokenRenderer
	{
		public abstract void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output);
	}
	internal class PropertiesTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly MessageTemplate _outputTemplate;

		private readonly BepInExConsoleTheme _theme;

		private readonly PropertyToken _token;

		private readonly ThemedValueFormatter _valueFormatter;

		public PropertiesTokenRenderer(BepInExConsoleTheme theme, PropertyToken token, MessageTemplate outputTemplate, IFormatProvider? formatProvider)
		{
			_outputTemplate = outputTemplate;
			_theme = theme ?? throw new ArgumentNullException("theme");
			_token = token ?? throw new ArgumentNullException("token");
			bool flag = false;
			if (token.Format != null)
			{
				for (int i = 0; i < token.Format.Length; i++)
				{
					if (token.Format[i] == 'j')
					{
						flag = true;
					}
				}
			}
			_valueFormatter = (flag ? ((ThemedValueFormatter)new ThemedJsonValueFormatter(theme, formatProvider)) : ((ThemedValueFormatter)new ThemedDisplayValueFormatter(theme, formatProvider)));
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			//IL_00d4: 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)
			LogEvent logEvent2 = logEvent;
			StructureValue val = new StructureValue(logEvent2.Properties.Where((KeyValuePair<string, LogEventPropertyValue> p) => !TemplateContainsPropertyName(logEvent2.MessageTemplate, p.Key) && !TemplateContainsPropertyName(_outputTemplate, p.Key)).Select((Func<KeyValuePair<string, LogEventPropertyValue>, LogEventProperty>)((KeyValuePair<string, LogEventPropertyValue> p) => new LogEventProperty(p.Key, p.Value))), (string)null);
			if (!_token.Alignment.HasValue || !_theme.CanBuffer)
			{
				_valueFormatter.Format((LogEventPropertyValue)(object)val, context, output, null);
				return;
			}
			StringWriter stringWriter = new StringWriter(new StringBuilder(val.Properties.Count * 16));
			int amount = _valueFormatter.Format((LogEventPropertyValue)(object)val, context, stringWriter, null);
			string value = stringWriter.ToString();
			Padding.Apply(output, value, _token.Alignment.Value.Widen(amount));
		}

		private static bool TemplateContainsPropertyName(MessageTemplate template, string propertyName)
		{
			foreach (MessageTemplateToken token in template.Tokens)
			{
				PropertyToken val = (PropertyToken)(object)((token is PropertyToken) ? token : null);
				if (val != null && val.PropertyName == propertyName)
				{
					return true;
				}
			}
			return false;
		}
	}
	internal class SourceNameRenderer : OutputTemplateTokenRenderer
	{
		private readonly BepInExConsoleTheme _theme;

		private readonly PropertyToken _sourceNameToken;

		public SourceNameRenderer(BepInExConsoleTheme theme, PropertyToken sourceNameToken)
		{
			_theme = theme;
			_sourceNameToken = sourceNameToken;
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			int invisibleCharacterCount = 0;
			using (_theme.Apply(context, output, BepInExConsoleThemeStyle.SecondaryText, ref invisibleCharacterCount))
			{
				Padding.Apply(output, context.SourceName, _sourceNameToken.Alignment);
			}
		}
	}
	internal class SpanIdTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly BepInExConsoleTheme _theme;

		private readonly Alignment? _alignment;

		public SpanIdTokenRenderer(BepInExConsoleTheme theme, PropertyToken spanIdToken)
		{
			_theme = theme;
			_alignment = spanIdToken.Alignment;
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			ActivitySpanId? spanId = logEvent.SpanId;
			if (!spanId.HasValue)
			{
				return;
			}
			ActivitySpanId valueOrDefault = spanId.GetValueOrDefault();
			int invisibleCharacterCount = 0;
			using (_theme.Apply(context, output, BepInExConsoleThemeStyle.Text, ref invisibleCharacterCount))
			{
				Alignment? alignment = _alignment;
				if (alignment.HasValue)
				{
					Alignment valueOrDefault2 = alignment.GetValueOrDefault();
					Padding.Apply(output, valueOrDefault.ToString(), valueOrDefault2);
				}
				else
				{
					output.Write(valueOrDefault);
				}
			}
		}
	}
	internal class TextTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly BepInExConsoleTheme _theme;

		private readonly string _text;

		public TextTokenRenderer(BepInExConsoleTheme theme, string text)
		{
			_theme = theme;
			_text = text;
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			int invisibleCharacterCount = 0;
			using (_theme.Apply(context, output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				output.Write(_text);
			}
		}
	}
	internal class TimestampTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly struct DateTimeOffsetValue
		{
			public DateTimeOffset Value { get; }

			public DateTimeOffsetValue(DateTimeOffset value)
			{
				Value = value;
			}

			public void Render(TextWriter output, string? format = null, IFormatProvider? formatProvider = null)
			{
				ICustomFormatter customFormatter = (ICustomFormatter)(formatProvider?.GetFormat(typeof(ICustomFormatter)));
				if (customFormatter != null)
				{
					output.Write(customFormatter.Format(format, Value, formatProvider));
				}
				else
				{
					output.Write(Value.ToString(format, formatProvider ?? CultureInfo.InvariantCulture));
				}
			}
		}

		private readonly BepInExConsoleTheme _theme;

		private readonly PropertyToken _token;

		private readonly IFormatProvider? _formatProvider;

		public TimestampTokenRenderer(BepInExConsoleTheme theme, PropertyToken token, IFormatProvider? formatProvider)
		{
			_theme = theme;
			_token = token;
			_formatProvider = formatProvider;
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			DateTimeOffsetValue dateTimeOffsetValue = new DateTimeOffsetValue(logEvent.Timestamp);
			int invisibleCharacterCount = 0;
			using (_theme.Apply(context, output, BepInExConsoleThemeStyle.SecondaryText, ref invisibleCharacterCount))
			{
				if (!_token.Alignment.HasValue)
				{
					dateTimeOffsetValue.Render(output, _token.Format, _formatProvider);
					return;
				}
				StringWriter stringWriter = new StringWriter();
				dateTimeOffsetValue.Render(stringWriter, _token.Format, _formatProvider);
				string value = stringWriter.ToString();
				Padding.Apply(output, value, _token.Alignment);
			}
		}
	}
	internal class TraceIdTokenRenderer : OutputTemplateTokenRenderer
	{
		private readonly BepInExConsoleTheme _theme;

		private readonly Alignment? _alignment;

		public TraceIdTokenRenderer(BepInExConsoleTheme theme, PropertyToken traceIdToken)
		{
			_theme = theme;
			_alignment = traceIdToken.Alignment;
		}

		public override void Render(LogEvent logEvent, BepInExLogContext context, TextWriter output)
		{
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			ActivityTraceId? traceId = logEvent.TraceId;
			if (!traceId.HasValue)
			{
				return;
			}
			ActivityTraceId valueOrDefault = traceId.GetValueOrDefault();
			int invisibleCharacterCount = 0;
			using (_theme.Apply(context, output, BepInExConsoleThemeStyle.Text, ref invisibleCharacterCount))
			{
				Alignment? alignment = _alignment;
				if (alignment.HasValue)
				{
					Alignment valueOrDefault2 = alignment.GetValueOrDefault();
					Padding.Apply(output, valueOrDefault.ToString(), valueOrDefault2);
				}
				else
				{
					output.Write(valueOrDefault);
				}
			}
		}
	}
}
namespace Serilog.Sinks.BepInEx.Formatting
{
	public interface IBepInExTextFormatter
	{
		void Format(LogEvent logEvent, BepInExLogContext context, TextWriter output);
	}
	internal class ThemedDisplayValueFormatter : ThemedValueFormatter
	{
		private readonly IFormatProvider? _formatProvider;

		public ThemedDisplayValueFormatter(BepInExConsoleTheme theme, IFormatProvider? formatProvider)
			: base(theme)
		{
			_formatProvider = formatProvider;
		}

		public override ThemedValueFormatter SwitchTheme(BepInExConsoleTheme theme)
		{
			return new ThemedDisplayValueFormatter(theme, _formatProvider);
		}

		protected override int VisitScalarValue(ThemedValueFormatterState state, ScalarValue scalar)
		{
			if (scalar == null)
			{
				throw new ArgumentNullException("scalar");
			}
			return FormatLiteralValue(scalar, state.LogContext, state.Output, state.Format);
		}

		protected override int VisitSequenceValue(ThemedValueFormatterState state, SequenceValue sequence)
		{
			if (sequence == null)
			{
				throw new ArgumentNullException("sequence");
			}
			int invisibleCharacterCount = 0;
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('[');
			}
			string text = string.Empty;
			for (int i = 0; i < sequence.Elements.Count; i++)
			{
				if (text.Length != 0)
				{
					using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
					{
						state.Output.Write(text);
					}
				}
				text = ", ";
				((LogEventPropertyValueVisitor<ThemedValueFormatterState, int>)this).Visit(state, sequence.Elements[i]);
			}
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write(']');
				return invisibleCharacterCount;
			}
		}

		protected override int VisitStructureValue(ThemedValueFormatterState state, StructureValue structure)
		{
			int invisibleCharacterCount = 0;
			if (structure.TypeTag != null)
			{
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.Name, ref invisibleCharacterCount))
				{
					state.Output.Write(structure.TypeTag);
				}
				state.Output.Write(' ');
			}
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('{');
			}
			string text = string.Empty;
			for (int i = 0; i < structure.Properties.Count; i++)
			{
				if (text.Length != 0)
				{
					using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
					{
						state.Output.Write(text);
					}
				}
				text = ", ";
				LogEventProperty val = structure.Properties[i];
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.Name, ref invisibleCharacterCount))
				{
					state.Output.Write(val.Name);
				}
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
				{
					state.Output.Write('=');
				}
				invisibleCharacterCount += ((LogEventPropertyValueVisitor<ThemedValueFormatterState, int>)this).Visit(state.Nest(), val.Value);
			}
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('}');
				return invisibleCharacterCount;
			}
		}

		protected override int VisitDictionaryValue(ThemedValueFormatterState state, DictionaryValue dictionary)
		{
			int invisibleCharacterCount = 0;
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('{');
			}
			string text = string.Empty;
			foreach (KeyValuePair<ScalarValue, LogEventPropertyValue> element in dictionary.Elements)
			{
				if (text.Length != 0)
				{
					using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
					{
						state.Output.Write(text);
					}
				}
				text = ", ";
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
				{
					state.Output.Write('[');
				}
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.String, ref invisibleCharacterCount))
				{
					invisibleCharacterCount += ((LogEventPropertyValueVisitor<ThemedValueFormatterState, int>)this).Visit(state.Nest(), (LogEventPropertyValue)(object)element.Key);
				}
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
				{
					state.Output.Write("]=");
				}
				invisibleCharacterCount += ((LogEventPropertyValueVisitor<ThemedValueFormatterState, int>)this).Visit(state.Nest(), element.Value);
			}
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('}');
				return invisibleCharacterCount;
			}
		}

		public int FormatLiteralValue(ScalarValue scalar, BepInExLogContext context, TextWriter output, string? format)
		{
			object value = scalar.Value;
			int invisibleCharacterCount = 0;
			if (value == null)
			{
				using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Null, ref invisibleCharacterCount))
				{
					output.Write("null");
					return invisibleCharacterCount;
				}
			}
			if (value is string text)
			{
				using (ApplyStyle(context, output, BepInExConsoleThemeStyle.String, ref invisibleCharacterCount))
				{
					if (format != "l")
					{
						JsonValueFormatter.WriteQuotedJsonString(text, output);
					}
					else
					{
						output.Write(text);
					}
				}
				return invisibleCharacterCount;
			}
			if (value is ValueType)
			{
				if (value is int || value is uint || value is long || value is ulong || value is decimal || value is byte || value is sbyte || value is short || value is ushort || value is float || value is double)
				{
					using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Number, ref invisibleCharacterCount))
					{
						((LogEventPropertyValue)scalar).Render(output, format, _formatProvider);
						return invisibleCharacterCount;
					}
				}
				if (value is bool value2)
				{
					using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Boolean, ref invisibleCharacterCount))
					{
						output.Write(value2);
						return invisibleCharacterCount;
					}
				}
				if (value is char value3)
				{
					using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Scalar, ref invisibleCharacterCount))
					{
						output.Write('\'');
						output.Write(value3);
						output.Write('\'');
						return invisibleCharacterCount;
					}
				}
			}
			using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Scalar, ref invisibleCharacterCount))
			{
				((LogEventPropertyValue)scalar).Render(output, format, _formatProvider);
				return invisibleCharacterCount;
			}
		}
	}
	internal class ThemedJsonValueFormatter : ThemedValueFormatter
	{
		private readonly ThemedDisplayValueFormatter _displayFormatter;

		private readonly IFormatProvider? _formatProvider;

		public ThemedJsonValueFormatter(BepInExConsoleTheme theme, IFormatProvider? formatProvider)
			: base(theme)
		{
			_displayFormatter = new ThemedDisplayValueFormatter(theme, formatProvider);
			_formatProvider = formatProvider;
		}

		public override ThemedValueFormatter SwitchTheme(BepInExConsoleTheme theme)
		{
			return new ThemedJsonValueFormatter(theme, _formatProvider);
		}

		protected override int VisitScalarValue(ThemedValueFormatterState state, ScalarValue scalar)
		{
			if (scalar == null)
			{
				throw new ArgumentNullException("scalar");
			}
			if (state.IsTopLevel)
			{
				return _displayFormatter.FormatLiteralValue(scalar, state.LogContext, state.Output, state.Format);
			}
			return FormatLiteralValue(scalar, state.LogContext, state.Output);
		}

		protected override int VisitSequenceValue(ThemedValueFormatterState state, SequenceValue sequence)
		{
			if (sequence == null)
			{
				throw new ArgumentNullException("sequence");
			}
			int invisibleCharacterCount = 0;
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('[');
			}
			string text = string.Empty;
			for (int i = 0; i < sequence.Elements.Count; i++)
			{
				if (text.Length != 0)
				{
					using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
					{
						state.Output.Write(text);
					}
				}
				text = ", ";
				((LogEventPropertyValueVisitor<ThemedValueFormatterState, int>)this).Visit(state.Nest(), sequence.Elements[i]);
			}
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write(']');
				return invisibleCharacterCount;
			}
		}

		protected override int VisitStructureValue(ThemedValueFormatterState state, StructureValue structure)
		{
			int invisibleCharacterCount = 0;
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('{');
			}
			string text = string.Empty;
			for (int i = 0; i < structure.Properties.Count; i++)
			{
				if (text.Length != 0)
				{
					using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
					{
						state.Output.Write(text);
					}
				}
				text = ", ";
				LogEventProperty val = structure.Properties[i];
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.Name, ref invisibleCharacterCount))
				{
					JsonValueFormatter.WriteQuotedJsonString(val.Name, state.Output);
				}
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
				{
					state.Output.Write(": ");
				}
				invisibleCharacterCount += ((LogEventPropertyValueVisitor<ThemedValueFormatterState, int>)this).Visit(state.Nest(), val.Value);
			}
			if (structure.TypeTag != null)
			{
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
				{
					state.Output.Write(text);
				}
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.Name, ref invisibleCharacterCount))
				{
					JsonValueFormatter.WriteQuotedJsonString("$type", state.Output);
				}
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
				{
					state.Output.Write(": ");
				}
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.String, ref invisibleCharacterCount))
				{
					JsonValueFormatter.WriteQuotedJsonString(structure.TypeTag, state.Output);
				}
			}
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('}');
				return invisibleCharacterCount;
			}
		}

		protected override int VisitDictionaryValue(ThemedValueFormatterState state, DictionaryValue dictionary)
		{
			int invisibleCharacterCount = 0;
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('{');
			}
			string text = string.Empty;
			foreach (KeyValuePair<ScalarValue, LogEventPropertyValue> element in dictionary.Elements)
			{
				if (text.Length != 0)
				{
					using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
					{
						state.Output.Write(text);
					}
				}
				text = ", ";
				BepInExConsoleThemeStyle style = ((element.Key.Value == null) ? BepInExConsoleThemeStyle.Null : ((element.Key.Value is string) ? BepInExConsoleThemeStyle.String : BepInExConsoleThemeStyle.Scalar));
				using (ApplyStyle(state.LogContext, state.Output, style, ref invisibleCharacterCount))
				{
					JsonValueFormatter.WriteQuotedJsonString((element.Key.Value ?? "null").ToString() ?? "", state.Output);
				}
				using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
				{
					state.Output.Write(": ");
				}
				invisibleCharacterCount += ((LogEventPropertyValueVisitor<ThemedValueFormatterState, int>)this).Visit(state.Nest(), element.Value);
			}
			using (ApplyStyle(state.LogContext, state.Output, BepInExConsoleThemeStyle.TertiaryText, ref invisibleCharacterCount))
			{
				state.Output.Write('}');
				return invisibleCharacterCount;
			}
		}

		private int FormatLiteralValue(ScalarValue scalar, BepInExLogContext context, TextWriter output)
		{
			object value = scalar.Value;
			int invisibleCharacterCount = 0;
			if (value == null)
			{
				using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Null, ref invisibleCharacterCount))
				{
					output.Write("null");
					return invisibleCharacterCount;
				}
			}
			if (value is string text)
			{
				using (ApplyStyle(context, output, BepInExConsoleThemeStyle.String, ref invisibleCharacterCount))
				{
					JsonValueFormatter.WriteQuotedJsonString(text, output);
					return invisibleCharacterCount;
				}
			}
			if (value is ValueType)
			{
				if (value is int || value is uint || value is long || value is ulong || value is decimal || value is byte || value is sbyte || value is short || value is ushort)
				{
					using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Number, ref invisibleCharacterCount))
					{
						output.Write(((IFormattable)value).ToString(null, CultureInfo.InvariantCulture));
						return invisibleCharacterCount;
					}
				}
				if (value is double d)
				{
					using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Number, ref invisibleCharacterCount))
					{
						if (double.IsNaN(d) || double.IsInfinity(d))
						{
							JsonValueFormatter.WriteQuotedJsonString(d.ToString(CultureInfo.InvariantCulture), output);
						}
						else
						{
							output.Write(d.ToString("R", CultureInfo.InvariantCulture));
						}
					}
					return invisibleCharacterCount;
				}
				if (value is float num)
				{
					using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Number, ref invisibleCharacterCount))
					{
						if (double.IsNaN(num) || double.IsInfinity(num))
						{
							JsonValueFormatter.WriteQuotedJsonString(num.ToString(CultureInfo.InvariantCulture), output);
						}
						else
						{
							output.Write(num.ToString("R", CultureInfo.InvariantCulture));
						}
					}
					return invisibleCharacterCount;
				}
				if (value is bool flag)
				{
					using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Boolean, ref invisibleCharacterCount))
					{
						output.Write(flag ? "true" : "false");
						return invisibleCharacterCount;
					}
				}
				if (value is char c)
				{
					using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Scalar, ref invisibleCharacterCount))
					{
						JsonValueFormatter.WriteQuotedJsonString(c.ToString(), output);
						return invisibleCharacterCount;
					}
				}
				if (value is DateTime || value is DateTimeOffset)
				{
					using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Scalar, ref invisibleCharacterCount))
					{
						output.Write('"');
						output.Write(((IFormattable)value).ToString("O", CultureInfo.InvariantCulture));
						output.Write('"');
						return invisibleCharacterCount;
					}
				}
			}
			using (ApplyStyle(context, output, BepInExConsoleThemeStyle.Scalar, ref invisibleCharacterCount))
			{
				JsonValueFormatter.WriteQuotedJsonString(value.ToString() ?? "", output);
				return invisibleCharacterCount;
			}
		}
	}
	internal abstract class ThemedValueFormatter : LogEventPropertyValueVisitor<ThemedValueFormatterState, int>
	{
		private readonly BepInExConsoleTheme _theme;

		protected ThemedValueFormatter(BepInExConsoleTheme theme)
		{
			_theme = theme ?? throw new ArgumentNullException("theme");
		}

		protected BepInExStyleReset ApplyStyle(BepInExLogContext context, TextWriter output, BepInExConsoleThemeStyle style, ref int invisibleCharacterCount)
		{
			return _theme.Apply(context, output, style, ref invisibleCharacterCount);
		}

		public int Format(LogEventPropertyValue value, BepInExLogContext context, TextWriter output, string? format, bool literalTopLevel = false)
		{
			return ((LogEventPropertyValueVisitor<ThemedValueFormatterState, int>)this).Visit(new ThemedValueFormatterState
			{
				LogContext = context,
				Output = output,
				Format = format,
				IsTopLevel = literalTopLevel
			}, value);
		}

		public abstract ThemedValueFormatter SwitchTheme(BepInExConsoleTheme theme);
	}
	internal struct ThemedValueFormatterState
	{
		public BepInExLogContext LogContext;

		public TextWriter Output;

		public string? Format;

		public bool IsTopLevel;

		public ThemedValueFormatterState Nest()
		{
			ThemedValueFormatterState result = default(ThemedValueFormatterState);
			result.LogContext = LogContext;
			result.Output = Output;
			return result;
		}
	}
}
namespace Serilog.Sinks.BepInEx.Formatting.Display
{
	public static class OutputProperties
	{
		public const string SourceNamePropertyName = "SourceName";
	}
}
namespace Serilog.Sinks.BepInEx.Extensions
{
	public static class ExceptionExtensions
	{
		private static string InnerExceptionDelimiter => string.Concat(Environment.NewLine, string.Concat(Enumerable.Repeat("─", 10)), Environment.NewLine, Environment.NewLine);

		public static string Render(this Exception exception, ExceptionRenderStyleFlags style, ExceptionRenderStyleFlags? recursiveStyle = null)
		{
			ExceptionRenderStyleFlags valueOrDefault = recursiveStyle.GetValueOrDefault();
			if (!recursiveStyle.HasValue)
			{
				valueOrDefault = style;
				recursiveStyle = valueOrDefault;
			}
			if (exception != null)
			{
				if (exception is AggregateException aggregateException)
				{
					return RenderAggregate(aggregateException, style, recursiveStyle.Value);
				}
				return RenderRecursively(exception, style, recursiveStyle.Value);
			}
			throw new ArgumentNullException("Exception", "Exception cannot be null");
		}

		private static string RenderAggregate(AggregateException aggregateException, ExceptionRenderStyleFlags style, ExceptionRenderStyleFlags recursiveStyle)
		{
			IEnumerable<string> values = from innerException in aggregateException.Flatten().InnerExceptions
				select innerException.Render(style, recursiveStyle) into rendered
				select rendered.MultilineIndent(4);
			bool flag = style.Has(ExceptionRenderStyleFlags.IncludeType);
			return new StringBuilder(200).AppendLine(RenderKernel(aggregateException, flag) ?? "Issues:").Append(flag ? ("{" + Environment.NewLine) : string.Empty).AppendLine(string.Join(InnerExceptionDelimiter, values))
				.Append(flag ? "}" : string.Empty)
				.ToString()
				.TrimEnd();
		}

		private static string? RenderKernel(Exception exception, bool shouldIncludeType)
		{
			bool flag = !string.IsNullOrWhiteSpace(exception.Message);
			if (flag && shouldIncludeType)
			{
				return $"{exception.GetType()}: {exception.Message}";
			}
			if (flag)
			{
				return exception.Message;
			}
			if (shouldIncludeType)
			{
				return exception.GetType().ToString();
			}
			return null;
		}

		private static string RenderDefault(Exception exception, ExceptionRenderStyleFlags style)
		{
			if (style.Has(ExceptionRenderStyleFlags.IncludeInner))
			{
				throw new NotSupportedException("RenderDefault cannot include inner exceptions. Use RenderRecursively.");
			}
			StringBuilder stringBuilder = new StringBuilder(100);
			stringBuilder.AppendLine(RenderKernel(exception, style.Has(ExceptionRenderStyleFlags.IncludeType)) ?? "[no message]");
			if (style.Has(ExceptionRenderStyleFlags.IncludeStackTrace) && exception.StackTrace != null)
			{
				stringBuilder.AppendLine(exception.StackTrace);
			}
			return stringBuilder.ToString().TrimEnd();
		}

		private static string RenderRecursively(Exception exception, ExceptionRenderStyleFlags style, ExceptionRenderStyleFlags recursiveStyle)
		{
			if (!style.Has(ExceptionRenderStyleFlags.IncludeInner))
			{
				return RenderDefault(exception, style);
			}
			StringBuilder stringBuilder = new StringBuilder(100);
			stringBuilder.AppendLine(RenderKernel(exception, style.Has(ExceptionRenderStyleFlags.IncludeType)) ?? "[no message]");
			if (style.Has(ExceptionRenderStyleFlags.IncludeStackTrace) && exception.StackTrace != null)
			{
				stringBuilder.AppendLine(exception.StackTrace);
			}
			if (style.Has(ExceptionRenderStyleFlags.IncludeInner) && exception.InnerException != null)
			{
				string text = exception.InnerException.Render(recursiveStyle).Trim();
				stringBuilder.AppendLine("Caused by: " + text);
			}
			return stringBuilder.ToString().TrimEnd();
		}
	}
	public static class LogEventExtensions
	{
		public static string RenderException(this LogEvent logEvent, ExceptionRenderStyleFlags styleFlags, ExceptionRenderStyleFlags? recursiveStyleFlags = null)
		{
			if (logEvent.Exception == null)
			{
				throw new InvalidOperationException("logEvent.Exception cannot be null");
			}
			return logEvent.Exception.Render(styleFlags, recursiveStyleFlags);
		}
	}
	public static class LogEventLevelExtensions
	{
		public static LogLevel ToBepInExLevel(this LogEventLevel level)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Expected I4, but got Unknown
			//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_002b: 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_0033: 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_0050: 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)
			return (LogLevel)((int)level switch
			{
				0 => 32, 
				1 => 16, 
				2 => 8, 
				3 => 4, 
				4 => 2, 
				5 => 1, 
				_ => throw new ArgumentOutOfRangeException("level", level, "Unrecognised LogEventLevel"), 
			});
		}
	}
	public static class LogLevelExtensions
	{
		public static string GetLevelAnsiReset(this LogLevel level)
		{
			//IL_0000: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Invalid comparison between Unknown and I4
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Invalid comparison between Unknown and I4
			//IL_0004: 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_001c: Expected I4, but got Unknown
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Invalid comparison between Unknown and I4
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Invalid comparison between Unknown and I4
			if ((int)level <= 8)
			{
				switch (level - 1)
				{
				default:
					if ((int)level != 8)
					{
						break;
					}
					return "\u001b[m";
				case 3:
					return "\u001b[0;38;5;11m";
				case 1:
					return "\u001b[0;1;38;5;1m";
				case 0:
					return "\u001b[0;1;38;5;9m";
				case 2:
					break;
				}
			}
			else
			{
				if ((int)level == 16)
				{
					return "\u001b[0;38;5;7m";
				}
				if ((int)level == 32)
				{
					return "\u001b[0;38;5;8m";
				}
			}
			return "\u001b[m";
		}
	}
	public static class StringExtensions
	{
		public static string Indent(this string input, int spaces)
		{
			return string.Concat(string.Concat(Enumerable.Repeat(" ", spaces)), input);
		}

		public static string MultilineIndent(this string input, int spaces)
		{
			return string.Join(Environment.NewLine, from line in input.Split("\n")
				select line.Trim() into line
				select line.Indent(spaces));
		}
	}
}