Decompiled source of AutogenRundown v0.58.1
AutogenRundown.dll
Decompiled 4 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Numerics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using AutogenRundown.DataBlocks; using AutogenRundown.DataBlocks.Alarms; using AutogenRundown.DataBlocks.Custom.AdvancedWardenObjective; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization.Abilities; using AutogenRundown.DataBlocks.Custom.ExtraEnemyCustomization.Models; using AutogenRundown.DataBlocks.Custom.ExtraObjectiveSetup; using AutogenRundown.DataBlocks.Custom.ExtraObjectiveSetup.ExtensionSecuritySensor; using AutogenRundown.DataBlocks.Dimensions; using AutogenRundown.DataBlocks.Enemies; using AutogenRundown.DataBlocks.Enums; using AutogenRundown.DataBlocks.Items; using AutogenRundown.DataBlocks.Levels; using AutogenRundown.DataBlocks.Light; using AutogenRundown.DataBlocks.Objectives; using AutogenRundown.DataBlocks.Objectives.Reactor; using AutogenRundown.DataBlocks.Terminals; using AutogenRundown.DataBlocks.ZoneData; using AutogenRundown.DataBlocks.Zones; using AutogenRundown.Extensions; using AutogenRundown.GeneratorData; using AutogenRundown.Patches; using AutogenRundown.PeerMods; using AutogenRundown.Utils; using BepInEx; using BepInEx.Configuration; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using CellMenu; using HarmonyLib; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using TMPro; using UnityEngine; using YamlDotNet.Serialization; using YamlDotNet.Serialization.NamingConventions; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("AutogenRundown")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("AutogenRundown")] [assembly: AssemblyTitle("AutogenRundown")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.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] [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; } } } namespace AutogenRundown { public enum Complexity { Low, Medium, High } public class BuildDirector { public int Points { get; set; } public Complexity Complexity { get; set; } public string Tier { get; set; } = "A"; public Bulkhead Bulkhead { get; set; } = Bulkhead.Main; public Complex Complex { get; set; } public LevelSettings Settings { get; set; } = new LevelSettings(); public WardenObjectiveType Objective { get; set; } = WardenObjectiveType.GatherSmallItems; [Obsolete("Prefer specifying the number of zones in each objective layout")] public int ZoneCount { get; set; } public List<int> EnemyPointPool { get; set; } = new List<int>(); public void GenObjective(IEnumerable<WardenObjectiveType> exclude) { IEnumerable<WardenObjectiveType> exclude2 = exclude; List<WardenObjectiveType> list = new List<WardenObjectiveType> { WardenObjectiveType.HsuFindSample, WardenObjectiveType.ReactorStartup, WardenObjectiveType.ReactorShutdown, WardenObjectiveType.GatherSmallItems, WardenObjectiveType.ClearPath, WardenObjectiveType.SpecialTerminalCommand, WardenObjectiveType.RetrieveBigItems, WardenObjectiveType.PowerCellDistribution, WardenObjectiveType.TerminalUplink, WardenObjectiveType.Survival, WardenObjectiveType.TimedTerminalSequence }; list.RemoveAll((WardenObjectiveType o) => exclude2.Contains(o)); if (!Bulkhead.HasFlag(Bulkhead.Main)) { list.Remove(WardenObjectiveType.ClearPath); list.Remove(WardenObjectiveType.Survival); } if (Bulkhead.HasFlag(Bulkhead.Main)) { list.Remove(WardenObjectiveType.SpecialTerminalCommand); } if (Complex != Complex.Mining || Complex != Complex.Tech) { list.Remove(WardenObjectiveType.CentralGeneratorCluster); } if (Bulkhead.HasFlag(Bulkhead.Overload) && exclude2.Contains(WardenObjectiveType.Survival)) { list = new List<WardenObjectiveType> { WardenObjectiveType.SpecialTerminalCommand }; } Objective = Generator.Pick(list); } public void GenPoints() { string tier = Tier; Bulkhead bulkhead = Bulkhead; int points; switch (tier) { case "A": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_010a; case Bulkhead.Overload: goto IL_0132; default: goto IL_015a; } points = 400; break; case "B": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_0112; case Bulkhead.Overload: goto IL_013a; default: goto IL_015a; } points = 500; break; case "C": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_011a; case Bulkhead.Overload: goto IL_0142; default: goto IL_015a; } points = 800; break; case "D": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_0122; case Bulkhead.Overload: goto IL_014a; default: goto IL_015a; } points = 800; break; case "E": switch (bulkhead) { case Bulkhead.Main: break; case Bulkhead.Extreme: goto IL_012a; case Bulkhead.Overload: goto IL_0152; default: goto IL_015a; } points = 800; break; default: goto IL_015a; IL_0152: points = 800; break; IL_012a: points = 800; break; IL_014a: points = 800; break; IL_0122: points = 800; break; IL_015a: points = 600; break; IL_0142: points = 800; break; IL_011a: points = 800; break; IL_0132: points = 400; break; IL_013a: points = 500; break; IL_0112: points = 500; break; IL_010a: points = 400; break; } Points = points; } [Obsolete("Prefer specifying the number of zones in each objective layout")] public void GenZones() { string tier = Tier; Bulkhead bulkhead = Bulkhead; ZoneCount = tier switch { "A" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.4, 1), (1.0, 2) }) : Generator.Select(new List<(double, int)> { (0.4, 1), (1.0, 2), (1.0, 3) }), "B" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.4, 1), (1.0, 2), (1.0, 3) }) : Generator.Select(new List<(double, int)> { (0.4, 2), (1.0, 3), (1.0, 4), (0.2, 5) }), "C" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.3, 1), (0.9, 2), (1.0, 3) }) : Generator.Select(new List<(double, int)> { (0.9, 3), (1.0, 4), (1.0, 5) }), "D" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.6, 2), (0.9, 3), (1.0, 4) }) : Generator.Select(new List<(double, int)> { (0.6, 3), (0.9, 4), (1.0, 5), (0.3, 6) }), "E" => (bulkhead != Bulkhead.Main) ? Generator.Select(new List<(double, int)> { (0.5, 2), (1.0, 3), (1.0, 4), (0.1, 5) }) : Generator.Select(new List<(double, int)> { (0.4, 3), (0.9, 4), (1.0, 5), (0.8, 6), (0.1, 7) }), _ => 1, }; EnemyPointPool = (from _ in Enumerable.Range(0, ZoneCount) select Points / ZoneCount).ToList(); } public int GetPoints(Zone zone) { double num = (zone.Coverage.Min + zone.Coverage.Max) / 2.0 / 30.0 * zone.EnemyPointsMultiplier; return (int)(num * (double)(Tier switch { "A" => Generator.Random.Next(20, 25), "B" => Generator.Random.Next(23, 27), "C" => Generator.Random.Next(25, 30), "D" => Generator.Random.Next(30, 35), "E" => Generator.Random.Next(35, 40), _ => 25, })); } } public class Collections { public static List<T> Flatten<T>(params ICollection<T>[] collections) { return collections.SelectMany((ICollection<T> c) => c).ToList(); } } public class ComplexResourceSet { private const string FileName = "GameData_ComplexResourceSetDataBlock_bin.json"; private JObject resourceSet; public ComplexResourceSet() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown using StreamReader streamReader = File.OpenText(Path.Combine(Paths.PluginPath, "the_tavern-AutogenRundown", "GameData_ComplexResourceSetDataBlock_bin.json")); JsonTextReader val = new JsonTextReader((TextReader)streamReader); try { resourceSet = (JObject)JToken.ReadFrom((JsonReader)(object)val); if (resourceSet["Blocks"] == null) { Plugin.Logger.LogFatal((object)"No complex resource set data blocks found"); throw new Exception("No complex resource set data blocks found"); } } finally { ((IDisposable)val)?.Dispose(); } } private void WriteFile() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown int revision = CellBuildData.GetRevision(); Path.Combine(Paths.PluginPath, "the_tavern-AutogenRundown", "GameData_ComplexResourceSetDataBlock_bin.json"); string text = Path.Combine(Paths.BepInExRootPath, "GameData", $"{revision}"); string path = Path.Combine(text, "GameData_ComplexResourceSetDataBlock_bin.json"); Directory.CreateDirectory(text); using StreamWriter streamWriter = File.CreateText(path); JsonTextWriter val = new JsonTextWriter((TextWriter)streamWriter); try { ((JToken)resourceSet).WriteTo((JsonWriter)(object)val, Array.Empty<JsonConverter>()); } finally { ((IDisposable)val)?.Dispose(); } } public JArray GetPrefabs(int persistentId, string group) { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown JObject obj = ((IEnumerable)resourceSet["Blocks"]).OfType<JObject>().First((JObject block) => (int?)block["persistentID"] == persistentId); if (obj[group] == null) { Plugin.Logger.LogFatal((object)"No complex resource set data blocks found"); throw new Exception("No complex resource set data blocks found"); } return (JArray)obj[group]; } public JArray GetPrefabs(Complex complex, string group) { return GetPrefabs((int)complex, group); } public void AddPrefab(Complex complex, string group, Prefab prefab) { GetPrefabs(complex, group).Insert(0, (JToken)(object)JObject.FromObject((object)prefab)); } public static void Setup() { ComplexResourceSet complexResourceSet = new ComplexResourceSet(); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/AssetPrefabs/Complex/Mining/Geomorphs/geo_32x32_elevator_shaft_dig_site_04.prefab", SubComplex = SubComplex.DigSite }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/AssetPrefabs/Complex/Mining/Geomorphs/Refinery/geo_64x64_mining_refinery_X_HA_04_test.prefab", SubComplex = SubComplex.Storage }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_mining_dig_site_t_dak_01.prefab", SubComplex = SubComplex.DigSite }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_dig_site_i_dak_01.prefab", SubComplex = SubComplex.DigSite }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Exit_1x1", new Prefab { Asset = "Assets/geo_64x64_dig_site_exit_dak_01.prefab", SubComplex = SubComplex.DigSite }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_dig_site_dead_end_dak_01.prefab", SubComplex = SubComplex.DigSite }); complexResourceSet.AddPrefab(Complex.Mining, "GeomorphTiles_1x1", new Prefab { Asset = "Assets/Prefabs/Geomorph/Mining/geo_storage_FA_01.prefab", SubComplex = SubComplex.Storage }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Prefabs/Geomorph/Mining/geo_storage_FA_dead_end_01.prefab", SubComplex = SubComplex.Storage }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Mining/geo_64x64_mining_digsite_dead_end_RLC_01.prefab", SubComplex = SubComplex.DigSite }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Exit_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Mining/geo_64x64_mining_storage_exit_hub_RLC_01.prefab", SubComplex = SubComplex.Storage }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Mining/geo_64x64_mining_storage_I_RLC_01.prefab", SubComplex = SubComplex.Storage }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Mining/geo_64x64_mining_refinery_X_RLC_01.prefab", SubComplex = SubComplex.Refinery }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Mining/geo_64x64_mining_refinery_I_RLC_01.prefab", SubComplex = SubComplex.Refinery }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Mining/geo_64x64_mining_refinery_portal_I_RLC_01.prefab", SubComplex = SubComplex.Refinery }); complexResourceSet.AddPrefab(Complex.Mining, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Mining/geo_64x64_mining_reactor_RLC_01.prefab", SubComplex = SubComplex.All }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_tech_data_center_I_tile_DS_1.prefab", SubComplex = SubComplex.DataCenter }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_tech_data_center_hub_DS_01.prefab", SubComplex = SubComplex.DataCenter }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_data_center_reactor_DS_01.prefab", SubComplex = SubComplex.DataCenter }); complexResourceSet.AddPrefab(Complex.Tech, "GeomorphTiles_1x1", new Prefab { Asset = "Assets/Prefabs/Geomorph/Tech/geo_lab_FA_01.prefab", SubComplex = SubComplex.Lab }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Prefabs/Geomorph/Tech/geo_lab_FA_dead_end_01.prefab", SubComplex = SubComplex.Lab }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Prefabs/Geomorph/Tech/geo_datacenter_FA_I_01.prefab", SubComplex = SubComplex.DataCenter }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Exit_1x1", new Prefab { Asset = "Assets/Prefabs/Geomorph/Tech/geo_datacenter_FA_exit_01.prefab", SubComplex = SubComplex.DataCenter }); complexResourceSet.AddPrefab(Complex.Tech, "ElevatorShafts_1x1", new Prefab { Asset = "Assets/Prefabs/Geomorph/Tech/geo_datacenter_FA_elevator_shaft_01.prefab", SubComplex = SubComplex.DataCenter }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Tech/geo_64x64_tech_lab_I_RLC_01.prefab", SubComplex = SubComplex.Lab }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Tech/geo_64x64_tech_lab_Hub_RLC_01.prefab", SubComplex = SubComplex.Lab }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Tech/geo_64x64_tech_data_center_hub_JG_RLC_02_v3.prefab", SubComplex = SubComplex.DataCenter }); complexResourceSet.AddPrefab(Complex.Tech, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Bundles/RLC_Tech/geo_64x64_tech_datacenter_I_RLC_01.prefab", SubComplex = SubComplex.DataCenter }); complexResourceSet.AddPrefab(Complex.Service, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/AssetPrefabs/Complex/Service/Geomorphs/Maintenance/geo_64x64_service_floodways_dead_end_HA_02.prefab", SubComplex = SubComplex.Floodways }); complexResourceSet.AddPrefab(Complex.Service, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/AssetPrefabs/Complex/Service/Geomorphs/Maintenance/geo_64x64_service_floodways_hub_HA_03_V2.prefab", SubComplex = SubComplex.Floodways }); complexResourceSet.AddPrefab(Complex.Service, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_service_floodways_hub_DS_01.prefab", SubComplex = SubComplex.Floodways }); complexResourceSet.AddPrefab(Complex.Service, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_service_floodways_boss_hub_DS_01.prefab", SubComplex = SubComplex.Floodways }); complexResourceSet.AddPrefab(Complex.Service, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_service_floodways_hub_ds_02.prefab", SubComplex = SubComplex.Floodways }); complexResourceSet.AddPrefab(Complex.Service, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_service_floodways_reactor_ds_01.prefab", SubComplex = SubComplex.Floodways }); complexResourceSet.AddPrefab(Complex.Service, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/geo_64x64_service_floodways_i_bridge_ds_01.prefab", SubComplex = SubComplex.Floodways }); complexResourceSet.AddPrefab(Complex.Service, "CustomGeomorphs_Objective_1x1", new Prefab { Asset = "Assets/Prefabs/Geomorph/Service/geo_floodways_FA_reactor_01.prefab", SubComplex = SubComplex.Floodways }); complexResourceSet.WriteFile(); } } public static class Text { public static string ToRoman(int number) { if (number < 0 || number > 3999) { throw new ArgumentOutOfRangeException("number", "insert value between 1 and 3999"); } if (number < 1) { return string.Empty; } if (number >= 1000) { return "M" + ToRoman(number - 1000); } if (number >= 900) { return "CM" + ToRoman(number - 900); } if (number >= 500) { return "D" + ToRoman(number - 500); } if (number >= 400) { return "CD" + ToRoman(number - 400); } if (number >= 100) { return "C" + ToRoman(number - 100); } if (number >= 90) { return "XC" + ToRoman(number - 90); } if (number >= 50) { return "L" + ToRoman(number - 50); } if (number >= 40) { return "XL" + ToRoman(number - 40); } if (number >= 10) { return "X" + ToRoman(number - 10); } if (number >= 9) { return "IX" + ToRoman(number - 9); } if (number >= 5) { return "V" + ToRoman(number - 5); } if (number >= 4) { return "IV" + ToRoman(number - 4); } if (number >= 1) { return "I" + ToRoman(number - 1); } return ""; } } public enum PidOffsets { None, Normal, Enemy, EnemyGroup, WavePopulation, WaveSettings } public static class Generator { public interface ISelectable { double Weight { get; set; } } public static uint pid = 100000u; private static uint enemyPid = 70u; private static uint enemyGroupPid = 80u; private static uint wavePopulationPid = 200u; private static uint waveSettingsPid = 1u; public static int MonthNumber { get; set; } = -1; public static int WeekNumber { get; set; } = -1; public static string DisplaySeed { get; set; } = ""; public static string Seed { get; set; } = ""; public static Random Random { get; private set; } = new Random(); public static double NextDouble() { return Random.NextDouble(); } public static double NextDouble(double min, double max) { return Random.NextDouble() * (max - min) + min; } public static double NextDouble(double max) { return Random.NextDouble() * max; } public static int Between(int min, int max) { return Random.Next(min, max + 1); } public static bool Flip(double chance = 0.5) { return Random.NextDouble() < chance; } public static T? Pick<T>(IEnumerable<T> collection) { if (collection.Count() <= 0) { return default(T); } return collection.ElementAt(Random.Next(collection.Count())); } public static T? Draw<T>(ICollection<T> collection) { T val = Pick(collection); if (val != null) { collection.Remove(val); } return val; } public static List<T> Shuffle<T>(ICollection<T> collection) { return collection.OrderBy((T _) => Random.Next()).ToList(); } public static T Select<T>(ICollection<T> collection) where T : ISelectable { double num = collection.Sum((T x) => x.Weight); double num2 = Random.NextDouble() * num; double num3 = 0.0; foreach (T item in collection) { num3 += item.Weight; if (num2 <= num3) { return item; } } return collection.Last(); } public static T Select<T>(ICollection<(double, T)> collection) { double num = collection.Sum<(double, T)>(((double, T) x) => x.Item1); double num2 = Random.NextDouble() * num; double num3 = 0.0; foreach (var item3 in collection) { double item = item3.Item1; T item2 = item3.Item2; num3 += item; if (num2 <= num3) { return item2; } } return collection.Last().Item2; } public static void SelectRun(ICollection<(double, Action)> collection) { double num = collection.Sum<(double, Action)>(((double, Action) x) => x.Item1); double num2 = Random.NextDouble() * num; double num3 = 0.0; foreach (var item3 in collection) { double item = item3.Item1; Action item2 = item3.Item2; num3 += item; if (!(num2 > num3)) { item2(); return; } } collection.Last().Item2(); } public static T DrawSelect<T>(ICollection<(double, int, T)> collection, bool fixedWeights = false) { double num = collection.Sum<(double, int, T)>(((double, int, T) x) => fixedWeights ? x.Item1 : (x.Item1 * (double)x.Item2)); double num2 = Random.NextDouble() * num; double num3 = 0.0; for (int i = 0; i < collection.Count; i++) { (double, int, T) tuple = collection.ElementAt(i); (double, int, T) tuple2 = tuple; double item = tuple2.Item1; int item2 = tuple2.Item2; T item3 = tuple2.Item3; num3 += item * (double)item2; if (num2 <= num3) { collection.Remove(tuple); tuple.Item2--; if (tuple.Item2 > 0) { collection.Add(tuple); } return item3; } } (double, int, T) item4 = collection.Last(); collection.Remove(item4); item4.Item2--; if (item4.Item2 > 0) { collection.Add(item4); } return item4.Item3; } public static uint GetPersistentId(PidOffsets offset = PidOffsets.Normal) { switch (offset) { case PidOffsets.None: return 0u; case PidOffsets.Normal: return pid++; case PidOffsets.Enemy: return enemyPid++; case PidOffsets.EnemyGroup: return enemyGroupPid++; case PidOffsets.WavePopulation: return wavePopulationPid++; case PidOffsets.WaveSettings: return waveSettingsPid++; default: { global::<PrivateImplementationDetails>.ThrowSwitchExpressionException(offset); uint result = default(uint); return result; } } } public static void GenerateTimeSeed() { DateTime utcNow = DateTime.UtcNow; TimeZoneInfo destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); DateTime dateTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, destinationTimeZone); string seed = dateTime.ToString("yyyy_MM_dd"); string text = dateTime.ToString("MM/dd"); Seed = seed; DisplaySeed = "<color=orange>" + text + "</color>"; } public static void SetMonthSeed() { DateTime utcNow = DateTime.UtcNow; TimeZoneInfo destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); DateTime dateTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, destinationTimeZone); string seed = dateTime.ToString("yyyy_MM"); string text = dateTime.ToString("MMMM"); Seed = seed; DisplaySeed = "<color=orange>" + text + "</color>"; MonthNumber = dateTime.Month; } public static void SetWeeklySeed() { DateTime utcNow = DateTime.UtcNow; TimeZoneInfo destinationTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); DateTime dateTime = TimeZoneInfo.ConvertTimeFromUtc(utcNow, destinationTimeZone); int weekOfYear = CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstFullWeek, DayOfWeek.Tuesday); string seed = $"{dateTime:yyyy}_{weekOfYear}"; string text = $"Week {weekOfYear}"; Seed = seed; DisplaySeed = "<color=orange>" + text + "</color>"; WeekNumber = weekOfYear; } public static void Reload() { Random = new Random(GetHashCode(Seed)); } public static void ReadOrSetSeed(string seed = "") { if (seed != "") { Seed = seed; DisplaySeed = "<color=orange>" + seed + "</color>"; } else { GenerateTimeSeed(); } } public static void AdvanceSequence(int rounds) { while (rounds-- > 0) { Random.Next(); } } public static void WriteSeed() { string text = Path.Combine(Paths.PluginPath, "MyFirstPlugin"); string path = Path.Combine(text, "seed.txt"); Directory.CreateDirectory(text); using FileStream stream = File.Create(path); using StreamWriter streamWriter = new StreamWriter(stream); streamWriter.WriteLine(Seed); } private static int GetHashCode(this string str) { int num = 5381; int num2 = num; for (int i = 0; i < str.Length && str[i] != 0; i += 2) { num = ((num << 5) + num) ^ str[i]; if (i == str.Length - 1 || str[i + 1] == '\0') { break; } num2 = ((num2 << 5) + num2) ^ str[i + 1]; } return num + num2 * 1566083941; } } public class LocalProgression { public static void WriteConfig() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) new JsonSerializer().Formatting = (Formatting)1; int revision = CellBuildData.GetRevision(); string text = Path.Combine(Paths.BepInExRootPath, "GameData", $"{revision}", "Custom", "LocalProgressionConfig"); string path = Path.Combine(text, "ProgressionConfig.json"); Directory.CreateDirectory(text); using StreamWriter streamWriter = new StreamWriter(path); streamWriter.Write($"{{\n \"Configs\": [\n {{\n \"RundownID\": {Rundown.R_Daily},\n \"EnableNoBoosterUsedProgressionForRundown\": true,\n \"AlwaysShowIcon\": true,\n \"Expeditions\": []\n }},\n {{\n \"RundownID\": {Rundown.R_Weekly},\n \"EnableNoBoosterUsedProgressionForRundown\": true,\n \"AlwaysShowIcon\": true,\n \"Expeditions\": []\n }},\n {{\n \"RundownID\": {Rundown.R_Monthly},\n \"EnableNoBoosterUsedProgressionForRundown\": true,\n \"AlwaysShowIcon\": true,\n \"Expeditions\": []\n }}\n ]\n}}"); streamWriter.Flush(); } } public static class Peers { private static List<Mod> Mods { get; set; } = new List<Mod>(); public static void Init() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown try { string text = File.ReadAllText(Path.Combine(Paths.BepInExRootPath, "..", "mods.yml")); Mods = ((BuilderSkeleton<DeserializerBuilder>)new DeserializerBuilder()).WithNamingConvention(CamelCaseNamingConvention.Instance).Build().Deserialize<List<Mod>>(text); } catch (FileNotFoundException) { Plugin.Logger.LogWarning((object)"Peers.Init(): Could not find mods.yml"); } } public static bool HasMod(string name) { string name2 = name; return Mods.Any((Mod mod) => mod.Name == name2 && mod.Enabled); } public static void Configure() { LocalProgression.WriteConfig(); Arsenality.Configure(); } } [BepInPlugin("000-the_tavern-AutogenRundown", "AutogenRundown", "0.58.1")] [BepInProcess("GTFO.exe")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BasePlugin { public const string Version = "0.58.1"; public const string Name = "the_tavern-AutogenRundown"; public static ManualLogSource Logger { get; private set; } = new ManualLogSource("AutogenRundown"); public override void Load() { //IL_001b: 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_003a: Expected O, but got Unknown //IL_003a: Expected O, but got Unknown //IL_004b: 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_0066: Expected O, but got Unknown //IL_0066: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Expected O, but got Unknown //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Expected O, but got Unknown //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected O, but got Unknown //IL_017f: Unknown result type (might be due to invalid IL or missing references) Logger = ((BasePlugin)this).Log; ConfigEntry<string> val = ((BasePlugin)this).Config.Bind<string>(new ConfigDefinition("AutogenRundown", "Seed"), "", new ConfigDescription("Specify a seed to override rundown generation", (AcceptableValueBase)null, Array.Empty<object>())); ConfigEntry<bool> val2 = ((BasePlugin)this).Config.Bind<bool>(new ConfigDefinition("AutogenRundown", "RegenerateOnStartup"), true, new ConfigDescription("Should datablocks be regenerated on game startup.", (AcceptableValueBase)null, Array.Empty<object>())); ManualLogSource log = ((BasePlugin)this).Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val3 = new BepInExInfoLogInterpolatedStringHandler(13, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("ConfigSeed=\""); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(val.Value); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("\""); } log.LogInfo(val3); ManualLogSource log2 = ((BasePlugin)this).Log; val3 = new BepInExInfoLogInterpolatedStringHandler(20, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("RegenerateOnStartup="); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<bool>(val2.Value); } log2.LogInfo(val3); if (val2.Value) { Peers.Init(); RundownFactory.Build(val.Value); ManualLogSource log3 = ((BasePlugin)this).Log; val3 = new BepInExInfoLogInterpolatedStringHandler(26, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("Rundown generated, Seed=\""); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(Generator.Seed); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("\""); } log3.LogInfo(val3); } else { ManualLogSource log4 = ((BasePlugin)this).Log; val3 = new BepInExInfoLogInterpolatedStringHandler(30, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("Rundown not generated, Seed=\""); ((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<string>(Generator.Seed); ((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("\""); } log4.LogInfo(val3); } PlayFabManager.OnTitleDataUpdated += Action.op_Implicit((Action)RundownNames.OnTitleDataUpdated); new Harmony("the_tavern-AutogenRundown").PatchAll(); } } public record Prefab { [JsonProperty("Prefab")] public string Asset { get; set; } = ""; public SubComplex SubComplex { get; set; } = SubComplex.All; public string Shard { get; set; } = "S1"; } public static class RundownFactory { private static string DescriptionHeader(WardenObjectiveType objectiveType) { string text = "<color=#444444>Objective Dispatch:</color> "; return objectiveType switch { WardenObjectiveType.HsuFindSample => text + "<color=orange>HSU Extraction</color>\n", WardenObjectiveType.ReactorStartup => text + "<color=orange>Reactor Startup</color>\n", WardenObjectiveType.ReactorShutdown => text + "<color=orange>Reactor Shutdown</color>\n", WardenObjectiveType.GatherSmallItems => text + "<color=orange>Gather Items</color>\n", WardenObjectiveType.ClearPath => text + "<color=orange>Sector Survey</color>\n", WardenObjectiveType.SpecialTerminalCommand => text + "<color=orange>Manual Terminal Override</color>\n", WardenObjectiveType.RetrieveBigItems => text + "<color=orange>Package Extraction</color>\n", WardenObjectiveType.PowerCellDistribution => text + "<color=orange>Power Cell Distribution</color>\n", WardenObjectiveType.TerminalUplink => text + "<color=orange>Network Uplink</color>\n", WardenObjectiveType.Survival => text + "<color=orange>Diversion Protocol</color>\n", WardenObjectiveType.TimedTerminalSequence => text + "<color=orange>Timed Sequence</color>\n", _ => "", }; } public static Rundown BuildRundown(Rundown newRundown, bool withFixed = true, bool withUnlocks = true) { Rundown rundown = Rundown.Build(newRundown); List<string> collection = Words.NewLevelNamesPack(); for (int i = 0; i < rundown.TierA_Count; i++) { int num = 1; if (rundown.BuildSeedPool.Count > 0) { num = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num); } Level level = Level.Build(new Level("A") { Name = Generator.Draw(collection), Index = i + 1, BuildSeed = num }); rundown.AddLevel(level); } for (int j = 0; j < rundown.TierB_Count; j++) { int num2 = 1; if (rundown.BuildSeedPool.Count > 0) { num2 = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num2); } Level level2 = Level.Build(new Level("B") { Name = Generator.Draw(collection), Index = j + 1, BuildSeed = num2 }); rundown.AddLevel(level2); } for (int k = 0; k < rundown.TierC_Count; k++) { int num3 = 1; if (rundown.BuildSeedPool.Count > 0) { num3 = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num3); } Level level3 = Level.Build(new Level("C") { Name = Generator.Draw(collection), Index = k + 1, BuildSeed = num3 }); rundown.AddLevel(level3); } if (withFixed) { WardenObjectiveType wardenObjectiveType = WardenObjectiveType.Survival; BuildDirector buildDirector = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = Complex.Tech, Tier = "B", Objective = wardenObjectiveType }; buildDirector.GenPoints(); BuildDirector buildDirector2 = new BuildDirector { Bulkhead = Bulkhead.Extreme, Complex = Complex.Tech, Complexity = Complexity.Low, Tier = "B", Objective = WardenObjectiveType.SpecialTerminalCommand }; buildDirector2.GenPoints(); LevelSettings settings = new LevelSettings("B"); AutogenRundown.DataBlocks.Text text = new AutogenRundown.DataBlocks.Text(DescriptionHeader(wardenObjectiveType) + WardenObjective.GenLevelDescription(wardenObjectiveType)); Level level4 = Level.Build(new Level("B") { Prefix = "<color=orange>X</color><color=#444444>:</color>B", Description = text.PersistentId, Complex = Complex.Tech, MainDirector = buildDirector, SecondaryDirector = buildDirector2, Settings = settings, Index = rundown.TierB_Count }); rundown.AddLevel(level4); } for (int l = 1; l < rundown.TierD_Count + 1; l++) { int num4 = 1; if (rundown.BuildSeedPool.Count > 0) { num4 = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num4); } Level level5 = Level.Build(new Level("D") { Name = Generator.Draw(collection), Index = l + 1, BuildSeed = num4 }); rundown.AddLevel(level5); } for (int m = 0; m < rundown.TierE_Count; m++) { int num5 = 1; if (rundown.BuildSeedPool.Count > 0) { num5 = rundown.BuildSeedPool[0]; rundown.BuildSeedPool.RemoveAt(0); Generator.AdvanceSequence(num5); } Level level6 = Level.Build(new Level("E") { Name = Generator.Draw(collection), Index = m + 1, BuildSeed = num5 }); rundown.AddLevel(level6); } if (!withUnlocks) { return rundown; } rundown.UseTierUnlockRequirements = true; rundown.ReqToReachTierB.MainSectors = Math.Max(1, rundown.TierA.Count - 1); rundown.ReqToReachTierC.MainSectors = Math.Max(0, rundown.ReqToReachTierB.MainSectors + rundown.TierB.Count - 1); rundown.ReqToReachTierD.MainSectors = Math.Max(0, rundown.ReqToReachTierC.MainSectors + rundown.TierC.Count - 1); rundown.ReqToReachTierE.MainSectors = Math.Max(0, rundown.ReqToReachTierD.MainSectors + rundown.TierD.Count - 1); return rundown; } public static Rundown BuildMonthlyRundown(Rundown newRundown) { Rundown rundown = Rundown.Build(newRundown); List<string> collection = Words.NewLevelNamesPack(); Dictionary<string, List<List<int>>> dictionary = new Dictionary<string, List<List<int>>>(); dictionary.Add("2025_04", new List<List<int>> { new List<int> { 2, 1 }, new List<int> { 1, 1, 1 }, new List<int> { 1, 1, 1, 1 }, new List<int> { 2, 1, 2, 1 }, new List<int> { 1, 1 } }); dictionary.TryGetValue(Generator.Seed, out var value); if (value == null) { value = new List<List<int>> { new List<int> { 2, 1 }, new List<int> { 1, 1, 1 }, new List<int> { 1, 1, 1, 1 }, new List<int> { 2, 1, 1, 1 }, new List<int> { 1, 1 } }; } List<(double, int, WardenObjectiveType)> collection2 = new List<(double, int, WardenObjectiveType)> { (1.0, 3, WardenObjectiveType.HsuFindSample), (1.0, 3, WardenObjectiveType.ReactorStartup), (1.0, 3, WardenObjectiveType.ReactorShutdown), (1.0, 2, WardenObjectiveType.GatherSmallItems), (1.0, 2, WardenObjectiveType.ClearPath), (0.7, 1, WardenObjectiveType.SpecialTerminalCommand), (1.0, 3, WardenObjectiveType.RetrieveBigItems), (1.0, 2, WardenObjectiveType.PowerCellDistribution), (1.0, 3, WardenObjectiveType.TerminalUplink), (1.0, 3, WardenObjectiveType.Survival), (1.0, 2, WardenObjectiveType.TimedTerminalSequence) }; List<(double, int, Complex)> collection3 = new List<(double, int, Complex)> { (1.0, 10, Complex.Mining), (1.0, 10, Complex.Tech), (0.8, 10, Complex.Service) }; rundown.TierA_Count = value[0].Count; rundown.TierB_Count = value[1].Count; rundown.TierC_Count = value[2].Count; rundown.TierD_Count = value[3].Count; rundown.TierE_Count = value[4].Count; for (int i = 0; i < rundown.TierA_Count; i++) { int num = value[0][i]; Generator.AdvanceSequence(num); Complex complex = Generator.DrawSelect(collection3); WardenObjectiveType objective = Generator.DrawSelect(collection2); BuildDirector mainDirector = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex, Tier = "A", Objective = objective }; Level level = Level.Build(new Level("A") { Name = Generator.Draw(collection), Index = i + 1, Complex = complex, MainDirector = mainDirector, BuildSeed = num }); rundown.AddLevel(level); } for (int j = 0; j < rundown.TierB_Count; j++) { int num2 = value[1][j]; Generator.AdvanceSequence(num2); Complex complex2 = Generator.DrawSelect(collection3); WardenObjectiveType objective2 = Generator.DrawSelect(collection2); BuildDirector mainDirector2 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex2, Tier = "B", Objective = objective2 }; Level level2 = Level.Build(new Level("B") { Name = Generator.Draw(collection), Index = j + 1, Complex = complex2, MainDirector = mainDirector2, BuildSeed = num2 }); rundown.AddLevel(level2); } for (int k = 0; k < rundown.TierC_Count; k++) { int num3 = value[2][k]; Generator.AdvanceSequence(num3); Complex complex3 = Generator.DrawSelect(collection3); WardenObjectiveType objective3 = Generator.DrawSelect(collection2); BuildDirector mainDirector3 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex3, Tier = "C", Objective = objective3 }; Level level3 = Level.Build(new Level("C") { Name = Generator.Draw(collection), Index = k + 1, Complex = complex3, MainDirector = mainDirector3, BuildSeed = num3 }); rundown.AddLevel(level3); } for (int l = 0; l < rundown.TierD_Count; l++) { int num4 = value[3][l]; Generator.AdvanceSequence(num4); Complex complex4 = Generator.DrawSelect(collection3); WardenObjectiveType objective4 = Generator.DrawSelect(collection2); BuildDirector mainDirector4 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex4, Tier = "D", Objective = objective4 }; Level level4 = Level.Build(new Level("D") { Name = Generator.Draw(collection), Index = l + 1, Complex = complex4, MainDirector = mainDirector4, BuildSeed = num4 }); rundown.AddLevel(level4); } for (int m = 0; m < rundown.TierE_Count; m++) { int num5 = value[4][m]; Generator.AdvanceSequence(num5); Complex complex5 = Generator.DrawSelect(collection3); WardenObjectiveType objective5 = Generator.DrawSelect(collection2); BuildDirector mainDirector5 = new BuildDirector { Bulkhead = Bulkhead.Main, Complex = complex5, Tier = "E", Objective = objective5 }; Level level5 = Level.Build(new Level("E") { Name = Generator.Draw(collection), Index = m + 1, Complex = complex5, MainDirector = mainDirector5, BuildSeed = num5 }); rundown.AddLevel(level5); } rundown.UseTierUnlockRequirements = true; rundown.ReqToReachTierB.MainSectors = Math.Max(1, rundown.TierA.Count - 1); rundown.ReqToReachTierC.MainSectors = Math.Max(0, rundown.ReqToReachTierB.MainSectors + rundown.TierB.Count - 1); rundown.ReqToReachTierD.MainSectors = Math.Max(0, rundown.ReqToReachTierC.MainSectors + rundown.TierC.Count - 1); rundown.ReqToReachTierE.MainSectors = Math.Max(0, rundown.ReqToReachTierD.MainSectors + rundown.TierD.Count - 1); rundown.VisualsETier = Color.MenuVisuals_MonthlyE; return rundown; } public static void Build(string dailySeed) { Bins.Setup(); ComplexResourceSet.Setup(); LayoutDefinitions.Setup(); GameSetup gameSetup = new GameSetup { PersistentId = 1u, Name = "Default" }; Generator.SetMonthSeed(); Generator.Reload(); string text = Words.RundownNameMonthly(); Rundown block = BuildMonthlyRundown(new Rundown { PersistentId = Rundown.R_Monthly, Title = (text.ToUpper() ?? ""), StoryTitle = "<color=green>RND://</color>MONTHLY " + Generator.DisplaySeed + "\r\nTITLE: " + text.ToUpper() }); Bins.Rundowns.AddBlock(block); Generator.SetWeeklySeed(); Generator.Reload(); string text2 = Generator.Pick(Words.Adjectives) + " " + Generator.Pick(Words.NounsRundown); bool withUnlocks = true; Rundown block2 = BuildRundown(new Rundown { PersistentId = Rundown.R_Weekly, Title = (text2.ToUpper() ?? ""), StoryTitle = "<color=green>RND://</color>WEEKLY " + Generator.DisplaySeed + "\r\nTITLE: " + text2.ToUpper() }, withFixed: false, withUnlocks); Bins.Rundowns.AddBlock(block2); Generator.ReadOrSetSeed(dailySeed); Generator.Reload(); string text3 = Generator.Pick(Words.Adjectives) + " " + Generator.Pick(Words.NounsRundown); Rundown rundown = BuildRundown(new Rundown { PersistentId = Rundown.R_Daily, Title = (text3.ToUpper() ?? ""), StoryTitle = "<color=green>RND://</color>DAILY " + Generator.DisplaySeed + "\r\nTITLE: " + text3.ToUpper(), TierA_Count = 1, TierD_Count = 2, TierE_Count = Generator.Between(0, 2) }, withFixed: true, withUnlocks: false); rundown.VisualsETier = Color.MenuVisuals_DailyE; Bins.Rundowns.AddBlock(rundown); gameSetup.RundownIdsToLoad = new List<uint> { Rundown.R_Daily, Rundown.R_Monthly, Rundown.R_Weekly }; Bins.GameSetups.AddBlock(gameSetup); Bins.Save(); EnemyCustomization.Ability.Save(); EnemyCustomization.Model.Save(); Peers.Configure(); } } } namespace AutogenRundown.Utils { public class PriorityList { } public class Tags { private HashSet<string> tags = new HashSet<string>(); public Tags(params string[] initialTags) { foreach (string item in initialTags) { tags.Add(item); } } public Tags(Tags previous) { tags = new HashSet<string>(previous.tags); } public bool Add(string tag) { return tags.Add(tag); } public bool Contains(string tag) { return tags.Contains(tag); } public Tags Extend(params string[] tags) { Tags tags2 = new Tags(this); foreach (string tag in tags) { tags2.Add(tag); } return tags2; } public override string ToString() { return "{" + string.Join(", ", tags.ToArray()) + "}"; } } } namespace AutogenRundown.PeerMods { public static class Arsenality { public static string MOD_NAME = "W33B-Arsenality"; public static void Configure() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown if (Peers.HasMod(MOD_NAME)) { ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(22, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Configuring peer mod: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(MOD_NAME); } logger.LogInfo(val); string pluginData = Path.Combine(Paths.BepInExRootPath, "plugins", MOD_NAME, "arsenality"); int revision = CellBuildData.GetRevision(); string gameData = Path.Combine(Paths.BepInExRootPath, "GameData", $"{revision}"); Directory.CreateDirectory(Path.Combine(gameData, "Custom", "mccad00")); List<string> list = new List<string>(); list.Add(Path.Combine("Custom", "mccad00", "GearPartTransform.json")); list.Add("GameData_ArchetypeDataBlock_bin.json"); list.Add("GameData_GearCategoryDataBlock_bin.json"); list.Add("GameData_GearMeleeHandlePartDataBlock_bin.json"); list.Add("GameData_GearMeleeHeadPartDataBlock_bin.json"); list.Add("GameData_GearMeleeNeckPartDataBlock_bin.json"); list.Add("GameData_GearMeleePommelPartDataBlock_bin.json"); list.Add("GameData_GearSightPartDataBlock_bin.json"); list.Add("GameData_GearStockPartDataBlock_bin.json"); list.Add("GameData_GearToolPayloadPartDataBlock_bin.json"); list.Add("GameData_GearToolScreenPartDataBlock_bin.json"); list.Add("GameData_GearToolTargetingPartDataBlock_bin.json"); list.Add("GameData_MeleeAnimationSetDataBlock_bin.json"); list.Add("GameData_MeleeArchetypeDataBlock_bin.json"); list.Add("GameData_PlayerOfflineGearDataBlock_bin.json"); list.ForEach(delegate(string path) { File.Copy(Path.Combine(pluginData, path), Path.Combine(gameData, path), overwrite: true); }); } } } public class Mod { public int ManifestVersion { get; set; } public string Name { get; set; } = ""; public string AuthorName { get; set; } = ""; public string WebsiteUrl { get; set; } = ""; public string DisplayName { get; set; } = ""; public string Description { get; set; } = ""; public string GameVersion { get; set; } = ""; public string NetworkMode { get; set; } = ""; public string PackageType { get; set; } = ""; public string InstallMode { get; set; } = ""; public long InstalledAtTime { get; set; } public List<string> Loaders { get; set; } = new List<string>(); public List<string> Dependencies { get; set; } = new List<string>(); public List<string> Incompatibilities { get; set; } = new List<string>(); public List<string> OptionalDependencies { get; set; } = new List<string>(); public VersionNumber VersionNumber { get; set; } = new VersionNumber(); public bool Enabled { get; set; } public string Icon { get; set; } = ""; } public class VersionNumber { public int Major { get; set; } public int Minor { get; set; } public int Patch { get; set; } } } namespace AutogenRundown.Patches { [HarmonyPatch(typeof(CM_PageRundown_New), "OnExpeditionUpdated")] [HarmonyPatch(typeof(CM_PageRundown_New), "UpdateVanityItemUnlocks")] public class HideMenuItems { public static void Postfix(CM_PageRundown_New __instance) { //IL_001a: 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_0048: 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_0076: 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_00a4: 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_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/Rundown/Button VanityItemDrops")).transform.localPosition = Vector3.up * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/Rundown/CM_PageRundown_VanityItemDropsNext")).transform.localPosition = Vector3.up * 2000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/TutorialButton")).transform.localPosition = Vector3.left * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/Button Matchmake All")).transform.localPosition = Vector3.left * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/Button Rundown")).transform.localPosition = Vector3.left * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/Button Discord")).transform.localPosition = Vector3.left * 1000f; ((Component)((Component)__instance).gameObject.transform.FindChild("MovingContent/PasteAndJoinOnLobbyID/ButtonGIF")).transform.localPosition = Vector3.left * 1000f; } } public class RundownNames { public static void OnTitleDataUpdated() { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Expected O, but got Unknown //IL_003c: Unknown result type (might be due to invalid IL or missing references) int num = 0; Enumerator<CM_RundownSelection> enumerator = MainMenuGuiLayer.Current.PageRundownNew.m_rundownSelections.GetEnumerator(); while (enumerator.MoveNext()) { CM_RundownSelection current = enumerator.Current; if ((Object)current.m_altText != (Object)null) { Object.Destroy((Object)(object)((Component)current.m_altText).gameObject); } switch (num) { case 0: { Rundown rundown3 = Bins.Rundowns.Find(Rundown.R_Daily); ((TMP_Text)current.m_rundownText).text = "<size=70%><color=orange>DAILY</color><color=#444444>:</color> " + rundown3.Title + "</size>"; break; } case 2: { Rundown rundown2 = Bins.Rundowns.Find(Rundown.R_Weekly); ((TMP_Text)current.m_rundownText).text = $"<size=70%><color=green>WEEK #{Generator.WeekNumber}</color><color=#444444>:</color> {rundown2.Title}</size>"; break; } case 1: { Rundown rundown = Bins.Rundowns.Find(Rundown.R_Monthly); ((TMP_Text)current.m_rundownText).text = "<size=70%><color=#58fcee>MONTHLY</color><color=#444444>:</color> " + rundown.Title + "</size>"; break; } } num++; } } } [HarmonyPatch(typeof(PUI_Watermark), "UpdateWatermark")] public class Watermark { [HarmonyAfter(new string[] { "com.dak.MTFO" })] public static void Postfix(PUI_Watermark __instance) { ((TMP_Text)__instance.m_watermarkText).SetText($"<size=14>Seed <color=orange>{Generator.Seed}</color>\nAR v{"0.58.1"}</size>", true); } } } namespace AutogenRundown.GeneratorData { public static class Words { public static string[] Adjectives = new string[200] { "Bleak", "Ruthless", "Morbid", "Desolate", "Brutal", "Malignant", "Forsaken", "Grotesque", "Dystopian", "Hollow", "Gruesome", "Harrowing", "Malevolent", "Oppressive", "Visceral", "Mutilated", "Cursed", "Macabre", "Noxious", "Tormented", "Ominous", "Rancid", "Suffering", "Wretched", "Sinister", "Melancholic", "Feral", "Mournful", "Pernicious", "Bleeding", "Carnal", "Decayed", "Malformed", "Savage", "Ravaged", "Corroded", "Vile", "Tainted", "Blighted", "Fetid", "Grim", "Unholy", "Nefarious", "Blasphemous", "Abominable", "Haunting", "Deathly", "Charnel", "Abyssal", "Ghastly", "Insidious", "Foreboding", "Eroded", "Lamentable", "Sepulchral", "Dismal", "Rotten", "Drab", "Infested", "Profane", "Grisly", "Terrifying", "Desecrated", "Dire", "Maddening", "Gory", "Searing", "Putrid", "Cadaverous", "Gaunt", "Soulless", "Ashen", "Deranged", "Murky", "Sullied", "Decrepit", "Ruinous", "Morose", "Piteous", "Calamitous", "Lurid", "Bleached", "Tenebrous", "Anguished", "Ravenous", "Unsettling", "Marred", "Disquieting", "Dreadful", "Malign", "Stifling", "Pervasive", "Gloom-ridden", "Stark", "Bereft", "Shattered", "Broken", "Eviscerated", "Cacophonous", "Grimy", "Disturbing", "Shadowy", "War-torn", "Cataclysmic", "Waning", "Bane-filled", "Doomed", "Catastrophic", "Muted", "Festering", "Barren", "Fading", "Atrophied", "Diminished", "Eerie", "Discordant", "Tumultuous", "Raving", "Merciless", "Malefic", "Crumbling", "Haggard", "Pained", "Ravishing", "Venomous", "Withered", "Spiteful", "Obsidian", "Battered", "Appalling", "Unrelenting", "Bloodthirsty", "Sable", "Annihilated", "Drowning", "Sanguine", "Infernal", "Tortured", "Scarred", "Searing", "Horrifying", "Blackened", "Splintered", "Enervated", "Heinous", "Smoldering", "Pestilent", "Accursed", "Frenzied", "Decimating", "Fractured", "Toxic", "Pallid", "Despairing", "Despondent", "Relentless", "Wailing", "Traumatized", "Ravaging", "Twisted", "Seething", "Caustic", "Scorched", "Tattered", "Lecherous", "Vexed", "Void", "Wounded", "Befouled", "Stricken", "Degenerate", "Consumed", "Demonic", "Raging", "Vitiated", "Corrupted", "Hellish", "Purgatorial", "Defiled", "Repugnant", "Sacrilegious", "Blasted", "Bewitched", "Entropic", "Deteriorated", "Wrathful", "Plagued", "Waning", "Brooding", "Abject", "Disheveled", "Chilling", "Loathsome", "Maddened", "Melting", "Perishing", "Throttled", "Eclipsed", "Shriveling", "Maleficent" }; public static string[] NounsRundown = new string[50] { "Abyss", "Chasm", "Void", "Maw", "Underworld", "Cavern", "Labyrinth", "Catacomb", "Pitfall", "Gorge", "Hollow", "Subterrane", "Burrow", "Crevasse", "Gullet", "Tenebrous Tunnel", "Darkwell", "Fissure", "Undercrypt", "Oblivion", "Crusade", "Vendetta", "Ordeal", "Bloodquest", "Reckoning", "Purge", "Conquest", "Expurgation", "Vengeance", "Retribution", "Endeavor", "Extermination", "Annihilation", "Obliteration", "Decimation", "Dominion", "Insurrection", "Onslaught", "Sacrifice", "Inquisition", "Siege", "Desolation", "Persecution", "Incursion", "Culling", "Exorcism", "Enthronement", "Subjugation", "Redemption", "Ravage" }; public static string[] Level_FirstWord = new string[100] { "Abandon", "Agony", "Anomaly", "Apparition", "Ashes", "Asylum", "Banishment", "Banshee", "Barrow", "Betrayal", "Charnel", "Collapse", "Corruption", "Crypt", "Cursed", "Darkness", "Decay", "Deception", "Decrepit", "Defilement", "Dementia", "Derelict", "Despair", "Detritus", "Dread", "Echoes", "Eclipse", "Eldritch", "Emptiness", "Enigma", "Erosion", "Evocation", "Extinction", "Faded", "Fallen", "Famine", "Fissure", "Forsaken", "Fright", "Ghost", "Gloom", "Grave", "Grim", "Haunted", "Havoc", "Horror", "Hostility", "Inferno", "Isolation", "Labyrinth", "Lament", "Leviathan", "Lurking", "Malevolent", "Malice", "Menace", "Mire", "Misery", "Morbid", "Mournful", "Nightmare", "Oblivion", "Omen", "Pandemonium", "Paranoia", "Perdition", "Phantom", "Plague", "Portal", "Ravine", "Reaper", "Ruin", "Shadows", "Sinister", "Specter", "Spiral", "Stalker", "Stasis", "Subterfuge", "Terror", "Threnody", "Torment", "Torture", "Treachery", "Trepidation", "Tryst", "Twilight", "Unholy", "Vampire", "Vengeance", "Venom", "Vile", "Vortex", "Wailing", "Wasteland", "Whisper", "Wicked", "Wrath", "Wretched", "Zephyr" }; public static string[] Level_LastWord = new string[98] { "Abyss", "Anomaly", "Apparition", "Ascent", "Ashes", "Banishment", "Barrow", "Bastion", "Beacon", "Burial", "Cascade", "Cataclysm", "Cavern", "Chasm", "Collapse", "Conundrum", "Corridor", "Corrupter", "Crevasse", "Crypt", "Cyst", "Darkness", "Death", "Delirium", "Demise", "Depth", "Descent", "Detritus", "Dread", "Eclipse", "Embrace", "Empire", "End", "Erosion", "Expanse", "Fissure", "Gallows", "Gloom", "Grave", "Halls", "Hollow", "Horror", "Inferno", "Labyrinth", "Lament", "Legacy", "Maw", "Maze", "Mirage", "Monolith", "Morass", "Morgue", "Nadir", "Necropolis", "Obelisk", "Oblivion", "Obscurity", "Obstruction", "Omen", "Pandemonium", "Paradigm", "Paradox", "Passage", "Phantasm", "Pit", "Portal", "Purgatory", "Quagmire", "Realm", "Reckoning", "Relic", "Requiem", "Rift", "Sanctuary", "Sarcophagus", "Scourge", "Sepulcher", "Shrine", "Spire", "Tomb", "Torment", "Trench", "Trove", "Tundra", "Undertow", "Underworld", "Vale", "Vault", "Veil", "Vestige", "Vortex", "Wasteland", "Whisper", "Womb", "Wraith", "Wreck", "Yawning", "Zenith" }; public static string[] NounsLevel = new string[115] { "Dissolution", "Enigma Void", "Malevolence", "Bleak Nexus", "Catacomb Depth", "Aberration", "Desolation Pulse", "Grim Ascent", "Cryptic Relic", "Shadow's Descent", "Forlorn Vault", "Abyssal Rift", "Blight's Reach", "Mire", "Decay's Hold", "Obliterate", "Infernal Passage", "Isolation", "Torment's Lair", "Veil of Despair", "Sable Depths", "Entropy's Grasp", "Lost Reverie", "Despair's Domain", "Wane", "Nocturnal Hollow", "Fractured Echo", "Endless Chasm", "Voidwalk", "Eroded Memories", "Forsaken Sanctuary", "Vortex of Silence", "Mortal Coil", "Spectral Divide", "Haunting Expanse", "Tenebrous Labyrinth", "Corroded Chambers", "Bane's Descent", "Dread Core", "Lost Purgatory", "Umbral Stretch", "Grave's Whisper", "Malignant Nexus", "Fallen Dominion", "Ephemeral Passage", "Netherbound", "Gloom's Heart", "Stygian Abyss", "Ruination", "Cursed Gallery", "Eclipsed Reality", "Doom's Cradle", "Mourning Depths", "Harbinger's Hold", "Catastrophic Crevasse", "Blighted Reliquary", "Shadow's Embrace", "Sorrow's Enclave", "Dusk's Demise", "Ghastly Gorge", "Inferno's Mouth", "Vice's Grasp", "Bleak Bastion", "Silent Sunder", "Dark Nexus", "Obsidian Oubliette", "Ravaged Resonance", "Dreadnaught's Depth", "Twilight Tomb", "Void's Verge", "Bane's Breach", "Ethereal Edge", "Fathomless", "Grim Gallery", "Haunt's Halls", "Mist's Murk", "Descent into Darkness", "Petrified Path", "Eerie Expanse", "Lurk's Labyrinth", "Perdition's Pits", "Spectral Spire", "Torrid Tunnels", "Wraith's Wake", "Desolate Divide", "Graveyard Grotto", "Hollow's Heart", "Sable Sorrow", "Twisted Terrain", "Umbral Underbelly", "Void's Vestige", "Wither's Way", "Crypt's Crux", "Eldritch Elevations", "Fallen's Folly", "Gloom's Gulch", "Hell's Hinge", "Infernal Interstice", "Jagged Jaws", "Kiln of Khaos", "Lament's Landing", "Maw's Murmur", "Necrotic Niche", "Oblivion's Overture", "Phantom's Phalanx", "Quarry of Quietude", "Riven Realm", "Shadow's Shroud", "Turbid Trench", "Unraveling Umbras", "Vexed Vistas", "Whisper's Wane", "Xenolith Expanse", "Yawning Yoke", "Zenith of Zero" }; public static string[] VerbsPresentParticiple = new string[40] { "Atrophying", "Bleeding", "Breaking", "Caving", "Collapsing", "Corroding", "Crumbling", "Decaying", "Declining", "Degenerating", "Depleting", "Despairing", "Deteriorating", "Diminishing", "Disintegrating", "Dissipating", "Dissolving", "Draining", "Drowning", "Eroding", "Fading", "Fading", "Floundering", "Fraying", "Fumbling", "Languishing", "Moldering", "Perishing", "Ravaging", "Regressing", "Sinking", "Slipping", "Struggling", "Succumbing", "Suffering", "Wasting", "Weakening", "Wilting", "Withering", "Wrecking" }; public static string[] GtfoEnemies = new string[16] { "Striker", "Shooter", "Charger", "Shadow", "Giant Striker", "Giant Shooter", "Giant Charger", "Shadow Giant", "Hybrid", "Scout", "Charger Scout", "Shadow Scout", "Tank", "Immortal", "Mother", "P-Mother" }; public static string[] SeedWords = new string[1000] { "apple", "banana", "cherry", "dog", "cat", "bird", "fish", "house", "chair", "table", "book", "pen", "hat", "car", "bus", "shoe", "sock", "bag", "tree", "sun", "moon", "star", "water", "river", "lake", "ocean", "beach", "sand", "wind", "rain", "snow", "cloud", "storm", "grass", "leaf", "flower", "rose", "tulip", "daisy", "lily", "bird", "eagle", "hawk", "dove", "raven", "paper", "pencil", "eraser", "ruler", "desk", "phone", "clock", "watch", "lamp", "light", "music", "song", "dance", "play", "game", "ball", "bat", "glove", "goal", "run", "walk", "sit", "stand", "jump", "dance", "sing", "laugh", "cry", "smile", "frown", "speak", "listen", "read", "write", "draw", "paint", "color", "print", "ship", "boat", "plane", "train", "car", "bus", "bike", "bell", "ring", "gift", "card", "party", "cake", "pie", "ice", "cream", "sugar", "salt", "spice", "bread", "meat", "egg", "milk", "cheese", "pasta", "rice", "soup", "salad", "fruit", "grape", "orange", "lemon", "lime", "melon", "berry", "nut", "date", "honey", "butter", "jam", "jelly", "candy", "choco", "cookie", "muffin", "donut", "coffee", "tea", "juice", "soda", "water", "beer", "wine", "drink", "glass", "plate", "bowl", "spoon", "fork", "knife", "napkin", "towel", "sheet", "blanket", "pillow", "bed", "sofa", "chair", "bench", "floor", "wall", "door", "window", "roof", "chimney", "fence", "yard", "garden", "field", "farm", "barn", "stable", "horse", "cow", "pig", "sheep", "goat", "chicken", "turkey", "duck", "pond", "pool", "park", "zoo", "forest", "hill", "mountain", "valley", "desert", "island", "beach", "wave", "tide", "coral", "fish", "whale", "shark", "dolphin", "seal", "crab", "lobster", "squid", "octopus", "snail", "turtle", "lizard", "snake", "frog", "spider", "ant", "bee", "bug", "fly", "worm", "rat", "mouse", "rabbit", "bear", "tiger", "lion", "leopard", "panther", "wolf", "fox", "deer", "moose", "elk", "beaver", "otter", "raccoon", "skunk", "bat", "owl", "city", "town", "village", "road", "street", "alley", "avenue", "highway", "bridge", "tunnel", "port", "harbor", "station", "hotel", "motel", "inn", "bank", "market", "mall", "store", "shop", "office", "factory", "school", "church", "temple", "mosque", "museum", "library", "zoo", "park", "garden", "circus", "theater", "cinema", "cafe", "bar", "club", "gym", "spa", "salon", "hospital", "clinic", "prison", "police", "army", "navy", "air", "fire", "metal", "wood", "cloth", "silk", "wool", "cotton", "paper", "stone", "rock", "brick", "clay", "glass", "gold", "silver", "bronze", "steel", "iron", "copper", "lead", "tin", "zinc", "nickel", "chrome", "plastic", "rubber", "leather", "fur", "feather", "wool", "rope", "wire", "chain", "nail", "screw", "bolt", "nut", "wheel", "tire", "pedal", "gear", "brake", "seat", "belt", "hat", "cap", "helmet", "scarf", "glove", "sock", "shoe", "boot", "sandal", "shirt", "blouse", "dress", "skirt", "pants", "jeans", "suit", "tie", "jacket", "coat", "sweater", "vest", "cape", "robe", "pajama", "underwear", "bra", "panty", "diaper", "purse", "wallet", "bag", "suitcase", "box", "can", "jar", "bottle", "jug", "cup", "mug", "plate", "bowl", "spoon", "fork", "knife", "chopstick", "pin", "needle", "thread", "button", "zipper", "scissors", "razor", "comb", "brush", "mirror", "towel", "soap", "shampoo", "lotion", "perfume", "makeup", "lipstick", "eyeshadow", "mascara", "nailpolish", "ring", "earring", "necklace", "bracelet", "watch", "clock", "radio", "phone", "camera", "computer", "printer", "scanner", "TV", "DVD", "CD", "disk", "tape", "book", "magazine", "newspaper", "letter", "card", "envelope", "stamp", "pen", "pencil", "marker", "crayon", "paint", "brush", "easel", "canvas", "paper", "notebook", "binder", "folder", "file", "clip", "staple", "glue", "tape", "ruler", "calculator", "lamp", "bulb", "plug", "wire", "battery", "charger", "remote", "headset", "speaker", "microphone", "keyboard", "mouse", "screen", "monitor", "drive", "router", "modem", "antenna", "satellite", "rocket", "plane", "helicopter", "drone", "ship", "boat", "car", "truck", "bus", "train", "tram", "bike", "scooter", "skateboard", "rollerblade", "sled", "ski", "surfboard", "parachute", "tent", "sleepingbag", "backpack", "flashlight", "lantern", "match", "lighter", "stove", "oven", "microwave", "refrigerator", "freezer", "dishwasher", "washingmachine", "dryer", "vacuum", "broom", "mop", "bucket", "bin", "trash", "recycle", "leaf", "grass", "flower", "tree", "bush", "vine", "mushroom", "fruit", "vegetable", "grain", "bean", "nut", "meat", "poultry", "fish", "seafood", "dairy", "egg", "cheese", "butter", "oil", "sugar", "salt", "spice", "tea", "coffee", "cocoa", "water", "juice", "soda", "wine", "beer", "liquor", "cocktail", "soup", "salad", "sandwich", "pizza", "pasta", "rice", "bread", "cake", "pie", "cookie", "candy", "icecream", "jelly", "jam", "honey", "syrup", "vinegar", "sauce", "ketchup", "mustard", "mayo", "pepper", "chili", "garlic", "onion", "potato", "carrot", "bean", "pea", "corn", "cucumber", "lettuce", "tomato", "pepper", "broccoli", "spinach", "mushroom", "olive", "pickle", "apple", "banana", "orange", "berry", "grape", "lemon", "lime", "melon", "mango", "papaya", "pineapple", "coconut", "cherry", "plum", "peach", "apricot", "nut", "almond", "peanut", "walnut", "chestnut", "hazelnut", "meat", "pork", "beef", "lamb", "chicken", "turkey", "duck", "fish", "salmon", "tuna", "shrimp", "crab", "lobster", "oyster", "clam", "mussel", "squid", "octopus", "egg", "milk", "cheese", "yogurt", "butter", "cream", "icecream", "chocolate", "candy", "cookie", "cake", "pie", "muffin", "donut", "bread", "toast", "bagel", "roll", "croissant", "pancake", "waffle", "cereal", "oatmeal", "rice", "pasta", "noodle", "sushi", "pizza", "burger", "hotdog", "sandwich", "wrap", "taco", "burrito", "salad", "soup", "stew", "chili", "curry", "sauce", "gravy", "dressing", "ketchup", "mustard", "mayo", "relish", "pickles", "olives", "jam", "jelly", "honey", "syrup", "butter", "oil", "vinegar", "salt", "pepper", "spice", "herb", "garlic", "onion", "tomato", "potato", "carrot", "celery", "lettuce", "cabbage", "spinach", "broccoli", "pepper", "bean", "pea", "corn", "cucumber", "zucchini", "squash", "pumpkin", "eggplant", "mushroom", "olive", "apple", "banana", "orange", "berry", "grape", "lemon", "lime", "melon", "mango", "papaya", "pineapple", "coconut", "cherry", "plum", "peach", "apricot", "berry", "kiwi", "date", "fig", "raisin", "nut", "almond", "peanut", "walnut", "chestnut", "hazelnut", "cashew", "pecan", "macadamia", "meat", "pork", "beef", "lamb", "chicken", "turkey", "duck", "fish", "salmon", "tuna", "shrimp", "crab", "lobster", "oyster", "clam", "mussel", "squid", "octopus", "caviar", "egg", "milk", "cheese", "yogurt", "butter", "cream", "icecream", "chocolate", "candy", "cookie", "cake", "pie", "muffin", "donut", "bread", "toast", "bagel", "roll", "croissant", "pancake", "waffle", "cereal", "oatmeal", "rice", "pasta", "noodle", "sushi", "pizza", "burger", "hotdog", "sandwich", "wrap", "taco", "burrito", "salad", "soup", "stew", "chili", "curry", "sauce", "gravy", "dressing", "ketchup", "mustard", "mayo", "relish", "pickles", "olives", "jam", "jelly", "honey", "syrup", "butter", "oil", "vinegar", "salt", "pepper", "spice", "herb", "garlic", "onion", "tomato", "potato", "carrot", "celery", "lettuce", "cabbage", "spinach", "broccoli", "pepper", "bean", "pea", "corn", "cucumber", "zucchini", "squash", "pumpkin", "eggplant", "mushroom", "olive", "apple", "banana", "orange", "berry", "grape", "lemon", "lime", "melon", "mango", "papaya", "pineapple", "coconut", "cherry", "plum", "peach", "apricot", "berry", "kiwi", "date", "fig", "raisin", "nut", "almond", "peanut", "walnut", "chestnut", "hazelnut", "cashew", "pecan", "macadamia", "meat", "pork", "beef", "lamb", "chicken", "turkey", "duck", "fish", "salmon", "tuna", "shrimp", "crab", "lobster", "oyster", "clam", "mussel", "squid", "octopus", "caviar", "egg", "milk", "cheese", "yogurt", "butter", "cream", "icecream", "chocolate", "candy", "cookie", "cake", "pie", "muffin", "donut", "bread", "toast", "bagel", "roll", "croissant", "pancake", "waffle", "cereal", "oatmeal", "rice", "pasta", "noodle", "sushi", "pizza", "burger", "hotdog", "sandwich", "wrap", "taco", "burrito", "salad", "soup", "stew", "chili", "curry", "sauce", "gravy", "dressing", "ketchup", "mustard", "mayo", "relish", "pickles", "olives", "jam", "jelly", "honey", "syrup", "butter", "oil", "vinegar", "salt", "pepper", "spice", "herb", "garlic", "onion", "tomato", "potato", "carrot", "celery", "lettuce", "cabbage", "spinach", "broccoli", "pepper", "bean", "pea", "corn", "cucumber", "zucchini", "squash", "pumpkin", "eggplant", "mushroom", "olive", "apple", "banana", "orange", "berry", "grape", "lemon", "lime", "melon", "mango", "papaya", "pineapple", "coconut", "cherry", "plum", "peach", "apricot", "berry", "kiwi", "date", "fig", "raisin", "nut", "almond", "peanut", "walnut", "chestnut", "hazelnut", "cashew", "pecan", "macadamia", "meat", "pork", "beef", "lamb", "chicken", "turkey", "duck", "fish", "salmon", "tuna", "shrimp", "crab", "lobster", "oyster", "clam", "mussel", "squid", "octopus", "caviar", "egg", "milk", "cheese", "yogurt", "butter", "cream", "icecream", "chocolate", "candy", "cookie", "cake", "pie", "muffin", "donut" }; public static List<string> NewLevelNamesPack() { List<string> collection = new List<string>(NounsLevel); List<string> list = new List<string>(Level_FirstWord); List<string> collection2 = new List<string>(Level_LastWord); List<string> list2 = new List<string>(VerbsPresentParticiple); List<string> list3 = new List<string>(); for (int i = 0; i < 30; i++) { if (Generator.Flip(0.15)) { string item = Generator.Draw(collection); list3.Add(item); } else { string text = Generator.Draw(Generator.Flip(0.3) ? list2 : list); string text2 = Generator.Draw(collection2); list3.Add(text + " " + text2); } } return list3; } public static string RundownNameMonthly() { int monthNumber = Generator.MonthNumber; switch (monthNumber) { case 1: return Generator.Pick(new List<string> { "Bleakburrow", "Mooncrypt", "Obsidian Grotto", "Chillmarrow", "Dampvault", "Umbral Cage", "Nightfissure", "Wraithclot", "Pale Labyrinth", "Blackmarsh" }); case 2: return Generator.Pick(new List<string> { "Kovac's Shroud" }); case 3: return Generator.Pick(new List<string> { "Sourgrove", "Waning Crypt", "Fetid Mine", "Gravewhisper", "Underrot", "Mireclaw", "Stillroot", "Gloomchoke", "Weeping Den" }); case 4: return Generator.Pick(new List<string> { "Fogshard", "Drearnest", "Rotwood", "Witherspine", "Sporefen", "Tanglechasm", "Musty Hollow", "Duskreef", "Faint Maze", "Subtlecrag" }); case 5: return Generator.Pick(new List<string> { "Fetid Thicket", "Wormblight", "Ashen Vault", "Goreburrow", "Briarcrypt", "Umbraspore", "Gullychill", "Soulchoke", "Darkfen", "Verdant Rot" }); case 6: return Generator.Pick(new List<string> { "Cinderdeep", "Molded Pit", "Charfall", "Blightbarrow", "Grimwarren", "Gorecliff", "Dusthusk", "Marrow Reach", "Wraith Fane", "Hollow Thorn" }); case 7: return Generator.Pick(new List<string> { "Bonechoke", "Rotcairn", "Dreggrotto", "Wraithknell", "Palechasm", "Dustwraith", "Husked Vale", "Bleakcyst", "Sunless Maw", "Murkspan" }); case 8: return Generator.Pick(new List<string> { "Gorechoke", "Hollowrift", "Lurid Pit", "Cavernfrost", "Wormclot", "Faintcrawl", "Midnight Grotto", "Wraithscar", "Ember Hollow", "Sour Vault" }); case 9: return Generator.Pick(new List<string> { "Underclaw", "Duskmarsh", "Cindercrypt", "Fallow Maw", "Grimspire", "Dregfen", "Shadowchoke", "Hazecrypt", "Briarchasm", "Twilight Burrow" }); case 10: return Generator.Pick(new List<string> { "Wraithgrove", "Hollowthorn", "Ragged Depths", "Twilight Rift", "Musty Chasm", "Blackburrow", "Rotspire", "Moonfen", "Nightflare", "Molderclaw" }); case 11: return Generator.Pick(new List<string> { "Frostwhisper", "Eboncrypt", "Shadowfen", "Dimthorn", "Quiet Grotto", "Waning Hollow", "Bleak Haze", "Underfissure", "Grey Rot", "Stygian Vault" }); case 12: return Generator.Pick(new List<string> { "Night Shiver", "Bone Whisper", "Gloom Fane", "Cinderhusk", "Riftgloom", "Soul Hollow", "Midnightfen", "Plague Claw", "Umbral Crypt", "Bleakharrow" }); default: { global::<PrivateImplementationDetails>.ThrowSwitchExpressionException(monthNumber); string result = default(string); return result; } } } } } namespace AutogenRundown.Extensions { public static class Numeric { public static bool ApproxEqual(this double a, double b, double tolerance = 1E-10) { return Math.Abs(a - b) < tolerance; } } public static class WardenObjectiveEventCollections { private static int GetLayerFromBulkhead(Bulkhead bulkhead) { switch (bulkhead) { case Bulkhead.Main: return 0; case Bulkhead.Extreme: return 1; case Bulkhead.Overload: return 2; default: { global::<PrivateImplementationDetails>.ThrowSwitchExpressionException(bulkhead); int result = default(int); return result; } } } public static ICollection<WardenObjectiveEvent> AddLockDoor(this ICollection<WardenObjectiveEvent> events, Bulkhead bulkhead, int zoneIndex, double delay = 0.0, WardenObjectiveEventTrigger trigger = WardenObjectiveEventTrigger.OnStart, string? lockMessage = null) { events.Add(new WardenObjectiveEvent { Type = WardenObjectiveEventType.LockSecurityDoor, DimensionIndex = 0, Layer = GetLayerFromBulkhead(bulkhead), LocalIndex = zoneIndex, SpecialText = (lockMessage ?? Lore.LockedDoorMessage) }); return events; } public static ICollection<WardenObjectiveEvent> AddLockExtreme(this ICollection<WardenObjectiveEvent> events, double delay = 0.0, WardenObjectiveEventTrigger trigger = WardenObjectiveEventTrigger.OnStart, string? lockMessage = null) { return events.AddLockDoor(Bulkhead.Extreme, 0, delay, trigger, lockMessage); } public static ICollection<WardenObjectiveEvent> AddLockOverload(this ICollection<WardenObjectiveEvent> events, double delay = 0.0, WardenObjectiveEventTrigger trigger = WardenObjectiveEventTrigger.OnStart, string? lockMessage = null) { return events.AddLockDoor(Bulkhead.Overload, 0, delay, trigger, lockMessage); } public static ICollection<WardenObjectiveEvent> AddStopLoop(this ICollection<WardenObjectiveEvent> events, int loopId, double delay = 0.0) { events.Add(new WardenObjectiveEvent { Type = WardenObjectiveEventType.StopEventLoop, Count = loopId, Delay = delay }); return events; } public static ICollection<WardenObjectiveEvent> AddFillFog(this ICollection<WardenObjectiveEvent> events, double delay = 5.0, double duration = 20.0, string? message = ":://CRITICAL FAILURE - VENTILATION SYSTEMS OFFLINE") { return events.AddSetFog(Fog.FullFog, delay, duration, message); } public static ICollection<WardenObjectiveEvent> AddSetFog(this ICollection<WardenObjectiveEvent> events, Fog fogSettings, double delay = 5.0, double duration = 20.0, string? message = ":://CRITICAL FAILURE - VENTILATION SYSTEMS OFFLINE") { events.Add(new WardenObjectiveEvent { Type = WardenObjectiveEventType.SetFogSettings, Trigger = WardenObjectiveEventTrigger.OnStart, FogSetting = fogSettings.PersistentId, FogTransitionDuration = duration, Delay = delay + 0.7 }); if (message == null) { return events; } events.Add(new WardenObjectiveEvent { Type = WardenObjectiveEventType.PlaySound, Trigger = WardenObjectiveEventTrigger.OnStart, SoundId = Sound.KdsDeepVentilationProcedure, Delay = delay }); events.Add(new WardenObjectiveEvent { Type = WardenObjectiveEventType.None, Trigger = WardenObjectiveEventTrigger.OnStart, Delay = delay + 4.0, WardenIntel = message }); return events; } public static ICollection<WardenObjectiveEvent> AddAllLightsOff(this ICollection<WardenObjectiveEvent> events, double delay = 0.0, WardenObjectiveEventTrigger trigger = WardenObjectiveEventTrigger.OnStart) { events.Add(new WardenObjectiveEvent { Type = WardenObjectiveEventType.AllLightsOff, Trigger = trigger, Delay = delay }); return events; } public static ICollection<WardenObjectiveEvent> AddToggleSecuritySensors(this ICollection<WardenObjectiveEvent> events, bool enabled, int sensorIndex, double delay = 0.0) { events.Add(new WardenObjectiveEvent { Type = WardenObjectiveEventType.ToggleSecuritySensor, Enabled = enabled, Count = sensorIndex, Delay = delay }); return events; } public static ICollection<WardenObjectiveEvent> AddAdjustTimer(this ICollection<WardenObjectiveEvent> events, double duration, double delay = 0.0) { events.Add(new WardenObjectiveEvent { Type = WardenObjectiveEventType.AdjustAwoTimer, Duration = duration, Delay = delay }); return events; } } public static class ZoneNodeCollections { public static ICollection<(ZoneNode, Zone?)> WithZones(this ICollection<ZoneNode> nodes, LayoutPlanner planner) { LayoutPlanner planner2 = planner; return nodes.Select((ZoneNode node) => (node, planner2.GetZone(node))).ToList(); } } } namespace AutogenRundown.DataBlocks { public enum Height { LowMidHigh, OnlyLow, OnlyHigh, OnlyMid, LowMid, MidHigh, LowHigh, Ascending, Descending, Unchanged } public class Altitude { public Height AllowedZoneAltitude { get; set; } = Height.OnlyMid; public double ChanceToChange { get; set; } = 0.5; } public record BigPickupDistribution : DataBlock { public uint SpawnsPerZone { get; set; } public List<ItemSpawn> SpawnData { get; set; } = new List<ItemSpawn>(); public static BigPickupDistribution FogTurbine = new BigPickupDistribution { SpawnsPerZone = 1u, SpawnData = { new ItemSpawn { Item = Item.FogTurbine } } }; public static BigPickupDistribution PowerCell_1 = new BigPickupDistribution { SpawnsPerZone = 1u, SpawnData = { new ItemSpawn { Item = Item.PowerCell } } }; public static BigPickupDistribution PowerCell_2 = new BigPickupDistribution { SpawnsPerZone = 2u, SpawnData = { new ItemSpawn { Item = Item.PowerCell } } }; public static BigPickupDistribution PowerCell_3 = new BigPickupDistribution { SpawnsPerZone = 3u, SpawnData = { new ItemSpawn { Item = Item.PowerCell } } }; public static BigPickupDistribution PowerCell_4 = new BigPickupDistribution { SpawnsPerZone = 4u, SpawnData = { new ItemSpawn { Item = Item.PowerCell } } }; public static BigPickupDistribution PowerCell_5 = new BigPickupDistribution { SpawnsPerZone = 5u, SpawnData = { new ItemSpawn { Item = Item.PowerCell } } }; public new static void SaveStatic() { Bins.BigPickupDistributions.AddBlock(FogTurbine); Bins.BigPickupDistributions.AddBlock(PowerCell_1); Bins.BigPickupDistributions.AddBlock(PowerCell_2); Bins.BigPickupDistributions.AddBlock(PowerCell_3); Bins.BigPickupDistributions.AddBlock(PowerCell_4); Bins.BigPickupDistributions.AddBlock(PowerCell_5); } [CompilerGenerated] protected BigPickupDistribution(BigPickupDistribution original) : base(original) { SpawnsPerZone = original.SpawnsPerZone; SpawnData = original.SpawnData; } public BigPickupDistribution() { } } public static class Bins { public static BlocksBin<BigPickupDistribution> BigPickupDistributions { get; private set; } = new BlocksBin<BigPickupDistribution>(); public static LazyBlocksBin<ChainedPuzzle> ChainedPuzzles { get; private set; } = new LazyBlocksBin<ChainedPuzzle>(); public static BlocksBin<ConsumableDistribution> ConsumableDistributions { get; private set; } = new BlocksBin<ConsumableDistribution>(); public static BlocksBin<Dimension> Dimensions { get; private set; } = new BlocksBin<Dimension>(); public static BlocksBin<Enemy_New> Enemy { get; private set; } = new BlocksBin<Enemy_New>(); public static BlocksBin<EnemyGroup> EnemyGroups { get; private set; } = new BlocksBin<EnemyGroup>(); public static BlocksBin<EnemyPopulation> EnemyPopulations { get; private set; } = new BlocksBin<EnemyPopulation>(); public static BlocksBin<ExpeditionBalance> ExpeditionBalances { get; private set; } = new BlocksBin<ExpeditionBalance>(); public static BlocksBin<Fog> Fogs { get; private set; } = new BlocksBin<Fog>(); public static BlocksBin<GameSetup> GameSetups { get; private set; } = new BlocksBin<GameSetup>(); public static BlocksBin<LevelLayout> LevelLayouts { get; private set; } = new BlocksBin<LevelLayout>(); public static LazyBlocksBin<LightSettings> LightSettings { get; private set; } = new LazyBlocksBin<LightSettings>(); public static BlocksBin<Rundown> Rundowns { get; private set; } = new BlocksBin<Rundown>(); public static BlocksBin<Text> Texts { get; private set; } = new BlocksBin<Text>(); public static BlocksBin<WardenObjective> WardenObjectives { get; private set; } = new BlocksBin<WardenObjective>(); public static BlocksBin<WavePopulation> WavePopulations { get; private set; } = new BlocksBin<WavePopulation>(); public static LazyBlocksBin<WaveSettings> WaveSettings { get; private set; } = new LazyBlocksBin<WaveSettings>(); public static void Setup() { AutogenRundown.DataBlocks.Light.LightSettings.Setup(); AutogenRundown.DataBlocks.Light.LightSettings.SaveStatic(); Text.Setup(); Text.SaveStatic(); Enemy_New.Setup(); EnemyGroup.Setup(); EnemyPopulation.Setup(); WavePopulation.Setup(); AutogenRundown.DataBlocks.Alarms.WaveSettings.Setup(); BigPickupDistribution.SaveStatic(); ChainedPuzzle.SaveStatic(); ConsumableDistribution.SaveStatic(); Dimension.SaveStatic(); EnemyGroup.SaveStatic(); EnemyPopulation.SaveStatic(); ExpeditionBalance.SaveStatic(); Fog.SaveStatic(); DataBlock.SaveStatic(); DataBlock.SaveStatic(); DataBlock.SaveStatic(); WavePopulation.SaveStatic(); AutogenRundown.DataBlocks.Alarms.WaveSettings.SaveStatic(); } public static void Save() { BigPickupDistributions.Save("BigPickupDistribution"); ChainedPuzzles.Save("ChainedPuzzle"); ConsumableDistributions.Save("ConsumableDistribution"); Dimensions.Save("Dimension"); Enemy.Save("Enemy"); EnemyGroups.Save("EnemyGroup"); EnemyPopulations.Save("EnemyPopulation"); ExpeditionBalances.Save("ExpeditionBalance"); Fogs.Save("FogSettings"); GameSetups.Save("GameSetup"); LevelLayouts.Save("LevelLayout"); LightSettings.Save("LightSettings"); Rundowns.Save("Rundown"); Texts.Save("Text"); WardenObjectives.Save("WardenObjective"); WavePopulations.Save("SurvivalWavePopulation"); WaveSettings.Save("SurvivalWaveSettings"); } } public class BlocksBin<T> where T : DataBlock { internal HashSet<uint> persistentIds = new HashSet<uint>(); public List<JObject> Headers { get; set; } = new List<JObject>(); public List<T> Blocks { get; set; } = new List<T>(); [JsonProperty("LastPersistentID")] public uint LastPersistentId { get; set; } public void AddBlock(T? block) { if (block != null && !persistentIds.Contains(block.PersistentId) && block.PersistentId != 0) { Blocks.Add(block); persistentIds.Add(block.PersistentId); LastPersistentId = Math.Max(LastPersistentId, block.PersistentId); } } public bool Contains(T? block) { return Blocks.Contains(block); } public T? GetBlock(T? block) { T block2 = block; return Blocks.Find((T b) => (DataBlock?)b == (DataBlock?)block2); } public T? GetBlock(Predicate<T> predicate) { return Blocks.Find(predicate); } public T? Find(uint id) { return Blocks.Find((T b) => b.PersistentId == id); } public void Save(string name) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown JsonSerializer val = new JsonSerializer(); val.Formatting = (Formatting)1; int revision = CellBuildData.GetRevision(); string text = Path.Combine(Paths.BepInExRootPath, "GameData", $"{revision}"); string path = Path.Combine(text, "GameData_" + name + "DataBlock_bin.json"); Directory.CreateDirectory(text); using StreamWriter streamWriter = new StreamWriter(path); JsonWriter val2 = (JsonWriter)new JsonTextWriter((TextWriter)streamWriter); try { val.Serialize(val2, (object)this); streamWriter.Flush(); } finally { ((IDisposable)val2)?.Dispose(); } } } public class LazyBlocksBin<T> : BlocksBin<T> where T : DataBlock { public new void AddBlock(T? block) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown if (block == null) { return; } if (base.Blocks.Contains(block)) { ManualLogSource logger = Plugin.Logger; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(27, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Already got ChainedPuzzle: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted<T>(block); } logger.LogWarning(val); } else { base.Blocks.Add(block); if (block.PersistentId != 0) { persistentIds.Add(block.PersistentId); base.LastPersistentId = Math.Max(base.LastPersistentId, block.PersistentId); } } } public void Persist() { foreach (T item in base.Blocks.Where((T block) => block.PersistentId == 0)) { item.PersistentId = Generator.GetPersistentId(); persistentIds.Add(item.PersistentId); base.LastPersistentId = Math.Max(base.LastPersistentId, item.PersistentId); } } public new void Save(string name) { Persist(); base.Save(name); } } public class BulkheadDoorPlacementData { public int ZoneIndex { get; set; } public ZonePlacementWeights PlacementWeights { get; set; } = new ZonePlacementWeights(); public int AreaSeedOffset { get; set; } public int MarkerSeedOffset { get; set; } } public record Color { [JsonProperty("a")] public double Alpha { get; set; } = 1.0; [JsonProperty("r")] public double Red { get; set; } = 1.0; [JsonProperty("g")] public double Green { get; set; } = 1.0; [JsonProperty("b")] public double Blue { get; set; } = 1.0; public static readonly Color MenuVisuals = new Color { Alpha = 1.0, Red = 0.4509804, Green = 0.7490196, Blue = 0.858823538 }; public static readonly Color MenuVisuals_MonthlyE = new Color { Alpha = 1.0, Red = 0.1509804, Green = 0.4190196, Blue = 0.858823538 }; public static readonly Color MenuVisuals_DailyE = new Color { Alpha = 1.0, Red = 0.8509804, Green = 0.4190196, Blue = 0.158823538 }; public static readonly Color White = new Color { Red = 1.0, Green = 1.0, Blue = 1.0, Alpha = 1.0 }; public static readonly Color InfectiousFog_R8D1 = new Color { Red = 0.356862754, Green = 1.0, Blue = 0.545098066, Alpha = 0.03137255 }; [CompilerGenerated] protected Color(Color original) { Alpha = original.Alpha; Red = original.Red; Green = original.Green; Blue = original.Blue; } public Color() { } } public record ConsumableDistribution : DataBlock { public uint SpawnsPerZone { get; set; } = 5u; public double ChanceToSpawnInResourceContainer { get; set; } = 0.9; public List<ItemSpawn> SpawnData { get; set; } = new List<ItemSpawn>(); public static ConsumableDistribution Baseline = new ConsumableDistribution { SpawnsPerZone = 6u, SpawnData = Collections.Flatten<ItemSpawn>(ItemSpawn.GlowSticks(8.0), new List<ItemSpawn> { new ItemSpawn { Weight = 8.0, Item = Item.LockMelter }, new ItemSpawn { Weight = 1.0, Item = Item.CfoamGrenade }, new ItemSpawn { Weight = 1.0, Item = Item.ExplosiveTripmine }, new ItemSpawn { Weight = 1.0, Item = Item.LongRangeFlashlight } }) }; public static ConsumableDistribution Baseline_FogRepellers = new ConsumableDistribution { SpawnsPerZone = 8u, SpawnData = Collections.Flatten<ItemSpawn>(ItemSpawn.GlowSticks(3.0), new List<ItemSpawn> { new ItemSpawn { Weight = 1.0, Item = Item.LockMelter }, new ItemSpawn { Weight = 4.0, Item = Item.FogRepeller } }) }; public static ConsumableDistribution Alarms_FogRepellers = new ConsumableDistribution { SpawnsPerZone = 12u, SpawnData = Collections.Flatten<ItemSpawn>(ItemSpawn.GlowSticks(), new List<ItemSpawn> { new ItemSpawn { Weight = 8.0, Item = Item.FogRepeller } }) }; public static ConsumableDistribution Reactor_FogRepellers = new ConsumableDistribution { SpawnsPerZone = 10u, SpawnData = Collections.Flatten<ItemSpawn>(ItemSpawn.GlowSticks(2.0), new List<ItemSpawn> { new ItemSpawn { Weight = 8.0, Item = Item.FogRepeller } }) }; public new static void SaveStatic() { Bins.ConsumableDistributions.AddBlock(Baseline); Bins.ConsumableDistributions.AddBlock(Baseline_FogRepellers); Bins.ConsumableDistributions.AddBlock(Alarms_FogRepellers); Bins.ConsumableDistributions.AddBlock(Reactor_FogRepellers); } [CompilerGenerated] protected ConsumableDistribution(ConsumableDistribution original) : base(original) { SpawnsPerZone = original.SpawnsPerZone; ChanceToSpawnInResourceContainer = original.ChanceToSpawnInResourceContainer; SpawnData = original.SpawnData; } public ConsumableDistribution() { } } public enum CoverageSize { Nano = 25, Tiny = 35, Small = 50, Medium = 75, Large = 100, Huge = 125 } public class CoverageMinMax { private static List<double> Sizes = new List<double> { 25.0, 35.0, 50.0, 75.0, 100.0, 125.0 }; private Vector2 vec = new Vector2 { X = 0f, Y = 0f }; public static readonly CoverageMinMax Nano = new CoverageMinMax { Min = 25.0, Max = 25.0 }; public static readonly CoverageMinMax Tiny = new CoverageMinMax { Min = 35.0, Max = 35.0 }; public static readonly CoverageMinMax Small = new CoverageMinMax { Min = 50.0, Max = 50.0 }; public static readonly CoverageMinMax Medium = new CoverageMinMax { Min = 75.0, Max = 75.0 }; public static readonly CoverageMinMax Large = new CoverageMinMax { Min = 100.0, Max = 100.0 }; public static readonly CoverageMinMax Huge = new CoverageMinMax { Min = 125.0, Max = 125.0 }; private static List<(double, (double, double))> NormalSizes = new List<(double, (double, double))> { (0.25, (10.0, 10.0)), (0.45, (10.0, 20.0)), (0.85, (20.0, 20.0)), (1.0, (20.0, 32.0)), (1.0, (32.0, 32.0)), (1.0, (32.0, 42.0)), (1.0, (42.0, 42.0)), (0.55, (42.0, 64.0)), (0.45, (64.0, 64.0)) }; [JsonProperty("x")] public double Min { get { return vec.X; } set { vec.X = (float)value; } } [JsonProperty("y")] public double Max { get { return vec.Y; } set { vec.Y = (float)value; } } [JsonProperty("normalized")] public JObject Normalized { get { //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_0027: 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_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown Vector2 vector = Vector2.Normalize(vec); return new JObject { ["x"] = JToken.op_Implicit(vector.X), ["y"] = JToken.op_Implicit(vector.Y), ["magnitude"] = JToken.op_Implicit(1.0), ["sqrMagnitude"] = JToken.op_Implicit(1.0) }; } } [JsonProperty("magnitude")] public double Magnitude => vec.Length(); [JsonProperty("sqrMagnitude")] public double SqrMagnitude => vec.LengthSquared(); public CoverageMinMax() { } public CoverageMinMax(double value) { Min = value; Max = value; } public static CoverageMinMax GenCoverage() { return new CoverageMinMax { Min = Generator.Pick(Sizes), Max = Generator.Pick(Sizes) }; } public static CoverageMinMax GenNormalSize() { var (min, max) = Generator.Select(NormalSizes); return new CoverageMinMax { Min = min, Max = max }; } public static CoverageMinMax GenStartZoneSize() { double num = Generator.Pick(new List<double> { 25.0, 30.0, 35.0, 50.0 }); return new CoverageMinMax { Min = num, Max = num + 20.0 }; } public static CoverageMinMax GenSize(int zoneIndex) { if (zoneIndex != 0) { return GenNormalSize(); } return GenStartZoneSize(); } } public record DataBlock { [JsonProperty("persistentID")] public uint PersistentId { get; set; } [JsonProperty("name")] public string BlockName { get { return $"{PersistentId}_{Name}"; } private set { } } [JsonIgnore] public string Name { get; set; } [JsonProperty(/*Could not decode attribute arguments.*/)] public string? Comment { get; set; } [JsonProperty("internalEnabled")] public bool Enabled { get; set; } = true; public DataBlock(uint? id = null) { PersistentId = id ?? Generator.GetPersistentId(); Name = PersistentId.ToString(); } public static void Setup<TGameData, TBlock>(BlocksBin<TBlock> bin, string filename) where TGameData : TBlock where TBlock : DataBlock { JObject obj = JObject.Parse(File.ReadAllText(Path.Combine(Path.Combine(Paths.PluginPath, "the_tavern-AutogenRundown"), "GameData_" + filename + "DataBlock_bin.json"))); if (((obj != null) ? obj["Blocks"] : null) == null) { throw new Exception("Failed to get 'Blocks' property"); } foreach (TGameData item in obj["Blocks"].ToObject<List<TGameData>>() ?? throw new Exception("Failed to parse " + filename)) { bin.AddBlock((TBlock)(DataBlock)item); } } public static void SaveStatic() { } } public record Dimension : DataBlock { [JsonProperty("DimensionData")] public AutogenRundown.DataBlocks.Dimensions.DimensionData Data { get; init; } = new AutogenRundown.DataBlocks.Dimensions.DimensionData(); public static readonly Dimension None = new Dimension { PersistentId = 0u, Name = "None" }; public static readonly Dimension PouncerArena = new Dimension { PersistentId = 14u, Name = "Dimension_Pouncer_Arena", Data = new AutogenRundown.DataBlocks.Dimensions.DimensionData { LevelLayoutData = 0, DimensionGeomorph = "Assets/AssetPrefabs/Complex/Dimensions/PouncerArena/Dimension_Pouncer_Arena_01.prefab", VerticalExtentsUp = 50.0, VerticalExtentsDown = 10.0, DimensionResourceSetID = 47, DimensionFogData = 93, EnvironmentWetness = 0.199, DustColor = new Color { Alpha = 1.0, Red = 0.65, Green = 0.6042968, Blue = 0.487499952 }, DustAlphaBoost = 0.0, DustTurbulence = 1.0, SoundEventOnWarpTo = 1998147319u, DisableVFXEventOnWarp = false, UseLocalDimensionSeeds = false, ForbidWaveSpawning = true, ForbidCarryItemWarps = true, LeaveDeployablesOnWarp = true, IsStaticDimension = true, StaticZoneSeed = 0, StaticMarkerSeed = 0, StaticLightSeed = 0, StaticLightSettings = 20, StaticAliasOverride = -1, StaticEnemySpawningInZone = new JArray(), StaticAllowResourceContainerAllocation = false, StaticAllowSmallPickupsAllocation = false, StaticForceBigPickupsAllocation = false, StaticConsumableDistributionInZone = 0, StaticBigPickupDistributionInZone = 0, StaticGroundSpawnersInZone = 0, StaticHealthMulti = 0.0, StaticToolAmmoMulti = 0.0, StaticWeaponAmmoMulti = 0.0, StaticDisinfectionMulti = 0.0, ForbidTerminalsInDimension = true, IsOutside = true, LightAzimuth = -4.7, LightElevation = 81.4, LightIntensity = 0.3198, AmbientIntensity = 1.106, ReflectionsIntensity = 1.547, GodrayRange = 7622.0, GodrayExponent = 1.227, AtmosphereData = 3, AtmosphereDensity
Newtonsoft.Json.dll
Decompiled 4 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Data.SqlTypes; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Dynamic; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Numerics; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters; using System.Runtime.Versioning; using System.Security; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Xml; using System.Xml.Linq; using Microsoft.CodeAnalysis; using Newtonsoft.Json.Bson; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq.JsonPath; using Newtonsoft.Json.Schema; using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Utilities; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AllowPartiallyTrustedCallers] [assembly: InternalsVisibleTo("Newtonsoft.Json.Schema, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")] [assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("9ca358aa-317b-4925-8ada-4a29e943a363")] [assembly: CLSCompliant(true)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")] [assembly: AssemblyCompany("Newtonsoft")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © James Newton-King 2008")] [assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")] [assembly: AssemblyFileVersion("13.0.3.27908")] [assembly: AssemblyInformationalVersion("13.0.3+0a2e291c0d9c0c7675d445703e51750363a549ef")] [assembly: AssemblyProduct("Json.NET")] [assembly: AssemblyTitle("Json.NET .NET 6.0")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/JamesNK/Newtonsoft.Json")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: AssemblyVersion("13.0.0.0")] 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; } } } namespace Newtonsoft.Json { public enum ConstructorHandling { Default, AllowNonPublicDefaultConstructor } public enum DateFormatHandling { IsoDateFormat, MicrosoftDateFormat } public enum DateParseHandling { None, DateTime, DateTimeOffset } public enum DateTimeZoneHandling { Local, Utc, Unspecified, RoundtripKind } public class DefaultJsonNameTable : JsonNameTable { private class Entry { internal readonly string Value; internal readonly int HashCode; internal Entry Next; internal Entry(string value, int hashCode, Entry next) { Value = value; HashCode = hashCode; Next = next; } } private static readonly int HashCodeRandomizer; private int _count; private Entry[] _entries; private int _mask = 31; static DefaultJsonNameTable() { HashCodeRandomizer = Environment.TickCount; } public DefaultJsonNameTable() { _entries = new Entry[_mask + 1]; } public override string? Get(char[] key, int start, int length) { if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; num += (num << 7) ^ key[start]; int num2 = start + length; for (int i = start + 1; i < num2; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; int num3 = Volatile.Read(ref _mask); int num4 = num & num3; for (Entry entry = _entries[num4]; entry != null; entry = entry.Next) { if (entry.HashCode == num && TextEquals(entry.Value, key, start, length)) { return entry.Value; } } return null; } public string Add(string key) { if (key == null) { throw new ArgumentNullException("key"); } int length = key.Length; if (length == 0) { return string.Empty; } int num = length + HashCodeRandomizer; for (int i = 0; i < key.Length; i++) { num += (num << 7) ^ key[i]; } num -= num >> 17; num -= num >> 11; num -= num >> 5; for (Entry entry = _entries[num & _mask]; entry != null; entry = entry.Next) { if (entry.HashCode == num && entry.Value.Equals(key, StringComparison.Ordinal)) { return entry.Value; } } return AddEntry(key, num); } private string AddEntry(string str, int hashCode) { int num = hashCode & _mask; Entry entry = new Entry(str, hashCode, _entries[num]); _entries[num] = entry; if (_count++ == _mask) { Grow(); } return entry.Value; } private void Grow() { Entry[] entries = _entries; int num = _mask * 2 + 1; Entry[] array = new Entry[num + 1]; for (int i = 0; i < entries.Length; i++) { Entry entry = entries[i]; while (entry != null) { int num2 = entry.HashCode & num; Entry next = entry.Next; entry.Next = array[num2]; array[num2] = entry; entry = next; } } _entries = array; Volatile.Write(ref _mask, num); } private static bool TextEquals(string str1, char[] str2, int str2Start, int str2Length) { if (str1.Length != str2Length) { return false; } for (int i = 0; i < str1.Length; i++) { if (str1[i] != str2[str2Start + i]) { return false; } } return true; } } [Flags] public enum DefaultValueHandling { Include = 0, Ignore = 1, Populate = 2, IgnoreAndPopulate = 3 } public enum FloatFormatHandling { String, Symbol, DefaultValue } public enum FloatParseHandling { Double, Decimal } public enum Formatting { None, Indented } public interface IArrayPool<T> { T[] Rent(int minimumLength); void Return(T[]? array); } public interface IJsonLineInfo { int LineNumber { get; } int LinePosition { get; } bool HasLineInfo(); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonArrayAttribute : JsonContainerAttribute { private bool _allowNullItems; public bool AllowNullItems { get { return _allowNullItems; } set { _allowNullItems = value; } } public JsonArrayAttribute() { } public JsonArrayAttribute(bool allowNullItems) { _allowNullItems = allowNullItems; } public JsonArrayAttribute(string id) : base(id) { } } [AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false)] public sealed class JsonConstructorAttribute : Attribute { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public abstract class JsonContainerAttribute : Attribute { internal bool? _isReference; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; private Type? _namingStrategyType; private object[]? _namingStrategyParameters; public string? Id { get; set; } public string? Title { get; set; } public string? Description { get; set; } public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get { return _namingStrategyType; } set { _namingStrategyType = value; NamingStrategyInstance = null; } } public object[]? NamingStrategyParameters { get { return _namingStrategyParameters; } set { _namingStrategyParameters = value; NamingStrategyInstance = null; } } internal NamingStrategy? NamingStrategyInstance { get; set; } public bool IsReference { get { return _isReference.GetValueOrDefault(); } set { _isReference = value; } } public bool ItemIsReference { get { return _itemIsReference.GetValueOrDefault(); } set { _itemIsReference = value; } } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } protected JsonContainerAttribute() { } protected JsonContainerAttribute(string id) { Id = id; } } public static class JsonConvert { public static readonly string True = "true"; public static readonly string False = "false"; public static readonly string Null = "null"; public static readonly string Undefined = "undefined"; public static readonly string PositiveInfinity = "Infinity"; public static readonly string NegativeInfinity = "-Infinity"; public static readonly string NaN = "NaN"; public static Func<JsonSerializerSettings>? DefaultSettings { get; set; } public static string ToString(DateTime value) { return ToString(value, DateFormatHandling.IsoDateFormat, DateTimeZoneHandling.RoundtripKind); } public static string ToString(DateTime value, DateFormatHandling format, DateTimeZoneHandling timeZoneHandling) { DateTime value2 = DateTimeUtils.EnsureDateTime(value, timeZoneHandling); using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeString(stringWriter, value2, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(DateTimeOffset value) { return ToString(value, DateFormatHandling.IsoDateFormat); } public static string ToString(DateTimeOffset value, DateFormatHandling format) { using StringWriter stringWriter = StringUtils.CreateStringWriter(64); stringWriter.Write('"'); DateTimeUtils.WriteDateTimeOffsetString(stringWriter, value, format, null, CultureInfo.InvariantCulture); stringWriter.Write('"'); return stringWriter.ToString(); } public static string ToString(bool value) { if (!value) { return False; } return True; } public static string ToString(char value) { return ToString(char.ToString(value)); } public static string ToString(Enum value) { return value.ToString("D"); } public static string ToString(int value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(short value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ushort value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(uint value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(long value) { return value.ToString(null, CultureInfo.InvariantCulture); } private static string ToStringInternal(BigInteger value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(ulong value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(float value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(float value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureFloatFormat(double value, string text, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { if (floatFormatHandling == FloatFormatHandling.Symbol || (!double.IsInfinity(value) && !double.IsNaN(value))) { return text; } if (floatFormatHandling == FloatFormatHandling.DefaultValue) { if (nullable) { return Null; } return "0.0"; } return quoteChar + text + quoteChar; } public static string ToString(double value) { return EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)); } internal static string ToString(double value, FloatFormatHandling floatFormatHandling, char quoteChar, bool nullable) { return EnsureFloatFormat(value, EnsureDecimalPlace(value, value.ToString("R", CultureInfo.InvariantCulture)), floatFormatHandling, quoteChar, nullable); } private static string EnsureDecimalPlace(double value, string text) { if (double.IsNaN(value) || double.IsInfinity(value) || StringUtils.IndexOf(text, '.') != -1 || StringUtils.IndexOf(text, 'E') != -1 || StringUtils.IndexOf(text, 'e') != -1) { return text; } return text + ".0"; } private static string EnsureDecimalPlace(string text) { if (StringUtils.IndexOf(text, '.') != -1) { return text; } return text + ".0"; } public static string ToString(byte value) { return value.ToString(null, CultureInfo.InvariantCulture); } [CLSCompliant(false)] public static string ToString(sbyte value) { return value.ToString(null, CultureInfo.InvariantCulture); } public static string ToString(decimal value) { return EnsureDecimalPlace(value.ToString(null, CultureInfo.InvariantCulture)); } public static string ToString(Guid value) { return ToString(value, '"'); } internal static string ToString(Guid value, char quoteChar) { string text = value.ToString("D", CultureInfo.InvariantCulture); string text2 = quoteChar.ToString(CultureInfo.InvariantCulture); return text2 + text + text2; } public static string ToString(TimeSpan value) { return ToString(value, '"'); } internal static string ToString(TimeSpan value, char quoteChar) { return ToString(value.ToString(), quoteChar); } public static string ToString(Uri? value) { if (value == null) { return Null; } return ToString(value, '"'); } internal static string ToString(Uri value, char quoteChar) { return ToString(value.OriginalString, quoteChar); } public static string ToString(string? value) { return ToString(value, '"'); } public static string ToString(string? value, char delimiter) { return ToString(value, delimiter, StringEscapeHandling.Default); } public static string ToString(string? value, char delimiter, StringEscapeHandling stringEscapeHandling) { if (delimiter != '"' && delimiter != '\'') { throw new ArgumentException("Delimiter must be a single or double quote.", "delimiter"); } return JavaScriptUtils.ToEscapedJavaScriptString(value, delimiter, appendDelimiters: true, stringEscapeHandling); } public static string ToString(object? value) { if (value == null) { return Null; } return ConvertUtils.GetTypeCode(value.GetType()) switch { PrimitiveTypeCode.String => ToString((string)value), PrimitiveTypeCode.Char => ToString((char)value), PrimitiveTypeCode.Boolean => ToString((bool)value), PrimitiveTypeCode.SByte => ToString((sbyte)value), PrimitiveTypeCode.Int16 => ToString((short)value), PrimitiveTypeCode.UInt16 => ToString((ushort)value), PrimitiveTypeCode.Int32 => ToString((int)value), PrimitiveTypeCode.Byte => ToString((byte)value), PrimitiveTypeCode.UInt32 => ToString((uint)value), PrimitiveTypeCode.Int64 => ToString((long)value), PrimitiveTypeCode.UInt64 => ToString((ulong)value), PrimitiveTypeCode.Single => ToString((float)value), PrimitiveTypeCode.Double => ToString((double)value), PrimitiveTypeCode.DateTime => ToString((DateTime)value), PrimitiveTypeCode.Decimal => ToString((decimal)value), PrimitiveTypeCode.DBNull => Null, PrimitiveTypeCode.DateTimeOffset => ToString((DateTimeOffset)value), PrimitiveTypeCode.Guid => ToString((Guid)value), PrimitiveTypeCode.Uri => ToString((Uri)value), PrimitiveTypeCode.TimeSpan => ToString((TimeSpan)value), PrimitiveTypeCode.BigInteger => ToStringInternal((BigInteger)value), _ => throw new ArgumentException("Unsupported type: {0}. Use the JsonSerializer class to get the object's JSON representation.".FormatWith(CultureInfo.InvariantCulture, value.GetType())), }; } [DebuggerStepThrough] public static string SerializeObject(object? value) { return SerializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting) { return SerializeObject(value, formatting, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static string SerializeObject(object? value, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, JsonSerializerSettings? settings) { return SerializeObject(value, null, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Type? type, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); return SerializeObjectInternal(value, type, jsonSerializer); } [DebuggerStepThrough] public static string SerializeObject(object? value, Formatting formatting, JsonSerializerSettings? settings) { return SerializeObject(value, null, formatting, settings); } [DebuggerStepThrough] public static string SerializeObject(object? value, Type? type, Formatting formatting, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); jsonSerializer.Formatting = formatting; return SerializeObjectInternal(value, type, jsonSerializer); } private static string SerializeObjectInternal(object? value, Type? type, JsonSerializer jsonSerializer) { StringWriter stringWriter = new StringWriter(new StringBuilder(256), CultureInfo.InvariantCulture); using (JsonTextWriter jsonTextWriter = new JsonTextWriter(stringWriter)) { jsonTextWriter.Formatting = jsonSerializer.Formatting; jsonSerializer.Serialize(jsonTextWriter, value, type); } return stringWriter.ToString(); } [DebuggerStepThrough] public static object? DeserializeObject(string value) { return DeserializeObject(value, (Type?)null, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static object? DeserializeObject(string value, JsonSerializerSettings settings) { return DeserializeObject(value, null, settings); } [DebuggerStepThrough] public static object? DeserializeObject(string value, Type type) { return DeserializeObject(value, type, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value) { return JsonConvert.DeserializeObject<T>(value, (JsonSerializerSettings?)null); } [DebuggerStepThrough] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject) { return DeserializeObject<T>(value); } [DebuggerStepThrough] public static T? DeserializeAnonymousType<T>(string value, T anonymousTypeObject, JsonSerializerSettings settings) { return DeserializeObject<T>(value, settings); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value, params JsonConverter[] converters) { return (T)DeserializeObject(value, typeof(T), converters); } [DebuggerStepThrough] public static T? DeserializeObject<T>(string value, JsonSerializerSettings? settings) { return (T)DeserializeObject(value, typeof(T), settings); } [DebuggerStepThrough] public static object? DeserializeObject(string value, Type type, params JsonConverter[] converters) { JsonSerializerSettings settings = ((converters != null && converters.Length != 0) ? new JsonSerializerSettings { Converters = converters } : null); return DeserializeObject(value, type, settings); } public static object? DeserializeObject(string value, Type? type, JsonSerializerSettings? settings) { ValidationUtils.ArgumentNotNull(value, "value"); JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); if (!jsonSerializer.IsCheckAdditionalContentSet()) { jsonSerializer.CheckAdditionalContent = true; } using JsonTextReader reader = new JsonTextReader(new StringReader(value)); return jsonSerializer.Deserialize(reader, type); } [DebuggerStepThrough] public static void PopulateObject(string value, object target) { PopulateObject(value, target, null); } public static void PopulateObject(string value, object target, JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = JsonSerializer.CreateDefault(settings); using JsonReader jsonReader = new JsonTextReader(new StringReader(value)); jsonSerializer.Populate(jsonReader, target); if (settings == null || !settings.CheckAdditionalContent) { return; } while (jsonReader.Read()) { if (jsonReader.TokenType != JsonToken.Comment) { throw JsonSerializationException.Create(jsonReader, "Additional text found in JSON string after finishing deserializing object."); } } } public static string SerializeXmlNode(XmlNode? node) { return SerializeXmlNode(node, Formatting.None); } public static string SerializeXmlNode(XmlNode? node, Formatting formatting) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); return SerializeObject(node, formatting, xmlNodeConverter); } public static string SerializeXmlNode(XmlNode? node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XmlDocument? DeserializeXmlNode(string value) { return DeserializeXmlNode(value, null); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXmlNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XmlDocument? DeserializeXmlNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), xmlNodeConverter); } public static string SerializeXNode(XObject? node) { return SerializeXNode(node, Formatting.None); } public static string SerializeXNode(XObject? node, Formatting formatting) { return SerializeXNode(node, formatting, omitRootObject: false); } public static string SerializeXNode(XObject? node, Formatting formatting, bool omitRootObject) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter { OmitRootObject = omitRootObject }; return SerializeObject(node, formatting, xmlNodeConverter); } public static XDocument? DeserializeXNode(string value) { return DeserializeXNode(value, null); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute: false); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute) { return DeserializeXNode(value, deserializeRootElementName, writeArrayAttribute, encodeSpecialCharacters: false); } public static XDocument? DeserializeXNode(string value, string? deserializeRootElementName, bool writeArrayAttribute, bool encodeSpecialCharacters) { XmlNodeConverter xmlNodeConverter = new XmlNodeConverter(); xmlNodeConverter.DeserializeRootElementName = deserializeRootElementName; xmlNodeConverter.WriteArrayAttribute = writeArrayAttribute; xmlNodeConverter.EncodeSpecialCharacters = encodeSpecialCharacters; return (XDocument)DeserializeObject(value, typeof(XDocument), xmlNodeConverter); } } public abstract class JsonConverter { public virtual bool CanRead => true; public virtual bool CanWrite => true; public abstract void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer); public abstract object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer); public abstract bool CanConvert(Type objectType); } public abstract class JsonConverter<T> : JsonConverter { public sealed override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { if (!((value != null) ? (value is T) : ReflectionUtils.IsNullable(typeof(T)))) { throw new JsonSerializationException("Converter cannot write specified value to JSON. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } WriteJson(writer, (T)value, serializer); } public abstract void WriteJson(JsonWriter writer, T? value, JsonSerializer serializer); public sealed override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { bool flag = existingValue == null; if (!flag && !(existingValue is T)) { throw new JsonSerializationException("Converter cannot read JSON with the specified existing value. {0} is required.".FormatWith(CultureInfo.InvariantCulture, typeof(T))); } return ReadJson(reader, objectType, flag ? default(T) : ((T)existingValue), !flag, serializer); } public abstract T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer); public sealed override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Interface | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonConverterAttribute : Attribute { private readonly Type _converterType; public Type ConverterType => _converterType; public object[]? ConverterParameters { get; } public JsonConverterAttribute(Type converterType) { if (converterType == null) { throw new ArgumentNullException("converterType"); } _converterType = converterType; } public JsonConverterAttribute(Type converterType, params object[] converterParameters) : this(converterType) { ConverterParameters = converterParameters; } } public class JsonConverterCollection : Collection<JsonConverter> { } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonDictionaryAttribute : JsonContainerAttribute { public JsonDictionaryAttribute() { } public JsonDictionaryAttribute(string id) : base(id) { } } [Serializable] public class JsonException : Exception { public JsonException() { } public JsonException(string message) : base(message) { } public JsonException(string message, Exception? innerException) : base(message, innerException) { } public JsonException(SerializationInfo info, StreamingContext context) : base(info, context) { } internal static JsonException Create(IJsonLineInfo lineInfo, string path, string message) { message = JsonPosition.FormatMessage(lineInfo, path, message); return new JsonException(message); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class JsonExtensionDataAttribute : Attribute { public bool WriteData { get; set; } public bool ReadData { get; set; } public JsonExtensionDataAttribute() { WriteData = true; ReadData = true; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonIgnoreAttribute : Attribute { } public abstract class JsonNameTable { public abstract string? Get(char[] key, int start, int length); } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false)] public sealed class JsonObjectAttribute : JsonContainerAttribute { private MemberSerialization _memberSerialization; internal MissingMemberHandling? _missingMemberHandling; internal Required? _itemRequired; internal NullValueHandling? _itemNullValueHandling; public MemberSerialization MemberSerialization { get { return _memberSerialization; } set { _memberSerialization = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling.GetValueOrDefault(); } set { _missingMemberHandling = value; } } public NullValueHandling ItemNullValueHandling { get { return _itemNullValueHandling.GetValueOrDefault(); } set { _itemNullValueHandling = value; } } public Required ItemRequired { get { return _itemRequired.GetValueOrDefault(); } set { _itemRequired = value; } } public JsonObjectAttribute() { } public JsonObjectAttribute(MemberSerialization memberSerialization) { MemberSerialization = memberSerialization; } public JsonObjectAttribute(string id) : base(id) { } } internal enum JsonContainerType { None, Object, Array, Constructor } internal struct JsonPosition { private static readonly char[] SpecialCharacters = new char[18] { '.', ' ', '\'', '/', '"', '[', ']', '(', ')', '\t', '\n', '\r', '\f', '\b', '\\', '\u0085', '\u2028', '\u2029' }; internal JsonContainerType Type; internal int Position; internal string? PropertyName; internal bool HasIndex; public JsonPosition(JsonContainerType type) { Type = type; HasIndex = TypeHasIndex(type); Position = -1; PropertyName = null; } internal int CalculateLength() { switch (Type) { case JsonContainerType.Object: return PropertyName.Length + 5; case JsonContainerType.Array: case JsonContainerType.Constructor: return MathUtils.IntLength((ulong)Position) + 2; default: throw new ArgumentOutOfRangeException("Type"); } } internal void WriteTo(StringBuilder sb, ref StringWriter? writer, ref char[]? buffer) { switch (Type) { case JsonContainerType.Object: { string propertyName = PropertyName; if (propertyName.IndexOfAny(SpecialCharacters) != -1) { sb.Append("['"); if (writer == null) { writer = new StringWriter(sb); } JavaScriptUtils.WriteEscapedJavaScriptString(writer, propertyName, '\'', appendDelimiters: false, JavaScriptUtils.SingleQuoteCharEscapeFlags, StringEscapeHandling.Default, null, ref buffer); sb.Append("']"); } else { if (sb.Length > 0) { sb.Append('.'); } sb.Append(propertyName); } break; } case JsonContainerType.Array: case JsonContainerType.Constructor: sb.Append('['); sb.Append(Position); sb.Append(']'); break; } } internal static bool TypeHasIndex(JsonContainerType type) { if (type != JsonContainerType.Array) { return type == JsonContainerType.Constructor; } return true; } internal static string BuildPath(List<JsonPosition> positions, JsonPosition? currentPosition) { int num = 0; if (positions != null) { for (int i = 0; i < positions.Count; i++) { num += positions[i].CalculateLength(); } } if (currentPosition.HasValue) { num += currentPosition.GetValueOrDefault().CalculateLength(); } StringBuilder stringBuilder = new StringBuilder(num); StringWriter writer = null; char[] buffer = null; if (positions != null) { foreach (JsonPosition position in positions) { position.WriteTo(stringBuilder, ref writer, ref buffer); } } currentPosition?.WriteTo(stringBuilder, ref writer, ref buffer); return stringBuilder.ToString(); } internal static string FormatMessage(IJsonLineInfo? lineInfo, string path, string message) { if (!message.EndsWith(Environment.NewLine, StringComparison.Ordinal)) { message = message.Trim(); if (!message.EndsWith('.')) { message += "."; } message += " "; } message += "Path '{0}'".FormatWith(CultureInfo.InvariantCulture, path); if (lineInfo != null && lineInfo.HasLineInfo()) { message += ", line {0}, position {1}".FormatWith(CultureInfo.InvariantCulture, lineInfo.LineNumber, lineInfo.LinePosition); } message += "."; return message; } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)] public sealed class JsonPropertyAttribute : Attribute { internal NullValueHandling? _nullValueHandling; internal DefaultValueHandling? _defaultValueHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal ObjectCreationHandling? _objectCreationHandling; internal TypeNameHandling? _typeNameHandling; internal bool? _isReference; internal int? _order; internal Required? _required; internal bool? _itemIsReference; internal ReferenceLoopHandling? _itemReferenceLoopHandling; internal TypeNameHandling? _itemTypeNameHandling; public Type? ItemConverterType { get; set; } public object[]? ItemConverterParameters { get; set; } public Type? NamingStrategyType { get; set; } public object[]? NamingStrategyParameters { get; set; } public NullValueHandling NullValueHandling { get { return _nullValueHandling.GetValueOrDefault(); } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling.GetValueOrDefault(); } set { _defaultValueHandling = value; } } public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling.GetValueOrDefault(); } set { _referenceLoopHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling.GetValueOrDefault(); } set { _objectCreationHandling = value; } } public TypeNameHandling TypeNameHandling { get { return _typeNameHandling.GetValueOrDefault(); } set { _typeNameHandling = value; } } public bool IsReference { get { return _isReference.GetValueOrDefault(); } set { _isReference = value; } } public int Order { get { return _order.GetValueOrDefault(); } set { _order = value; } } public Required Required { get { return _required.GetValueOrDefault(); } set { _required = value; } } public string? PropertyName { get; set; } public ReferenceLoopHandling ItemReferenceLoopHandling { get { return _itemReferenceLoopHandling.GetValueOrDefault(); } set { _itemReferenceLoopHandling = value; } } public TypeNameHandling ItemTypeNameHandling { get { return _itemTypeNameHandling.GetValueOrDefault(); } set { _itemTypeNameHandling = value; } } public bool ItemIsReference { get { return _itemIsReference.GetValueOrDefault(); } set { _itemIsReference = value; } } public JsonPropertyAttribute() { } public JsonPropertyAttribute(string propertyName) { PropertyName = propertyName; } } public abstract class JsonReader : IAsyncDisposable, IDisposable { protected internal enum State { Start, Complete, Property, ObjectStart, Object, ArrayStart, Array, Closed, PostValue, ConstructorStart, Constructor, Error, Finished } private JsonToken _tokenType; private object? _value; internal char _quoteChar; internal State _currentState; private JsonPosition _currentPosition; private CultureInfo? _culture; private DateTimeZoneHandling _dateTimeZoneHandling; private int? _maxDepth; private bool _hasExceededMaxDepth; internal DateParseHandling _dateParseHandling; internal FloatParseHandling _floatParseHandling; private string? _dateFormatString; private List<JsonPosition>? _stack; protected State CurrentState => _currentState; public bool CloseInput { get; set; } public bool SupportMultipleContent { get; set; } public virtual char QuoteChar { get { return _quoteChar; } protected internal set { _quoteChar = value; } } public DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling; } set { if (value < DateTimeZoneHandling.Local || value > DateTimeZoneHandling.RoundtripKind) { throw new ArgumentOutOfRangeException("value"); } _dateTimeZoneHandling = value; } } public DateParseHandling DateParseHandling { get { return _dateParseHandling; } set { if (value < DateParseHandling.None || value > DateParseHandling.DateTimeOffset) { throw new ArgumentOutOfRangeException("value"); } _dateParseHandling = value; } } public FloatParseHandling FloatParseHandling { get { return _floatParseHandling; } set { if (value < FloatParseHandling.Double || value > FloatParseHandling.Decimal) { throw new ArgumentOutOfRangeException("value"); } _floatParseHandling = value; } } public string? DateFormatString { get { return _dateFormatString; } set { _dateFormatString = value; } } public int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; } } public virtual JsonToken TokenType => _tokenType; public virtual object? Value => _value; public virtual Type? ValueType => _value?.GetType(); public virtual int Depth { get { int num = _stack?.Count ?? 0; if (JsonTokenUtils.IsStartToken(TokenType) || _currentPosition.Type == JsonContainerType.None) { return num; } return num + 1; } } public virtual string Path { get { if (_currentPosition.Type == JsonContainerType.None) { return string.Empty; } JsonPosition? currentPosition = ((_currentState != State.ArrayStart && _currentState != State.ConstructorStart && _currentState != State.ObjectStart) ? new JsonPosition?(_currentPosition) : null); return JsonPosition.BuildPath(_stack, currentPosition); } } public CultureInfo Culture { get { return _culture ?? CultureInfo.InvariantCulture; } set { _culture = value; } } ValueTask IAsyncDisposable.DisposeAsync() { try { Dispose(disposing: true); return default(ValueTask); } catch (Exception exception) { return ValueTask.FromException(exception); } } public virtual Task<bool> ReadAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool>() ?? Read().ToAsync(); } public async Task SkipAsync(CancellationToken cancellationToken = default(CancellationToken)) { if (TokenType == JsonToken.PropertyName) { await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false) && depth < Depth) { } } } internal async Task ReaderReadAndAssertAsync(CancellationToken cancellationToken) { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { throw CreateUnexpectedEndException(); } } public virtual Task<bool?> ReadAsBooleanAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<bool?>() ?? Task.FromResult(ReadAsBoolean()); } public virtual Task<byte[]?> ReadAsBytesAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<byte[]>() ?? Task.FromResult(ReadAsBytes()); } internal async Task<byte[]?> ReadArrayIntoByteArrayAsync(CancellationToken cancellationToken) { List<byte> buffer = new List<byte>(); do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(buffer)); byte[] array = buffer.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } public virtual Task<DateTime?> ReadAsDateTimeAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTime?>() ?? Task.FromResult(ReadAsDateTime()); } public virtual Task<DateTimeOffset?> ReadAsDateTimeOffsetAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<DateTimeOffset?>() ?? Task.FromResult(ReadAsDateTimeOffset()); } public virtual Task<decimal?> ReadAsDecimalAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<decimal?>() ?? Task.FromResult(ReadAsDecimal()); } public virtual Task<double?> ReadAsDoubleAsync(CancellationToken cancellationToken = default(CancellationToken)) { return Task.FromResult(ReadAsDouble()); } public virtual Task<int?> ReadAsInt32Async(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<int?>() ?? Task.FromResult(ReadAsInt32()); } public virtual Task<string?> ReadAsStringAsync(CancellationToken cancellationToken = default(CancellationToken)) { return cancellationToken.CancelIfRequestedAsync<string>() ?? Task.FromResult(ReadAsString()); } internal async Task<bool> ReadAndMoveToContentAsync(CancellationToken cancellationToken) { bool flag = await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); if (flag) { flag = await MoveToContentAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } return flag; } internal Task<bool> MoveToContentAsync(CancellationToken cancellationToken) { JsonToken tokenType = TokenType; if (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { return MoveToContentFromNonContentAsync(cancellationToken); } return AsyncUtils.True; } private async Task<bool> MoveToContentFromNonContentAsync(CancellationToken cancellationToken) { JsonToken tokenType; do { if (!(await ReadAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false))) { return false; } tokenType = TokenType; } while (tokenType == JsonToken.None || tokenType == JsonToken.Comment); return true; } internal JsonPosition GetPosition(int depth) { if (_stack != null && depth < _stack.Count) { return _stack[depth]; } return _currentPosition; } protected JsonReader() { _currentState = State.Start; _dateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; _dateParseHandling = DateParseHandling.DateTime; _floatParseHandling = FloatParseHandling.Double; _maxDepth = 64; CloseInput = true; } private void Push(JsonContainerType value) { UpdateScopeWithFinishedValue(); if (_currentPosition.Type == JsonContainerType.None) { _currentPosition = new JsonPosition(value); return; } if (_stack == null) { _stack = new List<JsonPosition>(); } _stack.Add(_currentPosition); _currentPosition = new JsonPosition(value); if (!_maxDepth.HasValue || !(Depth + 1 > _maxDepth) || _hasExceededMaxDepth) { return; } _hasExceededMaxDepth = true; throw JsonReaderException.Create(this, "The reader's MaxDepth of {0} has been exceeded.".FormatWith(CultureInfo.InvariantCulture, _maxDepth)); } private JsonContainerType Pop() { JsonPosition currentPosition; if (_stack != null && _stack.Count > 0) { currentPosition = _currentPosition; _currentPosition = _stack[_stack.Count - 1]; _stack.RemoveAt(_stack.Count - 1); } else { currentPosition = _currentPosition; _currentPosition = default(JsonPosition); } if (_maxDepth.HasValue && Depth <= _maxDepth) { _hasExceededMaxDepth = false; } return currentPosition.Type; } private JsonContainerType Peek() { return _currentPosition.Type; } public abstract bool Read(); public virtual int? ReadAsInt32() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is int) { return (int)value; } int num; if (value is BigInteger bigInteger) { num = (int)bigInteger; } else { try { num = Convert.ToInt32(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Integer, num, updateIndex: false); return num; } case JsonToken.String: { string s = (string)Value; return ReadInt32String(s); } default: throw JsonReaderException.Create(this, "Error reading integer. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal int? ReadInt32String(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (int.TryParse(s, NumberStyles.Integer, Culture, out var result)) { SetToken(JsonToken.Integer, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to integer: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual string? ReadAsString() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.String: return (string)Value; default: if (JsonTokenUtils.IsPrimitiveToken(contentToken)) { object value = Value; if (value != null) { string text = ((!(value is IFormattable formattable)) ? ((value is Uri uri) ? uri.OriginalString : value.ToString()) : formattable.ToString(null, Culture)); SetToken(JsonToken.String, text, updateIndex: false); return text; } } throw JsonReaderException.Create(this, "Error reading string. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } public virtual byte[]? ReadAsBytes() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.StartObject: { ReadIntoWrappedTypeObject(); byte[] array2 = ReadAsBytes(); ReaderReadAndAssert(); if (TokenType != JsonToken.EndObject) { throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } SetToken(JsonToken.Bytes, array2, updateIndex: false); return array2; } case JsonToken.String: { string text = (string)Value; Guid g; byte[] array3 = ((text.Length == 0) ? CollectionUtils.ArrayEmpty<byte>() : ((!ConvertUtils.TryConvertGuid(text, out g)) ? Convert.FromBase64String(text) : g.ToByteArray())); SetToken(JsonToken.Bytes, array3, updateIndex: false); return array3; } case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Bytes: if (Value is Guid guid) { byte[] array = guid.ToByteArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } return (byte[])Value; case JsonToken.StartArray: return ReadArrayIntoByteArray(); default: throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal byte[] ReadArrayIntoByteArray() { List<byte> list = new List<byte>(); do { if (!Read()) { SetToken(JsonToken.None); } } while (!ReadArrayElementIntoByteArrayReportDone(list)); byte[] array = list.ToArray(); SetToken(JsonToken.Bytes, array, updateIndex: false); return array; } private bool ReadArrayElementIntoByteArrayReportDone(List<byte> buffer) { switch (TokenType) { case JsonToken.None: throw JsonReaderException.Create(this, "Unexpected end when reading bytes."); case JsonToken.Integer: buffer.Add(Convert.ToByte(Value, CultureInfo.InvariantCulture)); return false; case JsonToken.EndArray: return true; case JsonToken.Comment: return false; default: throw JsonReaderException.Create(this, "Unexpected token when reading bytes: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } public virtual double? ReadAsDouble() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is double) { return (double)value; } double num = ((!(value is BigInteger bigInteger)) ? Convert.ToDouble(value, CultureInfo.InvariantCulture) : ((double)bigInteger)); SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDoubleString((string)Value); default: throw JsonReaderException.Create(this, "Error reading double. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal double? ReadDoubleString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (double.TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to double: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual bool? ReadAsBoolean() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { bool flag = ((!(Value is BigInteger bigInteger)) ? Convert.ToBoolean(Value, CultureInfo.InvariantCulture) : (bigInteger != 0L)); SetToken(JsonToken.Boolean, flag, updateIndex: false); return flag; } case JsonToken.String: return ReadBooleanString((string)Value); case JsonToken.Boolean: return (bool)Value; default: throw JsonReaderException.Create(this, "Error reading boolean. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal bool? ReadBooleanString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (bool.TryParse(s, out var result)) { SetToken(JsonToken.Boolean, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to boolean: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual decimal? ReadAsDecimal() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Integer: case JsonToken.Float: { object value = Value; if (value is decimal) { return (decimal)value; } decimal num; if (value is BigInteger bigInteger) { num = (decimal)bigInteger; } else { try { num = Convert.ToDecimal(value, CultureInfo.InvariantCulture); } catch (Exception ex) { throw JsonReaderException.Create(this, "Could not convert to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, value), ex); } } SetToken(JsonToken.Float, num, updateIndex: false); return num; } case JsonToken.String: return ReadDecimalString((string)Value); default: throw JsonReaderException.Create(this, "Error reading decimal. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal decimal? ReadDecimalString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (decimal.TryParse(s, NumberStyles.Number, Culture, out var result)) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } if (ConvertUtils.DecimalTryParse(s.ToCharArray(), 0, s.Length, out result) == ParseResult.Success) { SetToken(JsonToken.Float, result, updateIndex: false); return result; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to decimal: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTime? ReadAsDateTime() { switch (GetContentToken()) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTimeOffset dateTimeOffset) { SetToken(JsonToken.Date, dateTimeOffset.DateTime, updateIndex: false); } return (DateTime)Value; case JsonToken.String: return ReadDateTimeString((string)Value); default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, TokenType)); } } internal DateTime? ReadDateTimeString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTime(s, DateTimeZoneHandling, _dateFormatString, Culture, out var dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTime.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { dt = DateTimeUtils.EnsureDateTime(dt, DateTimeZoneHandling); SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } throw JsonReaderException.Create(this, "Could not convert string to DateTime: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } public virtual DateTimeOffset? ReadAsDateTimeOffset() { JsonToken contentToken = GetContentToken(); switch (contentToken) { case JsonToken.None: case JsonToken.Null: case JsonToken.EndArray: return null; case JsonToken.Date: if (Value is DateTime dateTime) { SetToken(JsonToken.Date, new DateTimeOffset(dateTime), updateIndex: false); } return (DateTimeOffset)Value; case JsonToken.String: { string s = (string)Value; return ReadDateTimeOffsetString(s); } default: throw JsonReaderException.Create(this, "Error reading date. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, contentToken)); } } internal DateTimeOffset? ReadDateTimeOffsetString(string? s) { if (StringUtils.IsNullOrEmpty(s)) { SetToken(JsonToken.Null, null, updateIndex: false); return null; } if (DateTimeUtils.TryParseDateTimeOffset(s, _dateFormatString, Culture, out var dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } if (DateTimeOffset.TryParse(s, Culture, DateTimeStyles.RoundtripKind, out dt)) { SetToken(JsonToken.Date, dt, updateIndex: false); return dt; } SetToken(JsonToken.String, s, updateIndex: false); throw JsonReaderException.Create(this, "Could not convert string to DateTimeOffset: {0}.".FormatWith(CultureInfo.InvariantCulture, s)); } internal void ReaderReadAndAssert() { if (!Read()) { throw CreateUnexpectedEndException(); } } internal JsonReaderException CreateUnexpectedEndException() { return JsonReaderException.Create(this, "Unexpected end when reading JSON."); } internal void ReadIntoWrappedTypeObject() { ReaderReadAndAssert(); if (Value != null && Value.ToString() == "$type") { ReaderReadAndAssert(); if (Value != null && Value.ToString().StartsWith("System.Byte[]", StringComparison.Ordinal)) { ReaderReadAndAssert(); if (Value.ToString() == "$value") { return; } } } throw JsonReaderException.Create(this, "Error reading bytes. Unexpected token: {0}.".FormatWith(CultureInfo.InvariantCulture, JsonToken.StartObject)); } public void Skip() { if (TokenType == JsonToken.PropertyName) { Read(); } if (JsonTokenUtils.IsStartToken(TokenType)) { int depth = Depth; while (Read() && depth < Depth) { } } } protected void SetToken(JsonToken newToken) { SetToken(newToken, null, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value) { SetToken(newToken, value, updateIndex: true); } protected void SetToken(JsonToken newToken, object? value, bool updateIndex) { _tokenType = newToken; _value = value; switch (newToken) { case JsonToken.StartObject: _currentState = State.ObjectStart; Push(JsonContainerType.Object); break; case JsonToken.StartArray: _currentState = State.ArrayStart; Push(JsonContainerType.Array); break; case JsonToken.StartConstructor: _currentState = State.ConstructorStart; Push(JsonContainerType.Constructor); break; case JsonToken.EndObject: ValidateEnd(JsonToken.EndObject); break; case JsonToken.EndArray: ValidateEnd(JsonToken.EndArray); break; case JsonToken.EndConstructor: ValidateEnd(JsonToken.EndConstructor); break; case JsonToken.PropertyName: _currentState = State.Property; _currentPosition.PropertyName = (string)value; break; case JsonToken.Raw: case JsonToken.Integer: case JsonToken.Float: case JsonToken.String: case JsonToken.Boolean: case JsonToken.Null: case JsonToken.Undefined: case JsonToken.Date: case JsonToken.Bytes: SetPostValueState(updateIndex); break; case JsonToken.Comment: break; } } internal void SetPostValueState(bool updateIndex) { if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } if (updateIndex) { UpdateScopeWithFinishedValue(); } } private void UpdateScopeWithFinishedValue() { if (_currentPosition.HasIndex) { _currentPosition.Position++; } } private void ValidateEnd(JsonToken endToken) { JsonContainerType jsonContainerType = Pop(); if (GetTypeForCloseToken(endToken) != jsonContainerType) { throw JsonReaderException.Create(this, "JsonToken {0} is not valid for closing JsonType {1}.".FormatWith(CultureInfo.InvariantCulture, endToken, jsonContainerType)); } if (Peek() != 0 || SupportMultipleContent) { _currentState = State.PostValue; } else { SetFinished(); } } protected void SetStateBasedOnCurrent() { JsonContainerType jsonContainerType = Peek(); switch (jsonContainerType) { case JsonContainerType.Object: _currentState = State.Object; break; case JsonContainerType.Array: _currentState = State.Array; break; case JsonContainerType.Constructor: _currentState = State.Constructor; break; case JsonContainerType.None: SetFinished(); break; default: throw JsonReaderException.Create(this, "While setting the reader state back to current object an unexpected JsonType was encountered: {0}".FormatWith(CultureInfo.InvariantCulture, jsonContainerType)); } } private void SetFinished() { _currentState = ((!SupportMultipleContent) ? State.Finished : State.Start); } private JsonContainerType GetTypeForCloseToken(JsonToken token) { return token switch { JsonToken.EndObject => JsonContainerType.Object, JsonToken.EndArray => JsonContainerType.Array, JsonToken.EndConstructor => JsonContainerType.Constructor, _ => throw JsonReaderException.Create(this, "Not a valid close JsonToken: {0}".FormatWith(CultureInfo.InvariantCulture, token)), }; } void IDisposable.Dispose() { Dispose(disposing: true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (_currentState != State.Closed && disposing) { Close(); } } public virtual void Close() { _currentState = State.Closed; _tokenType = JsonToken.None; _value = null; } internal void ReadAndAssert() { if (!Read()) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal void ReadForTypeAndAssert(JsonContract? contract, bool hasConverter) { if (!ReadForType(contract, hasConverter)) { throw JsonSerializationException.Create(this, "Unexpected end when reading JSON."); } } internal bool ReadForType(JsonContract? contract, bool hasConverter) { if (hasConverter) { return Read(); } switch (contract?.InternalReadType ?? ReadType.Read) { case ReadType.Read: return ReadAndMoveToContent(); case ReadType.ReadAsInt32: ReadAsInt32(); break; case ReadType.ReadAsInt64: { bool result = ReadAndMoveToContent(); if (TokenType == JsonToken.Undefined) { throw JsonReaderException.Create(this, "An undefined token is not a valid {0}.".FormatWith(CultureInfo.InvariantCulture, contract?.UnderlyingType ?? typeof(long))); } return result; } case ReadType.ReadAsDecimal: ReadAsDecimal(); break; case ReadType.ReadAsDouble: ReadAsDouble(); break; case ReadType.ReadAsBytes: ReadAsBytes(); break; case ReadType.ReadAsBoolean: ReadAsBoolean(); break; case ReadType.ReadAsString: ReadAsString(); break; case ReadType.ReadAsDateTime: ReadAsDateTime(); break; case ReadType.ReadAsDateTimeOffset: ReadAsDateTimeOffset(); break; default: throw new ArgumentOutOfRangeException(); } return TokenType != JsonToken.None; } internal bool ReadAndMoveToContent() { if (Read()) { return MoveToContent(); } return false; } internal bool MoveToContent() { JsonToken tokenType = TokenType; while (tokenType == JsonToken.None || tokenType == JsonToken.Comment) { if (!Read()) { return false; } tokenType = TokenType; } return true; } private JsonToken GetContentToken() { JsonToken tokenType; do { if (!Read()) { SetToken(JsonToken.None); return JsonToken.None; } tokenType = TokenType; } while (tokenType == JsonToken.Comment); return tokenType; } } [Serializable] public class JsonReaderException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonReaderException() { } public JsonReaderException(string message) : base(message) { } public JsonReaderException(string message, Exception innerException) : base(message, innerException) { } public JsonReaderException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonReaderException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonReaderException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonReaderException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonReaderException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonReaderException(message, path, lineNumber, linePosition, ex); } } [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public sealed class JsonRequiredAttribute : Attribute { } [Serializable] public class JsonSerializationException : JsonException { public int LineNumber { get; } public int LinePosition { get; } public string? Path { get; } public JsonSerializationException() { } public JsonSerializationException(string message) : base(message) { } public JsonSerializationException(string message, Exception innerException) : base(message, innerException) { } public JsonSerializationException(SerializationInfo info, StreamingContext context) : base(info, context) { } public JsonSerializationException(string message, string path, int lineNumber, int linePosition, Exception? innerException) : base(message, innerException) { Path = path; LineNumber = lineNumber; LinePosition = linePosition; } internal static JsonSerializationException Create(JsonReader reader, string message) { return Create(reader, message, null); } internal static JsonSerializationException Create(JsonReader reader, string message, Exception? ex) { return Create(reader as IJsonLineInfo, reader.Path, message, ex); } internal static JsonSerializationException Create(IJsonLineInfo? lineInfo, string path, string message, Exception? ex) { message = JsonPosition.FormatMessage(lineInfo, path, message); int lineNumber; int linePosition; if (lineInfo != null && lineInfo.HasLineInfo()) { lineNumber = lineInfo.LineNumber; linePosition = lineInfo.LinePosition; } else { lineNumber = 0; linePosition = 0; } return new JsonSerializationException(message, path, lineNumber, linePosition, ex); } } public class JsonSerializer { internal TypeNameHandling _typeNameHandling; internal TypeNameAssemblyFormatHandling _typeNameAssemblyFormatHandling; internal PreserveReferencesHandling _preserveReferencesHandling; internal ReferenceLoopHandling _referenceLoopHandling; internal MissingMemberHandling _missingMemberHandling; internal ObjectCreationHandling _objectCreationHandling; internal NullValueHandling _nullValueHandling; internal DefaultValueHandling _defaultValueHandling; internal ConstructorHandling _constructorHandling; internal MetadataPropertyHandling _metadataPropertyHandling; internal JsonConverterCollection? _converters; internal IContractResolver _contractResolver; internal ITraceWriter? _traceWriter; internal IEqualityComparer? _equalityComparer; internal ISerializationBinder _serializationBinder; internal StreamingContext _context; private IReferenceResolver? _referenceResolver; private Formatting? _formatting; private DateFormatHandling? _dateFormatHandling; private DateTimeZoneHandling? _dateTimeZoneHandling; private DateParseHandling? _dateParseHandling; private FloatFormatHandling? _floatFormatHandling; private FloatParseHandling? _floatParseHandling; private StringEscapeHandling? _stringEscapeHandling; private CultureInfo _culture; private int? _maxDepth; private bool _maxDepthSet; private bool? _checkAdditionalContent; private string? _dateFormatString; private bool _dateFormatStringSet; public virtual IReferenceResolver? ReferenceResolver { get { return GetReferenceResolver(); } set { if (value == null) { throw new ArgumentNullException("value", "Reference resolver cannot be null."); } _referenceResolver = value; } } [Obsolete("Binder is obsolete. Use SerializationBinder instead.")] public virtual SerializationBinder Binder { get { if (_serializationBinder is SerializationBinder result) { return result; } if (_serializationBinder is SerializationBinderAdapter serializationBinderAdapter) { return serializationBinderAdapter.SerializationBinder; } throw new InvalidOperationException("Cannot get SerializationBinder because an ISerializationBinder was previously set."); } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = (value as ISerializationBinder) ?? new SerializationBinderAdapter(value); } } public virtual ISerializationBinder SerializationBinder { get { return _serializationBinder; } set { if (value == null) { throw new ArgumentNullException("value", "Serialization binder cannot be null."); } _serializationBinder = value; } } public virtual ITraceWriter? TraceWriter { get { return _traceWriter; } set { _traceWriter = value; } } public virtual IEqualityComparer? EqualityComparer { get { return _equalityComparer; } set { _equalityComparer = value; } } public virtual TypeNameHandling TypeNameHandling { get { return _typeNameHandling; } set { if (value < TypeNameHandling.None || value > TypeNameHandling.Auto) { throw new ArgumentOutOfRangeException("value"); } _typeNameHandling = value; } } [Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")] public virtual FormatterAssemblyStyle TypeNameAssemblyFormat { get { return (FormatterAssemblyStyle)_typeNameAssemblyFormatHandling; } set { if (value < FormatterAssemblyStyle.Simple || value > FormatterAssemblyStyle.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value; } } public virtual TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get { return _typeNameAssemblyFormatHandling; } set { if (value < TypeNameAssemblyFormatHandling.Simple || value > TypeNameAssemblyFormatHandling.Full) { throw new ArgumentOutOfRangeException("value"); } _typeNameAssemblyFormatHandling = value; } } public virtual PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling; } set { if (value < PreserveReferencesHandling.None || value > PreserveReferencesHandling.All) { throw new ArgumentOutOfRangeException("value"); } _preserveReferencesHandling = value; } } public virtual ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling; } set { if (value < ReferenceLoopHandling.Error || value > ReferenceLoopHandling.Serialize) { throw new ArgumentOutOfRangeException("value"); } _referenceLoopHandling = value; } } public virtual MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling; } set { if (value < MissingMemberHandling.Ignore || value > MissingMemberHandling.Error) { throw new ArgumentOutOfRangeException("value"); } _missingMemberHandling = value; } } public virtual NullValueHandling NullValueHandling { get { return _nullValueHandling; } set { if (value < NullValueHandling.Include || value > NullValueHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _nullValueHandling = value; } } public virtual DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling; } set { if (value < DefaultValueHandling.Include || value > DefaultValueHandling.IgnoreAndPopulate) { throw new ArgumentOutOfRangeException("value"); } _defaultValueHandling = value; } } public virtual ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling; } set { if (value < ObjectCreationHandling.Auto || value > ObjectCreationHandling.Replace) { throw new ArgumentOutOfRangeException("value"); } _objectCreationHandling = value; } } public virtual ConstructorHandling ConstructorHandling { get { return _constructorHandling; } set { if (value < ConstructorHandling.Default || value > ConstructorHandling.AllowNonPublicDefaultConstructor) { throw new ArgumentOutOfRangeException("value"); } _constructorHandling = value; } } public virtual MetadataPropertyHandling MetadataPropertyHandling { get { return _metadataPropertyHandling; } set { if (value < MetadataPropertyHandling.Default || value > MetadataPropertyHandling.Ignore) { throw new ArgumentOutOfRangeException("value"); } _metadataPropertyHandling = value; } } public virtual JsonConverterCollection Converters { get { if (_converters == null) { _converters = new JsonConverterCollection(); } return _converters; } } public virtual IContractResolver ContractResolver { get { return _contractResolver; } set { _contractResolver = value ?? DefaultContractResolver.Instance; } } public virtual StreamingContext Context { get { return _context; } set { _context = value; } } public virtual Formatting Formatting { get { return _formatting.GetValueOrDefault(); } set { _formatting = value; } } public virtual DateFormatHandling DateFormatHandling { get { return _dateFormatHandling.GetValueOrDefault(); } set { _dateFormatHandling = value; } } public virtual DateTimeZoneHandling DateTimeZoneHandling { get { return _dateTimeZoneHandling ?? DateTimeZoneHandling.RoundtripKind; } set { _dateTimeZoneHandling = value; } } public virtual DateParseHandling DateParseHandling { get { return _dateParseHandling ?? DateParseHandling.DateTime; } set { _dateParseHandling = value; } } public virtual FloatParseHandling FloatParseHandling { get { return _floatParseHandling.GetValueOrDefault(); } set { _floatParseHandling = value; } } public virtual FloatFormatHandling FloatFormatHandling { get { return _floatFormatHandling.GetValueOrDefault(); } set { _floatFormatHandling = value; } } public virtual StringEscapeHandling StringEscapeHandling { get { return _stringEscapeHandling.GetValueOrDefault(); } set { _stringEscapeHandling = value; } } public virtual string DateFormatString { get { return _dateFormatString ?? "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; } set { _dateFormatString = value; _dateFormatStringSet = true; } } public virtual CultureInfo Culture { get { return _culture ?? JsonSerializerSettings.DefaultCulture; } set { _culture = value; } } public virtual int? MaxDepth { get { return _maxDepth; } set { if (value <= 0) { throw new ArgumentException("Value must be positive.", "value"); } _maxDepth = value; _maxDepthSet = true; } } public virtual bool CheckAdditionalContent { get { return _checkAdditionalContent.GetValueOrDefault(); } set { _checkAdditionalContent = value; } } public virtual event EventHandler<ErrorEventArgs>? Error; internal bool IsCheckAdditionalContentSet() { return _checkAdditionalContent.HasValue; } public JsonSerializer() { _referenceLoopHandling = ReferenceLoopHandling.Error; _missingMemberHandling = MissingMemberHandling.Ignore; _nullValueHandling = NullValueHandling.Include; _defaultValueHandling = DefaultValueHandling.Include; _objectCreationHandling = ObjectCreationHandling.Auto; _preserveReferencesHandling = PreserveReferencesHandling.None; _constructorHandling = ConstructorHandling.Default; _typeNameHandling = TypeNameHandling.None; _metadataPropertyHandling = MetadataPropertyHandling.Default; _context = JsonSerializerSettings.DefaultContext; _serializationBinder = DefaultSerializationBinder.Instance; _culture = JsonSerializerSettings.DefaultCulture; _contractResolver = DefaultContractResolver.Instance; } public static JsonSerializer Create() { return new JsonSerializer(); } public static JsonSerializer Create(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = Create(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } public static JsonSerializer CreateDefault() { return Create(JsonConvert.DefaultSettings?.Invoke()); } public static JsonSerializer CreateDefault(JsonSerializerSettings? settings) { JsonSerializer jsonSerializer = CreateDefault(); if (settings != null) { ApplySerializerSettings(jsonSerializer, settings); } return jsonSerializer; } private static void ApplySerializerSettings(JsonSerializer serializer, JsonSerializerSettings settings) { if (!CollectionUtils.IsNullOrEmpty(settings.Converters)) { for (int i = 0; i < settings.Converters.Count; i++) { serializer.Converters.Insert(i, settings.Converters[i]); } } if (settings._typeNameHandling.HasValue) { serializer.TypeNameHandling = settings.TypeNameHandling; } if (settings._metadataPropertyHandling.HasValue) { serializer.MetadataPropertyHandling = settings.MetadataPropertyHandling; } if (settings._typeNameAssemblyFormatHandling.HasValue) { serializer.TypeNameAssemblyFormatHandling = settings.TypeNameAssemblyFormatHandling; } if (settings._preserveReferencesHandling.HasValue) { serializer.PreserveReferencesHandling = settings.PreserveReferencesHandling; } if (settings._referenceLoopHandling.HasValue) { serializer.ReferenceLoopHandling = settings.ReferenceLoopHandling; } if (settings._missingMemberHandling.HasValue) { serializer.MissingMemberHandling = settings.MissingMemberHandling; } if (settings._objectCreationHandling.HasValue) { serializer.ObjectCreationHandling = settings.ObjectCreationHandling; } if (settings._nullValueHandling.HasValue) { serializer.NullValueHandling = settings.NullValueHandling; } if (settings._defaultValueHandling.HasValue) { serializer.DefaultValueHandling = settings.DefaultValueHandling; } if (settings._constructorHandling.HasValue) { serializer.ConstructorHandling = settings.ConstructorHandling; } if (settings._context.HasValue) { serializer.Context = settings.Context; } if (settings._checkAdditionalContent.HasValue) { serializer._checkAdditionalContent = settings._checkAdditionalContent; } if (settings.Error != null) { serializer.Error += settings.Error; } if (settings.ContractResolver != null) { serializer.ContractResolver = settings.ContractResolver; } if (settings.ReferenceResolverProvider != null) { serializer.ReferenceResolver = settings.ReferenceResolverProvider(); } if (settings.TraceWriter != null) { serializer.TraceWriter = settings.TraceWriter; } if (settings.EqualityComparer != null) { serializer.EqualityComparer = settings.EqualityComparer; } if (settings.SerializationBinder != null) { serializer.SerializationBinder = settings.SerializationBinder; } if (settings._formatting.HasValue) { serializer._formatting = settings._formatting; } if (settings._dateFormatHandling.HasValue) { serializer._dateFormatHandling = settings._dateFormatHandling; } if (settings._dateTimeZoneHandling.HasValue) { serializer._dateTimeZoneHandling = settings._dateTimeZoneHandling; } if (settings._dateParseHandling.HasValue) { serializer._dateParseHandling = settings._dateParseHandling; } if (settings._dateFormatStringSet) { serializer._dateFormatString = settings._dateFormatString; serializer._dateFormatStringSet = settings._dateFormatStringSet; } if (settings._floatFormatHandling.HasValue) { serializer._floatFormatHandling = settings._floatFormatHandling; } if (settings._floatParseHandling.HasValue) { serializer._floatParseHandling = settings._floatParseHandling; } if (settings._stringEscapeHandling.HasValue) { serializer._stringEscapeHandling = settings._stringEscapeHandling; } if (settings._culture != null) { serializer._culture = settings._culture; } if (settings._maxDepthSet) { serializer._maxDepth = settings._maxDepth; serializer._maxDepthSet = settings._maxDepthSet; } } [DebuggerStepThrough] public void Populate(TextReader reader, object target) { Populate(new JsonTextReader(reader), target); } [DebuggerStepThrough] public void Populate(JsonReader reader, object target) { PopulateInternal(reader, target); } internal virtual void PopulateInternal(JsonReader reader, object target) { ValidationUtils.ArgumentNotNull(reader, "reader"); ValidationUtils.ArgumentNotNull(target, "target"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); new JsonSerializerInternalReader(this).Populate(traceJsonReader ?? reader, target); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader) { return Deserialize(reader, null); } [DebuggerStepThrough] public object? Deserialize(TextReader reader, Type objectType) { return Deserialize(new JsonTextReader(reader), objectType); } [DebuggerStepThrough] public T? Deserialize<T>(JsonReader reader) { return (T)Deserialize(reader, typeof(T)); } [DebuggerStepThrough] public object? Deserialize(JsonReader reader, Type? objectType) { return DeserializeInternal(reader, objectType); } internal virtual object? DeserializeInternal(JsonReader reader, Type? objectType) { ValidationUtils.ArgumentNotNull(reader, "reader"); SetupReader(reader, out CultureInfo previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string previousDateFormatString); TraceJsonReader traceJsonReader = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? CreateTraceJsonReader(reader) : null); object? result = new JsonSerializerInternalReader(this).Deserialize(traceJsonReader ?? reader, objectType, CheckAdditionalContent); if (traceJsonReader != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonReader.GetDeserializedJsonMessage(), null); } ResetReader(reader, previousCulture, previousDateTimeZoneHandling, previousDateParseHandling, previousFloatParseHandling, previousMaxDepth, previousDateFormatString); return result; } internal void SetupReader(JsonReader reader, out CultureInfo? previousCulture, out DateTimeZoneHandling? previousDateTimeZoneHandling, out DateParseHandling? previousDateParseHandling, out FloatParseHandling? previousFloatParseHandling, out int? previousMaxDepth, out string? previousDateFormatString) { if (_culture != null && !_culture.Equals(reader.Culture)) { previousCulture = reader.Culture; reader.Culture = _culture; } else { previousCulture = null; } if (_dateTimeZoneHandling.HasValue && reader.DateTimeZoneHandling != _dateTimeZoneHandling) { previousDateTimeZoneHandling = reader.DateTimeZoneHandling; reader.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } else { previousDateTimeZoneHandling = null; } if (_dateParseHandling.HasValue && reader.DateParseHandling != _dateParseHandling) { previousDateParseHandling = reader.DateParseHandling; reader.DateParseHandling = _dateParseHandling.GetValueOrDefault(); } else { previousDateParseHandling = null; } if (_floatParseHandling.HasValue && reader.FloatParseHandling != _floatParseHandling) { previousFloatParseHandling = reader.FloatParseHandling; reader.FloatParseHandling = _floatParseHandling.GetValueOrDefault(); } else { previousFloatParseHandling = null; } if (_maxDepthSet && reader.MaxDepth != _maxDepth) { previousMaxDepth = reader.MaxDepth; reader.MaxDepth = _maxDepth; } else { previousMaxDepth = null; } if (_dateFormatStringSet && reader.DateFormatString != _dateFormatString) { previousDateFormatString = reader.DateFormatString; reader.DateFormatString = _dateFormatString; } else { previousDateFormatString = null; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable == null && _contractResolver is DefaultContractResolver defaultContractResolver) { jsonTextReader.PropertyNameTable = defaultContractResolver.GetNameTable(); } } private void ResetReader(JsonReader reader, CultureInfo? previousCulture, DateTimeZoneHandling? previousDateTimeZoneHandling, DateParseHandling? previousDateParseHandling, FloatParseHandling? previousFloatParseHandling, int? previousMaxDepth, string? previousDateFormatString) { if (previousCulture != null) { reader.Culture = previousCulture; } if (previousDateTimeZoneHandling.HasValue) { reader.DateTimeZoneHandling = previousDateTimeZoneHandling.GetValueOrDefault(); } if (previousDateParseHandling.HasValue) { reader.DateParseHandling = previousDateParseHandling.GetValueOrDefault(); } if (previousFloatParseHandling.HasValue) { reader.FloatParseHandling = previousFloatParseHandling.GetValueOrDefault(); } if (_maxDepthSet) { reader.MaxDepth = previousMaxDepth; } if (_dateFormatStringSet) { reader.DateFormatString = previousDateFormatString; } if (reader is JsonTextReader jsonTextReader && jsonTextReader.PropertyNameTable != null && _contractResolver is DefaultContractResolver defaultContractResolver && jsonTextReader.PropertyNameTable == defaultContractResolver.GetNameTable()) { jsonTextReader.PropertyNameTable = null; } } public void Serialize(TextWriter textWriter, object? value) { Serialize(new JsonTextWriter(textWriter), value); } public void Serialize(JsonWriter jsonWriter, object? value, Type? objectType) { SerializeInternal(jsonWriter, value, objectType); } public void Serialize(TextWriter textWriter, object? value, Type objectType) { Serialize(new JsonTextWriter(textWriter), value, objectType); } public void Serialize(JsonWriter jsonWriter, object? value) { SerializeInternal(jsonWriter, value, null); } private TraceJsonReader CreateTraceJsonReader(JsonReader reader) { TraceJsonReader traceJsonReader = new TraceJsonReader(reader); if (reader.TokenType != 0) { traceJsonReader.WriteCurrentToken(); } return traceJsonReader; } internal virtual void SerializeInternal(JsonWriter jsonWriter, object? value, Type? objectType) { ValidationUtils.ArgumentNotNull(jsonWriter, "jsonWriter"); Formatting? formatting = null; if (_formatting.HasValue && jsonWriter.Formatting != _formatting) { formatting = jsonWriter.Formatting; jsonWriter.Formatting = _formatting.GetValueOrDefault(); } DateFormatHandling? dateFormatHandling = null; if (_dateFormatHandling.HasValue && jsonWriter.DateFormatHandling != _dateFormatHandling) { dateFormatHandling = jsonWriter.DateFormatHandling; jsonWriter.DateFormatHandling = _dateFormatHandling.GetValueOrDefault(); } DateTimeZoneHandling? dateTimeZoneHandling = null; if (_dateTimeZoneHandling.HasValue && jsonWriter.DateTimeZoneHandling != _dateTimeZoneHandling) { dateTimeZoneHandling = jsonWriter.DateTimeZoneHandling; jsonWriter.DateTimeZoneHandling = _dateTimeZoneHandling.GetValueOrDefault(); } FloatFormatHandling? floatFormatHandling = null; if (_floatFormatHandling.HasValue && jsonWriter.FloatFormatHandling != _floatFormatHandling) { floatFormatHandling = jsonWriter.FloatFormatHandling; jsonWriter.FloatFormatHandling = _floatFormatHandling.GetValueOrDefault(); } StringEscapeHandling? stringEscapeHandling = null; if (_stringEscapeHandling.HasValue && jsonWriter.StringEscapeHandling != _stringEscapeHandling) { stringEscapeHandling = jsonWriter.StringEscapeHandling; jsonWriter.StringEscapeHandling = _stringEscapeHandling.GetValueOrDefault(); } CultureInfo cultureInfo = null; if (_culture != null && !_culture.Equals(jsonWriter.Culture)) { cultureInfo = jsonWriter.Culture; jsonWriter.Culture = _culture; } string dateFormatString = null; if (_dateFormatStringSet && jsonWriter.DateFormatString != _dateFormatString) { dateFormatString = jsonWriter.DateFormatString; jsonWriter.DateFormatString = _dateFormatString; } TraceJsonWriter traceJsonWriter = ((TraceWriter != null && TraceWriter.LevelFilter >= TraceLevel.Verbose) ? new TraceJsonWriter(jsonWriter) : null); new JsonSerializerInternalWriter(this).Serialize(traceJsonWriter ?? jsonWriter, value, objectType); if (traceJsonWriter != null) { TraceWriter.Trace(TraceLevel.Verbose, traceJsonWriter.GetSerializedJsonMessage(), null); } if (formatting.HasValue) { jsonWriter.Formatting = formatting.GetValueOrDefault(); } if (dateFormatHandling.HasValue) { jsonWriter.DateFormatHandling = dateFormatHandling.GetValueOrDefault(); } if (dateTimeZoneHandling.HasValue) { jsonWriter.DateTimeZoneHandling = dateTimeZoneHandling.GetValueOrDefault(); } if (floatFormatHandling.HasValue) { jsonWriter.FloatFormatHandling = floatFormatHandling.GetValueOrDefault(); } if (stringEscapeHandling.HasValue) { jsonWriter.StringEscapeHandling = stringEscapeHandling.GetValueOrDefault(); } if (_dateFormatStringSet) { jsonWriter.DateFormatString = dateFormatString; } if (cultureInfo != null) { jsonWriter.Culture = cultureInfo; } } internal IReferenceResolver GetReferenceResolver() { if (_referenceResolver == null) { _referenceResolver = new DefaultReferenceResolver(); } return _referenceResolver; } internal JsonConverter? GetMatchingConverter(Type type) { return GetMatchingConverter(_converters, type); } internal static JsonConverter? GetMatchingConverter(IList<JsonConverter>? converters, Type objectType) { if (converters != null) { for (int i = 0; i < converters.Count; i++) { JsonConverter jsonConverter = converters[i]; if (jsonConverter.CanConvert(objectType)) { return jsonConverter; } } } return null; } internal void OnError(ErrorEventArgs e) { this.Error?.Invoke(this, e); } } public class JsonSerializerSettings { internal const ReferenceLoopHandling DefaultReferenceLoopHandling = ReferenceLoopHandling.Error; internal const MissingMemberHandling DefaultMissingMemberHandling = MissingMemberHandling.Ignore; internal const NullValueHandling DefaultNullValueHandling = NullValueHandling.Include; internal const DefaultValueHandling DefaultDefaultValueHandling = DefaultValueHandling.Include; internal const ObjectCreationHandling DefaultObjectCreationHandling = ObjectCreationHandling.Auto; internal const PreserveReferencesHandling DefaultPreserveReferencesHandling = PreserveReferencesHandling.None; internal const ConstructorHandling DefaultConstructorHandling = ConstructorHandling.Default; internal const TypeNameHandling DefaultTypeNameHandling = TypeNameHandling.None; internal const MetadataPropertyHandling DefaultMetadataPropertyHandling = MetadataPropertyHandling.Default; internal static readonly StreamingContext DefaultContext; internal const Formatting DefaultFormatting = Formatting.None; internal const DateFormatHandling DefaultDateFormatHandling = DateFormatHandling.IsoDateFormat; internal const DateTimeZoneHandling DefaultDateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; internal const DateParseHandling DefaultDateParseHandling = DateParseHandling.DateTime; internal const FloatParseHandling DefaultFloatParseHandling = FloatParseHandling.Double; internal const FloatFormatHandling DefaultFloatFormatHandling = FloatFormatHandling.String; internal const StringEscapeHandling DefaultStringEscapeHandling = StringEscapeHandling.Default; internal const TypeNameAssemblyFormatHandling DefaultTypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; internal static readonly CultureInfo DefaultCulture; internal const bool DefaultCheckAdditionalContent = false; internal const string DefaultDateFormatString = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK"; internal const int DefaultMaxDepth = 64; internal Formatting? _formatting; internal DateFormatHandling? _dateFormatHandling; internal DateTimeZoneHandling? _dateTimeZoneHandling; internal DateParseHandling? _dateParseHandling; internal FloatFormatHandling? _floatFormatHandling; internal FloatParseHandling? _floatParseHandling; internal StringEscapeHandling? _stringEscapeHandling; internal CultureInfo? _culture; internal bool? _checkAdditionalContent; internal int? _maxDepth; internal bool _maxDepthSet; internal string? _dateFormatString; internal bool _dateFormatStringSet; internal TypeNameAssemblyFormatHandling? _typeNameAssemblyFormatHandling; internal DefaultValueHandling? _defaultValueHandling; internal PreserveReferencesHandling? _preserveReferencesHandling; internal NullValueHandling? _nullValueHandling; internal ObjectCreationHandling? _objectCreationHandling; internal MissingMemberHandling? _missingMemberHandling; internal ReferenceLoopHandling? _referenceLoopHandling; internal StreamingContext? _context; internal ConstructorHandling? _constructorHandling; internal TypeNameHandling? _typeNameHandling; internal MetadataPropertyHandling? _metadataPropertyHandling; public ReferenceLoopHandling ReferenceLoopHandling { get { return _referenceLoopHandling.GetValueOrDefault(); } set { _referenceLoopHandling = value; } } public MissingMemberHandling MissingMemberHandling { get { return _missingMemberHandling.GetValueOrDefault(); } set { _missingMemberHandling = value; } } public ObjectCreationHandling ObjectCreationHandling { get { return _objectCreationHandling.GetValueOrDefault(); } set { _objectCreationHandling = value; } } public NullValueHandling NullValueHandling { get { return _nullValueHandling.GetValueOrDefault(); } set { _nullValueHandling = value; } } public DefaultValueHandling DefaultValueHandling { get { return _defaultValueHandling.GetValueOrDefault(); } set { _defaultValueHandling = value; } } public IList<JsonConverter> Converters { get; set; } public PreserveReferencesHandling PreserveReferencesHandling { get { return _preserveReferencesHandling.GetValueOrDefault(); } set { _preserveReferencesHandling = value; } } public TypeNameHandling TypeNameHandling { get { return _typeNameHandling.GetValueOrDefault(); } set { _typeNameHandling = value; } } public MetadataPropertyHandling MetadataPropertyHandling { get { return _metadataPropertyHandling.GetValueOrDefault(); } set { _metadataPropertyHandling = value; } } [Obsolete("TypeNameAssemblyFormat is obsolete. Use TypeNameAssemblyFormatHandling instead.")] public FormatterAssemblyStyle TypeNameAssemblyFormat { get { return (FormatterAssemblyStyle)TypeNameAssemblyFormatHandling; } set { TypeNameAssemblyFormatHandling = (TypeNameAssemblyFormatHandling)value; } } public TypeNameAssemblyFormatHandling TypeNameAssemblyFormatHandling { get { return _typeNameAssemblyFormatHandling.GetValueOrDefault(); } set { _typeNameAssemblyFormatHandling = value; } } public ConstructorHandling ConstructorHandling { get { return _constructorHandling.GetValueOrDefault(); } set { _constructorHandling = value; } } public IContractResolver? ContractResolver { get; set; } public IEqualityComparer? EqualityComparer { get; set; } [Obsolete("Refer
YamlDotNet.dll
Decompiled 4 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Text; using System.Text.RegularExpressions; using System.Threading; using Microsoft.CodeAnalysis; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.ObjectPool; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.BufferedDeserialization; using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators; using YamlDotNet.Serialization.Callbacks; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: ComVisible(false)] [assembly: AssemblyFileVersion("16.3.0.0")] [assembly: AssemblyInformationalVersion("16.3.0")] [assembly: AssemblyTitle("YamlDotNet")] [assembly: AssemblyDescription("The YamlDotNet library.")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("YamlDotNet")] [assembly: AssemblyCopyright("Copyright (c) Antoine Aubry and contributors 2008 - 2019")] [assembly: AssemblyTrademark("")] [assembly: CLSCompliant(true)] [assembly: InternalsVisibleTo("YamlDotNet.Test, PublicKey=002400000480000094000000060200000024000052534131000400000100010065e52a453dde5c5b4be5bbe2205755727fce80244b79b894faf8793d80f7db9a96d360b51c220782db32aacee4cb5b8a91bee33aeec700e1f21895c4baadef501eeeac609220d1651603b378173811ee5bb6a002df973d38821bd2fef820c00c174a69faec326a1983b570f07ec66147026b9c8753465de3a8d0c44b613b02af")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyVersion("16.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace YamlDotNet { internal sealed class CultureInfoAdapter : CultureInfo { private readonly IFormatProvider provider; public CultureInfoAdapter(CultureInfo baseCulture, IFormatProvider provider) : base(baseCulture.Name) { this.provider = provider; } public override object GetFormat(Type? formatType) { return provider.GetFormat(formatType); } } internal static class Polyfills { } internal static class PropertyInfoExtensions { public static object? ReadValue(this PropertyInfo property, object target) { return property.GetValue(target, null); } } internal static class ReflectionExtensions { private static readonly Func<PropertyInfo, bool> IsInstance = (PropertyInfo property) => !(property.GetMethod ?? property.SetMethod).IsStatic; private static readonly Func<PropertyInfo, bool> IsInstancePublic = (PropertyInfo property) => IsInstance(property) && (property.GetMethod ?? property.SetMethod).IsPublic; public static Type? BaseType(this Type type) { return type.GetTypeInfo().BaseType; } public static bool IsValueType(this Type type) { return type.GetTypeInfo().IsValueType; } public static bool IsGenericType(this Type type) { return type.GetTypeInfo().IsGenericType; } public static bool IsGenericTypeDefinition(this Type type) { return type.GetTypeInfo().IsGenericTypeDefinition; } public static Type? GetImplementationOfOpenGenericInterface(this Type type, Type openGenericType) { if (!openGenericType.IsGenericType || !openGenericType.IsInterface) { throw new ArgumentException("The type must be a generic type definition and an interface", "openGenericType"); } if (IsGenericDefinitionOfType(type, openGenericType)) { return type; } return type.FindInterfaces((Type t, object? context) => IsGenericDefinitionOfType(t, context), openGenericType).FirstOrDefault(); static bool IsGenericDefinitionOfType(Type t, object? context) { if (t.IsGenericType) { return t.GetGenericTypeDefinition() == (Type)context; } return false; } } public static bool IsInterface(this Type type) { return type.GetTypeInfo().IsInterface; } public static bool IsEnum(this Type type) { return type.GetTypeInfo().IsEnum; } public static bool IsRequired(this MemberInfo member) { return member.GetCustomAttributes(inherit: true).Any((object x) => x.GetType().FullName == "System.Runtime.CompilerServices.RequiredMemberAttribute"); } public static bool HasDefaultConstructor(this Type type, bool allowPrivateConstructors) { BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public; if (allowPrivateConstructors) { bindingFlags |= BindingFlags.NonPublic; } if (!type.IsValueType) { return type.GetConstructor(bindingFlags, null, Type.EmptyTypes, null) != null; } return true; } public static bool IsAssignableFrom(this Type type, Type source) { return type.IsAssignableFrom(source.GetTypeInfo()); } public static bool IsAssignableFrom(this Type type, TypeInfo source) { return type.GetTypeInfo().IsAssignableFrom(source); } public static TypeCode GetTypeCode(this Type type) { if (type.IsEnum()) { type = Enum.GetUnderlyingType(type); } if (type == typeof(bool)) { return TypeCode.Boolean; } if (type == typeof(char)) { return TypeCode.Char; } if (type == typeof(sbyte)) { return TypeCode.SByte; } if (type == typeof(byte)) { return TypeCode.Byte; } if (type == typeof(short)) { return TypeCode.Int16; } if (type == typeof(ushort)) { return TypeCode.UInt16; } if (type == typeof(int)) { return TypeCode.Int32; } if (type == typeof(uint)) { return TypeCode.UInt32; } if (type == typeof(long)) { return TypeCode.Int64; } if (type == typeof(ulong)) { return TypeCode.UInt64; } if (type == typeof(float)) { return TypeCode.Single; } if (type == typeof(double)) { return TypeCode.Double; } if (type == typeof(decimal)) { return TypeCode.Decimal; } if (type == typeof(DateTime)) { return TypeCode.DateTime; } if (type == typeof(string)) { return TypeCode.String; } return TypeCode.Object; } public static bool IsDbNull(this object value) { return value?.GetType()?.FullName == "System.DBNull"; } public static Type[] GetGenericArguments(this Type type) { return type.GetTypeInfo().GenericTypeArguments; } public static PropertyInfo? GetPublicProperty(this Type type, string name) { string name2 = name; return type.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public).FirstOrDefault((PropertyInfo p) => p.Name == name2); } public static FieldInfo? GetPublicStaticField(this Type type, string name) { return type.GetRuntimeField(name); } public static IEnumerable<PropertyInfo> GetProperties(this Type type, bool includeNonPublic) { Func<PropertyInfo, bool> predicate = (includeNonPublic ? IsInstance : IsInstancePublic); if (!type.IsInterface()) { return type.GetRuntimeProperties().Where(predicate); } return new Type[1] { type }.Concat(type.GetInterfaces()).SelectMany((Type i) => i.GetRuntimeProperties().Where(predicate)); } public static IEnumerable<PropertyInfo> GetPublicProperties(this Type type) { return type.GetProperties(includeNonPublic: false); } public static IEnumerable<FieldInfo> GetPublicFields(this Type type) { return from f in type.GetRuntimeFields() where !f.IsStatic && f.IsPublic select f; } public static IEnumerable<MethodInfo> GetPublicStaticMethods(this Type type) { return from m in type.GetRuntimeMethods() where m.IsPublic && m.IsStatic select m; } public static MethodInfo GetPrivateStaticMethod(this Type type, string name) { string name2 = name; return type.GetRuntimeMethods().FirstOrDefault((MethodInfo m) => !m.IsPublic && m.IsStatic && m.Name.Equals(name2)) ?? throw new MissingMethodException($"Expected to find a method named '{name2}' in '{type.FullName}'."); } public static MethodInfo? GetPublicStaticMethod(this Type type, string name, params Type[] parameterTypes) { string name2 = name; Type[] parameterTypes2 = parameterTypes; return type.GetRuntimeMethods().FirstOrDefault(delegate(MethodInfo m) { if (m.IsPublic && m.IsStatic && m.Name.Equals(name2)) { ParameterInfo[] parameters = m.GetParameters(); if (parameters.Length == parameterTypes2.Length) { return parameters.Zip(parameterTypes2, (ParameterInfo pi, Type pt) => pi.ParameterType == pt).All((bool r) => r); } return false; } return false; }); } public static MethodInfo? GetPublicInstanceMethod(this Type type, string name) { string name2 = name; return type.GetRuntimeMethods().FirstOrDefault((MethodInfo m) => m.IsPublic && !m.IsStatic && m.Name.Equals(name2)); } public static MethodInfo? GetGetMethod(this PropertyInfo property, bool nonPublic) { MethodInfo methodInfo = property.GetMethod; if (!nonPublic && !methodInfo.IsPublic) { methodInfo = null; } return methodInfo; } public static MethodInfo? GetSetMethod(this PropertyInfo property) { return property.SetMethod; } public static IEnumerable<Type> GetInterfaces(this Type type) { return type.GetTypeInfo().ImplementedInterfaces; } public static bool IsInstanceOf(this Type type, object o) { if (!(o.GetType() == type)) { return o.GetType().GetTypeInfo().IsSubclassOf(type); } return true; } public static Attribute[] GetAllCustomAttributes<TAttribute>(this PropertyInfo member) { return Attribute.GetCustomAttributes(member, typeof(TAttribute), inherit: true); } public static bool AcceptsNull(this MemberInfo member) { object[] customAttributes = member.DeclaringType.GetCustomAttributes(inherit: true); object obj = customAttributes.FirstOrDefault((object x) => x.GetType().FullName == "System.Runtime.CompilerServices.NullableContextAttribute"); int num = 0; if (obj != null) { Type type = obj.GetType(); PropertyInfo property = type.GetProperty("Flag"); num = (byte)property.GetValue(obj); } object[] customAttributes2 = member.GetCustomAttributes(inherit: true); object obj2 = customAttributes2.FirstOrDefault((object x) => x.GetType().FullName == "System.Runtime.CompilerServices.NullableAttribute"); PropertyInfo propertyInfo = (obj2?.GetType())?.GetProperty("NullableFlags"); byte[] source = (byte[])propertyInfo.GetValue(obj2); return source.Any((byte x) => x == 2) || num == 2; } } internal static class StandardRegexOptions { public const RegexOptions Compiled = RegexOptions.Compiled; } } namespace YamlDotNet.Serialization { public abstract class BuilderSkeleton<TBuilder> where TBuilder : BuilderSkeleton<TBuilder> { internal INamingConvention namingConvention = NullNamingConvention.Instance; internal INamingConvention enumNamingConvention = NullNamingConvention.Instance; internal ITypeResolver typeResolver; internal readonly YamlAttributeOverrides overrides; internal readonly LazyComponentRegistrationList<Nothing, IYamlTypeConverter> typeConverterFactories; internal readonly LazyComponentRegistrationList<ITypeInspector, ITypeInspector> typeInspectorFactories; internal bool ignoreFields; internal bool includeNonPublicProperties; internal Settings settings; internal YamlFormatter yamlFormatter = YamlFormatter.Default; protected abstract TBuilder Self { get; } internal BuilderSkeleton(ITypeResolver typeResolver) { overrides = new YamlAttributeOverrides(); typeConverterFactories = new LazyComponentRegistrationList<Nothing, IYamlTypeConverter> { { typeof(YamlDotNet.Serialization.Converters.GuidConverter), (Nothing _) => new YamlDotNet.Serialization.Converters.GuidConverter(jsonCompatible: false) }, { typeof(SystemTypeConverter), (Nothing _) => new SystemTypeConverter() } }; typeInspectorFactories = new LazyComponentRegistrationList<ITypeInspector, ITypeInspector>(); this.typeResolver = typeResolver ?? throw new ArgumentNullException("typeResolver"); settings = new Settings(); } public TBuilder IgnoreFields() { ignoreFields = true; return Self; } public TBuilder IncludeNonPublicProperties() { includeNonPublicProperties = true; return Self; } public TBuilder EnablePrivateConstructors() { settings.AllowPrivateConstructors = true; return Self; } public TBuilder WithNamingConvention(INamingConvention namingConvention) { this.namingConvention = namingConvention ?? throw new ArgumentNullException("namingConvention"); return Self; } public TBuilder WithEnumNamingConvention(INamingConvention enumNamingConvention) { this.enumNamingConvention = enumNamingConvention; return Self; } public TBuilder WithTypeResolver(ITypeResolver typeResolver) { this.typeResolver = typeResolver ?? throw new ArgumentNullException("typeResolver"); return Self; } public abstract TBuilder WithTagMapping(TagName tag, Type type); public TBuilder WithAttributeOverride<TClass>(Expression<Func<TClass, object>> propertyAccessor, Attribute attribute) { overrides.Add(propertyAccessor, attribute); return Self; } public TBuilder WithAttributeOverride(Type type, string member, Attribute attribute) { overrides.Add(type, member, attribute); return Self; } public TBuilder WithTypeConverter(IYamlTypeConverter typeConverter) { return WithTypeConverter(typeConverter, delegate(IRegistrationLocationSelectionSyntax<IYamlTypeConverter> w) { w.OnTop(); }); } public TBuilder WithTypeConverter(IYamlTypeConverter typeConverter, Action<IRegistrationLocationSelectionSyntax<IYamlTypeConverter>> where) { IYamlTypeConverter typeConverter2 = typeConverter; if (typeConverter2 == null) { throw new ArgumentNullException("typeConverter"); } if (where == null) { throw new ArgumentNullException("where"); } where(typeConverterFactories.CreateRegistrationLocationSelector(typeConverter2.GetType(), (Nothing _) => typeConverter2)); return Self; } public TBuilder WithTypeConverter<TYamlTypeConverter>(WrapperFactory<IYamlTypeConverter, IYamlTypeConverter> typeConverterFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IYamlTypeConverter>> where) where TYamlTypeConverter : IYamlTypeConverter { WrapperFactory<IYamlTypeConverter, IYamlTypeConverter> typeConverterFactory2 = typeConverterFactory; if (typeConverterFactory2 == null) { throw new ArgumentNullException("typeConverterFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(typeConverterFactories.CreateTrackingRegistrationLocationSelector(typeof(TYamlTypeConverter), (IYamlTypeConverter wrapped, Nothing _) => typeConverterFactory2(wrapped))); return Self; } public TBuilder WithoutTypeConverter<TYamlTypeConverter>() where TYamlTypeConverter : IYamlTypeConverter { return WithoutTypeConverter(typeof(TYamlTypeConverter)); } public TBuilder WithoutTypeConverter(Type converterType) { if (converterType == null) { throw new ArgumentNullException("converterType"); } typeConverterFactories.Remove(converterType); return Self; } public TBuilder WithTypeInspector<TTypeInspector>(Func<ITypeInspector, TTypeInspector> typeInspectorFactory) where TTypeInspector : ITypeInspector { return WithTypeInspector(typeInspectorFactory, delegate(IRegistrationLocationSelectionSyntax<ITypeInspector> w) { w.OnTop(); }); } public TBuilder WithTypeInspector<TTypeInspector>(Func<ITypeInspector, TTypeInspector> typeInspectorFactory, Action<IRegistrationLocationSelectionSyntax<ITypeInspector>> where) where TTypeInspector : ITypeInspector { Func<ITypeInspector, TTypeInspector> typeInspectorFactory2 = typeInspectorFactory; if (typeInspectorFactory2 == null) { throw new ArgumentNullException("typeInspectorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(typeInspectorFactories.CreateRegistrationLocationSelector(typeof(TTypeInspector), (ITypeInspector inner) => typeInspectorFactory2(inner))); return Self; } public TBuilder WithTypeInspector<TTypeInspector>(WrapperFactory<ITypeInspector, ITypeInspector, TTypeInspector> typeInspectorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<ITypeInspector>> where) where TTypeInspector : ITypeInspector { WrapperFactory<ITypeInspector, ITypeInspector, TTypeInspector> typeInspectorFactory2 = typeInspectorFactory; if (typeInspectorFactory2 == null) { throw new ArgumentNullException("typeInspectorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(typeInspectorFactories.CreateTrackingRegistrationLocationSelector(typeof(TTypeInspector), (ITypeInspector wrapped, ITypeInspector inner) => typeInspectorFactory2(wrapped, inner))); return Self; } public TBuilder WithoutTypeInspector<TTypeInspector>() where TTypeInspector : ITypeInspector { return WithoutTypeInspector(typeof(TTypeInspector)); } public TBuilder WithoutTypeInspector(Type inspectorType) { if (inspectorType == null) { throw new ArgumentNullException("inspectorType"); } typeInspectorFactories.Remove(inspectorType); return Self; } public TBuilder WithYamlFormatter(YamlFormatter formatter) { yamlFormatter = formatter ?? throw new ArgumentNullException("formatter"); return Self; } protected IEnumerable<IYamlTypeConverter> BuildTypeConverters() { return typeConverterFactories.BuildComponentList(); } } public delegate TComponent WrapperFactory<TComponentBase, TComponent>(TComponentBase wrapped) where TComponent : TComponentBase; public delegate TComponent WrapperFactory<TArgument, TComponentBase, TComponent>(TComponentBase wrapped, TArgument argument) where TComponent : TComponentBase; [Flags] public enum DefaultValuesHandling { Preserve = 0, OmitNull = 1, OmitDefaults = 2, OmitEmptyCollections = 4 } public sealed class Deserializer : IDeserializer { private readonly IValueDeserializer valueDeserializer; public Deserializer() : this(new DeserializerBuilder().BuildValueDeserializer()) { } private Deserializer(IValueDeserializer valueDeserializer) { this.valueDeserializer = valueDeserializer ?? throw new ArgumentNullException("valueDeserializer"); } public static Deserializer FromValueDeserializer(IValueDeserializer valueDeserializer) { return new Deserializer(valueDeserializer); } public T Deserialize<T>(string input) { using StringReader input2 = new StringReader(input); return Deserialize<T>(input2); } public T Deserialize<T>(TextReader input) { return Deserialize<T>(new Parser(input)); } public T Deserialize<T>(IParser parser) { return (T)Deserialize(parser, typeof(T)); } public object? Deserialize(string input) { return Deserialize<object>(input); } public object? Deserialize(TextReader input) { return Deserialize<object>(input); } public object? Deserialize(IParser parser) { return Deserialize<object>(parser); } public object? Deserialize(string input, Type type) { using StringReader input2 = new StringReader(input); return Deserialize(input2, type); } public object? Deserialize(TextReader input, Type type) { return Deserialize(new Parser(input), type); } public object? Deserialize(IParser parser, Type type) { if (parser == null) { throw new ArgumentNullException("parser"); } if (type == null) { throw new ArgumentNullException("type"); } YamlDotNet.Core.Events.StreamStart @event; bool flag = parser.TryConsume<YamlDotNet.Core.Events.StreamStart>(out @event); YamlDotNet.Core.Events.DocumentStart event2; bool flag2 = parser.TryConsume<YamlDotNet.Core.Events.DocumentStart>(out event2); object result = null; if (!parser.Accept<YamlDotNet.Core.Events.DocumentEnd>(out var _) && !parser.Accept<YamlDotNet.Core.Events.StreamEnd>(out var _)) { using SerializerState serializerState = new SerializerState(); result = valueDeserializer.DeserializeValue(parser, type, serializerState, valueDeserializer); serializerState.OnDeserialization(); } if (flag2) { parser.Consume<YamlDotNet.Core.Events.DocumentEnd>(); } if (flag) { parser.Consume<YamlDotNet.Core.Events.StreamEnd>(); } return result; } } public sealed class DeserializerBuilder : BuilderSkeleton<DeserializerBuilder> { private Lazy<IObjectFactory> objectFactory; private readonly LazyComponentRegistrationList<Nothing, INodeDeserializer> nodeDeserializerFactories; private readonly LazyComponentRegistrationList<Nothing, INodeTypeResolver> nodeTypeResolverFactories; private readonly Dictionary<TagName, Type> tagMappings; private readonly Dictionary<Type, Type> typeMappings; private readonly ITypeConverter typeConverter; private bool ignoreUnmatched; private bool duplicateKeyChecking; private bool attemptUnknownTypeDeserialization; private bool enforceNullability; private bool caseInsensitivePropertyMatching; private bool enforceRequiredProperties; protected override DeserializerBuilder Self => this; public DeserializerBuilder() : base((ITypeResolver)new StaticTypeResolver()) { typeMappings = new Dictionary<Type, Type>(); objectFactory = new Lazy<IObjectFactory>(() => new DefaultObjectFactory(typeMappings, settings), isThreadSafe: true); tagMappings = new Dictionary<TagName, Type> { { FailsafeSchema.Tags.Map, typeof(Dictionary<object, object>) }, { FailsafeSchema.Tags.Str, typeof(string) }, { JsonSchema.Tags.Bool, typeof(bool) }, { JsonSchema.Tags.Float, typeof(double) }, { JsonSchema.Tags.Int, typeof(int) }, { DefaultSchema.Tags.Timestamp, typeof(DateTime) } }; typeInspectorFactories.Add(typeof(CachedTypeInspector), (ITypeInspector inner) => new CachedTypeInspector(inner)); typeInspectorFactories.Add(typeof(NamingConventionTypeInspector), (ITypeInspector inner) => (!(namingConvention is NullNamingConvention)) ? new NamingConventionTypeInspector(inner, namingConvention) : inner); typeInspectorFactories.Add(typeof(YamlAttributesTypeInspector), (ITypeInspector inner) => new YamlAttributesTypeInspector(inner)); typeInspectorFactories.Add(typeof(YamlAttributeOverridesInspector), (ITypeInspector inner) => (overrides == null) ? inner : new YamlAttributeOverridesInspector(inner, overrides.Clone())); typeInspectorFactories.Add(typeof(ReadableAndWritablePropertiesTypeInspector), (ITypeInspector inner) => new ReadableAndWritablePropertiesTypeInspector(inner)); nodeDeserializerFactories = new LazyComponentRegistrationList<Nothing, INodeDeserializer> { { typeof(YamlConvertibleNodeDeserializer), (Nothing _) => new YamlConvertibleNodeDeserializer(objectFactory.Value) }, { typeof(YamlSerializableNodeDeserializer), (Nothing _) => new YamlSerializableNodeDeserializer(objectFactory.Value) }, { typeof(TypeConverterNodeDeserializer), (Nothing _) => new TypeConverterNodeDeserializer(BuildTypeConverters()) }, { typeof(NullNodeDeserializer), (Nothing _) => new NullNodeDeserializer() }, { typeof(ScalarNodeDeserializer), (Nothing _) => new ScalarNodeDeserializer(attemptUnknownTypeDeserialization, typeConverter, BuildTypeInspector(), yamlFormatter, enumNamingConvention) }, { typeof(ArrayNodeDeserializer), (Nothing _) => new ArrayNodeDeserializer(enumNamingConvention, BuildTypeInspector()) }, { typeof(DictionaryNodeDeserializer), (Nothing _) => new DictionaryNodeDeserializer(objectFactory.Value, duplicateKeyChecking) }, { typeof(CollectionNodeDeserializer), (Nothing _) => new CollectionNodeDeserializer(objectFactory.Value, enumNamingConvention, BuildTypeInspector()) }, { typeof(EnumerableNodeDeserializer), (Nothing _) => new EnumerableNodeDeserializer() }, { typeof(ObjectNodeDeserializer), (Nothing _) => new ObjectNodeDeserializer(objectFactory.Value, BuildTypeInspector(), ignoreUnmatched, duplicateKeyChecking, typeConverter, enumNamingConvention, enforceNullability, caseInsensitivePropertyMatching, enforceRequiredProperties, BuildTypeConverters()) }, { typeof(FsharpListNodeDeserializer), (Nothing _) => new FsharpListNodeDeserializer(BuildTypeInspector(), enumNamingConvention) } }; nodeTypeResolverFactories = new LazyComponentRegistrationList<Nothing, INodeTypeResolver> { { typeof(MappingNodeTypeResolver), (Nothing _) => new MappingNodeTypeResolver(typeMappings) }, { typeof(YamlConvertibleTypeResolver), (Nothing _) => new YamlConvertibleTypeResolver() }, { typeof(YamlSerializableTypeResolver), (Nothing _) => new YamlSerializableTypeResolver() }, { typeof(TagNodeTypeResolver), (Nothing _) => new TagNodeTypeResolver(tagMappings) }, { typeof(PreventUnknownTagsNodeTypeResolver), (Nothing _) => new PreventUnknownTagsNodeTypeResolver() }, { typeof(DefaultContainersNodeTypeResolver), (Nothing _) => new DefaultContainersNodeTypeResolver() } }; typeConverter = new ReflectionTypeConverter(); } public ITypeInspector BuildTypeInspector() { ITypeInspector typeInspector = new WritablePropertiesTypeInspector(typeResolver, includeNonPublicProperties); if (!ignoreFields) { typeInspector = new CompositeTypeInspector(new ReadableFieldsTypeInspector(typeResolver), typeInspector); } return typeInspectorFactories.BuildComponentChain(typeInspector); } public DeserializerBuilder WithAttemptingUnquotedStringTypeDeserialization() { attemptUnknownTypeDeserialization = true; return this; } public DeserializerBuilder WithObjectFactory(IObjectFactory objectFactory) { IObjectFactory objectFactory2 = objectFactory; if (objectFactory2 == null) { throw new ArgumentNullException("objectFactory"); } this.objectFactory = new Lazy<IObjectFactory>(() => objectFactory2, isThreadSafe: true); return this; } public DeserializerBuilder WithObjectFactory(Func<Type, object> objectFactory) { if (objectFactory == null) { throw new ArgumentNullException("objectFactory"); } return WithObjectFactory(new LambdaObjectFactory(objectFactory)); } public DeserializerBuilder WithNodeDeserializer(INodeDeserializer nodeDeserializer) { return WithNodeDeserializer(nodeDeserializer, delegate(IRegistrationLocationSelectionSyntax<INodeDeserializer> w) { w.OnTop(); }); } public DeserializerBuilder WithNodeDeserializer(INodeDeserializer nodeDeserializer, Action<IRegistrationLocationSelectionSyntax<INodeDeserializer>> where) { INodeDeserializer nodeDeserializer2 = nodeDeserializer; if (nodeDeserializer2 == null) { throw new ArgumentNullException("nodeDeserializer"); } if (where == null) { throw new ArgumentNullException("where"); } where(nodeDeserializerFactories.CreateRegistrationLocationSelector(nodeDeserializer2.GetType(), (Nothing _) => nodeDeserializer2)); return this; } public DeserializerBuilder WithNodeDeserializer<TNodeDeserializer>(WrapperFactory<INodeDeserializer, TNodeDeserializer> nodeDeserializerFactory, Action<ITrackingRegistrationLocationSelectionSyntax<INodeDeserializer>> where) where TNodeDeserializer : INodeDeserializer { WrapperFactory<INodeDeserializer, TNodeDeserializer> nodeDeserializerFactory2 = nodeDeserializerFactory; if (nodeDeserializerFactory2 == null) { throw new ArgumentNullException("nodeDeserializerFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(nodeDeserializerFactories.CreateTrackingRegistrationLocationSelector(typeof(TNodeDeserializer), (INodeDeserializer wrapped, Nothing _) => nodeDeserializerFactory2(wrapped))); return this; } public DeserializerBuilder WithoutNodeDeserializer<TNodeDeserializer>() where TNodeDeserializer : INodeDeserializer { return WithoutNodeDeserializer(typeof(TNodeDeserializer)); } public DeserializerBuilder WithoutNodeDeserializer(Type nodeDeserializerType) { if (nodeDeserializerType == null) { throw new ArgumentNullException("nodeDeserializerType"); } nodeDeserializerFactories.Remove(nodeDeserializerType); return this; } public DeserializerBuilder WithTypeDiscriminatingNodeDeserializer(Action<ITypeDiscriminatingNodeDeserializerOptions> configureTypeDiscriminatingNodeDeserializerOptions, int maxDepth = -1, int maxLength = -1) { TypeDiscriminatingNodeDeserializerOptions typeDiscriminatingNodeDeserializerOptions = new TypeDiscriminatingNodeDeserializerOptions(); configureTypeDiscriminatingNodeDeserializerOptions(typeDiscriminatingNodeDeserializerOptions); TypeDiscriminatingNodeDeserializer nodeDeserializer = new TypeDiscriminatingNodeDeserializer(nodeDeserializerFactories.BuildComponentList(), typeDiscriminatingNodeDeserializerOptions.discriminators, maxDepth, maxLength); return WithNodeDeserializer(nodeDeserializer, delegate(IRegistrationLocationSelectionSyntax<INodeDeserializer> s) { s.Before<DictionaryNodeDeserializer>(); }); } public DeserializerBuilder WithNodeTypeResolver(INodeTypeResolver nodeTypeResolver) { return WithNodeTypeResolver(nodeTypeResolver, delegate(IRegistrationLocationSelectionSyntax<INodeTypeResolver> w) { w.OnTop(); }); } public DeserializerBuilder WithNodeTypeResolver(INodeTypeResolver nodeTypeResolver, Action<IRegistrationLocationSelectionSyntax<INodeTypeResolver>> where) { INodeTypeResolver nodeTypeResolver2 = nodeTypeResolver; if (nodeTypeResolver2 == null) { throw new ArgumentNullException("nodeTypeResolver"); } if (where == null) { throw new ArgumentNullException("where"); } where(nodeTypeResolverFactories.CreateRegistrationLocationSelector(nodeTypeResolver2.GetType(), (Nothing _) => nodeTypeResolver2)); return this; } public DeserializerBuilder WithNodeTypeResolver<TNodeTypeResolver>(WrapperFactory<INodeTypeResolver, TNodeTypeResolver> nodeTypeResolverFactory, Action<ITrackingRegistrationLocationSelectionSyntax<INodeTypeResolver>> where) where TNodeTypeResolver : INodeTypeResolver { WrapperFactory<INodeTypeResolver, TNodeTypeResolver> nodeTypeResolverFactory2 = nodeTypeResolverFactory; if (nodeTypeResolverFactory2 == null) { throw new ArgumentNullException("nodeTypeResolverFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(nodeTypeResolverFactories.CreateTrackingRegistrationLocationSelector(typeof(TNodeTypeResolver), (INodeTypeResolver wrapped, Nothing _) => nodeTypeResolverFactory2(wrapped))); return this; } public DeserializerBuilder WithCaseInsensitivePropertyMatching() { caseInsensitivePropertyMatching = true; return this; } public DeserializerBuilder WithEnforceNullability() { enforceNullability = true; return this; } public DeserializerBuilder WithEnforceRequiredMembers() { enforceRequiredProperties = true; return this; } public DeserializerBuilder WithoutNodeTypeResolver<TNodeTypeResolver>() where TNodeTypeResolver : INodeTypeResolver { return WithoutNodeTypeResolver(typeof(TNodeTypeResolver)); } public DeserializerBuilder WithoutNodeTypeResolver(Type nodeTypeResolverType) { if (nodeTypeResolverType == null) { throw new ArgumentNullException("nodeTypeResolverType"); } nodeTypeResolverFactories.Remove(nodeTypeResolverType); return this; } public override DeserializerBuilder WithTagMapping(TagName tag, Type type) { if (tag.IsEmpty) { throw new ArgumentException("Non-specific tags cannot be maped"); } if (type == null) { throw new ArgumentNullException("type"); } if (tagMappings.TryGetValue(tag, out Type value)) { throw new ArgumentException($"Type already has a registered type '{value.FullName}' for tag '{tag}'", "tag"); } tagMappings.Add(tag, type); return this; } public DeserializerBuilder WithTypeMapping<TInterface, TConcrete>() where TConcrete : TInterface { Type typeFromHandle = typeof(TInterface); Type typeFromHandle2 = typeof(TConcrete); if (!typeFromHandle.IsAssignableFrom(typeFromHandle2)) { throw new InvalidOperationException($"The type '{typeFromHandle2.Name}' does not implement interface '{typeFromHandle.Name}'."); } if (!typeMappings.TryAdd(typeFromHandle, typeFromHandle2)) { typeMappings[typeFromHandle] = typeFromHandle2; } return this; } public DeserializerBuilder WithoutTagMapping(TagName tag) { if (tag.IsEmpty) { throw new ArgumentException("Non-specific tags cannot be maped"); } if (!tagMappings.Remove(tag)) { throw new KeyNotFoundException($"Tag '{tag}' is not registered"); } return this; } public DeserializerBuilder IgnoreUnmatchedProperties() { ignoreUnmatched = true; return this; } public DeserializerBuilder WithDuplicateKeyChecking() { duplicateKeyChecking = true; return this; } public IDeserializer Build() { if (FsharpHelper.Instance == null) { FsharpHelper.Instance = new DefaultFsharpHelper(); } return Deserializer.FromValueDeserializer(BuildValueDeserializer()); } public IValueDeserializer BuildValueDeserializer() { return new AliasValueDeserializer(new NodeValueDeserializer(nodeDeserializerFactories.BuildComponentList(), nodeTypeResolverFactories.BuildComponentList(), typeConverter, enumNamingConvention, BuildTypeInspector())); } } public sealed class EmissionPhaseObjectGraphVisitorArgs { private readonly IEnumerable<IObjectGraphVisitor<Nothing>> preProcessingPhaseVisitors; public IObjectGraphVisitor<IEmitter> InnerVisitor { get; private set; } public IEventEmitter EventEmitter { get; private set; } public ObjectSerializer NestedObjectSerializer { get; private set; } public IEnumerable<IYamlTypeConverter> TypeConverters { get; private set; } public EmissionPhaseObjectGraphVisitorArgs(IObjectGraphVisitor<IEmitter> innerVisitor, IEventEmitter eventEmitter, IEnumerable<IObjectGraphVisitor<Nothing>> preProcessingPhaseVisitors, IEnumerable<IYamlTypeConverter> typeConverters, ObjectSerializer nestedObjectSerializer) { InnerVisitor = innerVisitor ?? throw new ArgumentNullException("innerVisitor"); EventEmitter = eventEmitter ?? throw new ArgumentNullException("eventEmitter"); this.preProcessingPhaseVisitors = preProcessingPhaseVisitors ?? throw new ArgumentNullException("preProcessingPhaseVisitors"); TypeConverters = typeConverters ?? throw new ArgumentNullException("typeConverters"); NestedObjectSerializer = nestedObjectSerializer ?? throw new ArgumentNullException("nestedObjectSerializer"); } public T GetPreProcessingPhaseObjectGraphVisitor<T>() where T : IObjectGraphVisitor<Nothing> { return preProcessingPhaseVisitors.OfType<T>().Single(); } } public abstract class EventInfo { public IObjectDescriptor Source { get; } protected EventInfo(IObjectDescriptor source) { Source = source ?? throw new ArgumentNullException("source"); } } public class AliasEventInfo : EventInfo { public AnchorName Alias { get; } public bool NeedsExpansion { get; set; } public AliasEventInfo(IObjectDescriptor source, AnchorName alias) : base(source) { if (alias.IsEmpty) { throw new ArgumentNullException("alias"); } Alias = alias; } } public class ObjectEventInfo : EventInfo { public AnchorName Anchor { get; set; } public TagName Tag { get; set; } protected ObjectEventInfo(IObjectDescriptor source) : base(source) { } } public sealed class ScalarEventInfo : ObjectEventInfo { public string RenderedValue { get; set; } public ScalarStyle Style { get; set; } public bool IsPlainImplicit { get; set; } public bool IsQuotedImplicit { get; set; } public ScalarEventInfo(IObjectDescriptor source) : base(source) { Style = source.ScalarStyle; RenderedValue = string.Empty; } } public sealed class MappingStartEventInfo : ObjectEventInfo { public bool IsImplicit { get; set; } public MappingStyle Style { get; set; } public MappingStartEventInfo(IObjectDescriptor source) : base(source) { } } public sealed class MappingEndEventInfo : EventInfo { public MappingEndEventInfo(IObjectDescriptor source) : base(source) { } } public sealed class SequenceStartEventInfo : ObjectEventInfo { public bool IsImplicit { get; set; } public SequenceStyle Style { get; set; } public SequenceStartEventInfo(IObjectDescriptor source) : base(source) { } } public sealed class SequenceEndEventInfo : EventInfo { public SequenceEndEventInfo(IObjectDescriptor source) : base(source) { } } public interface IAliasProvider { AnchorName GetAlias(object target); } public interface IDeserializer { T Deserialize<T>(string input); T Deserialize<T>(TextReader input); T Deserialize<T>(IParser parser); object? Deserialize(string input); object? Deserialize(TextReader input); object? Deserialize(IParser parser); object? Deserialize(string input, Type type); object? Deserialize(TextReader input, Type type); object? Deserialize(IParser parser, Type type); } public interface IEventEmitter { void Emit(AliasEventInfo eventInfo, IEmitter emitter); void Emit(ScalarEventInfo eventInfo, IEmitter emitter); void Emit(MappingStartEventInfo eventInfo, IEmitter emitter); void Emit(MappingEndEventInfo eventInfo, IEmitter emitter); void Emit(SequenceStartEventInfo eventInfo, IEmitter emitter); void Emit(SequenceEndEventInfo eventInfo, IEmitter emitter); } public interface INamingConvention { string Apply(string value); string Reverse(string value); } public interface INodeDeserializer { bool Deserialize(IParser reader, Type expectedType, Func<IParser, Type, object?> nestedObjectDeserializer, out object? value, ObjectDeserializer rootDeserializer); } public interface INodeTypeResolver { bool Resolve(NodeEvent? nodeEvent, ref Type currentType); } public interface IObjectAccessor { void Set(string name, object target, object value); object? Read(string name, object target); } public interface IObjectDescriptor { object? Value { get; } Type Type { get; } Type StaticType { get; } ScalarStyle ScalarStyle { get; } } public static class ObjectDescriptorExtensions { public static object NonNullValue(this IObjectDescriptor objectDescriptor) { return objectDescriptor.Value ?? throw new InvalidOperationException("Attempted to use a IObjectDescriptor of type '" + objectDescriptor.Type.FullName + "' whose Value is null at a point whete it is invalid to do so. This may indicate a bug in YamlDotNet."); } } public interface IObjectFactory { object Create(Type type); object? CreatePrimitive(Type type); bool GetDictionary(IObjectDescriptor descriptor, out IDictionary? dictionary, out Type[]? genericArguments); Type GetValueType(Type type); void ExecuteOnDeserializing(object value); void ExecuteOnDeserialized(object value); void ExecuteOnSerializing(object value); void ExecuteOnSerialized(object value); } public interface IObjectGraphTraversalStrategy { void Traverse<TContext>(IObjectDescriptor graph, IObjectGraphVisitor<TContext> visitor, TContext context, ObjectSerializer serializer); } public interface IObjectGraphVisitor<TContext> { bool Enter(IPropertyDescriptor? propertyDescriptor, IObjectDescriptor value, TContext context, ObjectSerializer serializer); bool EnterMapping(IObjectDescriptor key, IObjectDescriptor value, TContext context, ObjectSerializer serializer); bool EnterMapping(IPropertyDescriptor key, IObjectDescriptor value, TContext context, ObjectSerializer serializer); void VisitScalar(IObjectDescriptor scalar, TContext context, ObjectSerializer serializer); void VisitMappingStart(IObjectDescriptor mapping, Type keyType, Type valueType, TContext context, ObjectSerializer serializer); void VisitMappingEnd(IObjectDescriptor mapping, TContext context, ObjectSerializer serializer); void VisitSequenceStart(IObjectDescriptor sequence, Type elementType, TContext context, ObjectSerializer serializer); void VisitSequenceEnd(IObjectDescriptor sequence, TContext context, ObjectSerializer serializer); } public interface IPropertyDescriptor { string Name { get; } bool AllowNulls { get; } bool CanWrite { get; } Type Type { get; } Type? TypeOverride { get; set; } int Order { get; set; } ScalarStyle ScalarStyle { get; set; } bool Required { get; } Type? ConverterType { get; } T? GetCustomAttribute<T>() where T : Attribute; IObjectDescriptor Read(object target); void Write(object target, object? value); } public interface IRegistrationLocationSelectionSyntax<TBaseRegistrationType> { void InsteadOf<TRegistrationType>() where TRegistrationType : TBaseRegistrationType; void Before<TRegistrationType>() where TRegistrationType : TBaseRegistrationType; void After<TRegistrationType>() where TRegistrationType : TBaseRegistrationType; void OnTop(); void OnBottom(); } public interface ITrackingRegistrationLocationSelectionSyntax<TBaseRegistrationType> { void InsteadOf<TRegistrationType>() where TRegistrationType : TBaseRegistrationType; } public interface ISerializer { string Serialize(object? graph); string Serialize(object? graph, Type type); void Serialize(TextWriter writer, object? graph); void Serialize(TextWriter writer, object? graph, Type type); void Serialize(IEmitter emitter, object? graph); void Serialize(IEmitter emitter, object? graph, Type type); } public interface ITypeInspector { IEnumerable<IPropertyDescriptor> GetProperties(Type type, object? container); IPropertyDescriptor GetProperty(Type type, object? container, string name, [MaybeNullWhen(true)] bool ignoreUnmatched, bool caseInsensitivePropertyMatching); string GetEnumName(Type enumType, string name); string GetEnumValue(object enumValue); } public interface ITypeResolver { Type Resolve(Type staticType, object? actualValue); } public interface IValueDeserializer { object? DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer); } public interface IValuePromise { event Action<object?> ValueAvailable; } public interface IValueSerializer { void SerializeValue(IEmitter emitter, object? value, Type? type); } public interface IYamlConvertible { void Read(IParser parser, Type expectedType, ObjectDeserializer nestedObjectDeserializer); void Write(IEmitter emitter, ObjectSerializer nestedObjectSerializer); } public delegate object? ObjectDeserializer(Type type); public delegate void ObjectSerializer(object? value, Type? type = null); [Obsolete("Please use IYamlConvertible instead")] public interface IYamlSerializable { void ReadYaml(IParser parser); void WriteYaml(IEmitter emitter); } public interface IYamlTypeConverter { bool Accepts(Type type); object? ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer); void WriteYaml(IEmitter emitter, object? value, Type type, ObjectSerializer serializer); } internal sealed class LazyComponentRegistrationList<TArgument, TComponent> : IEnumerable<Func<TArgument, TComponent>>, IEnumerable { public sealed class LazyComponentRegistration { public readonly Type ComponentType; public readonly Func<TArgument, TComponent> Factory; public LazyComponentRegistration(Type componentType, Func<TArgument, TComponent> factory) { ComponentType = componentType; Factory = factory; } } public sealed class TrackingLazyComponentRegistration { public readonly Type ComponentType; public readonly Func<TComponent, TArgument, TComponent> Factory; public TrackingLazyComponentRegistration(Type componentType, Func<TComponent, TArgument, TComponent> factory) { ComponentType = componentType; Factory = factory; } } private class RegistrationLocationSelector : IRegistrationLocationSelectionSyntax<TComponent> { private readonly LazyComponentRegistrationList<TArgument, TComponent> registrations; private readonly LazyComponentRegistration newRegistration; public RegistrationLocationSelector(LazyComponentRegistrationList<TArgument, TComponent> registrations, LazyComponentRegistration newRegistration) { this.registrations = registrations; this.newRegistration = newRegistration; } void IRegistrationLocationSelectionSyntax<TComponent>.InsteadOf<TRegistrationType>() { if (newRegistration.ComponentType != typeof(TRegistrationType)) { registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType); } int index = registrations.EnsureRegistrationExists<TRegistrationType>(); registrations.entries[index] = newRegistration; } void IRegistrationLocationSelectionSyntax<TComponent>.After<TRegistrationType>() { registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType); int num = registrations.EnsureRegistrationExists<TRegistrationType>(); registrations.entries.Insert(num + 1, newRegistration); } void IRegistrationLocationSelectionSyntax<TComponent>.Before<TRegistrationType>() { registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType); int index = registrations.EnsureRegistrationExists<TRegistrationType>(); registrations.entries.Insert(index, newRegistration); } void IRegistrationLocationSelectionSyntax<TComponent>.OnBottom() { registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType); registrations.entries.Add(newRegistration); } void IRegistrationLocationSelectionSyntax<TComponent>.OnTop() { registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType); registrations.entries.Insert(0, newRegistration); } } private class TrackingRegistrationLocationSelector : ITrackingRegistrationLocationSelectionSyntax<TComponent> { private readonly LazyComponentRegistrationList<TArgument, TComponent> registrations; private readonly TrackingLazyComponentRegistration newRegistration; public TrackingRegistrationLocationSelector(LazyComponentRegistrationList<TArgument, TComponent> registrations, TrackingLazyComponentRegistration newRegistration) { this.registrations = registrations; this.newRegistration = newRegistration; } void ITrackingRegistrationLocationSelectionSyntax<TComponent>.InsteadOf<TRegistrationType>() { if (newRegistration.ComponentType != typeof(TRegistrationType)) { registrations.EnsureNoDuplicateRegistrationType(newRegistration.ComponentType); } int index = registrations.EnsureRegistrationExists<TRegistrationType>(); Func<TArgument, TComponent> innerComponentFactory = registrations.entries[index].Factory; registrations.entries[index] = new LazyComponentRegistration(newRegistration.ComponentType, (TArgument arg) => newRegistration.Factory(innerComponentFactory(arg), arg)); } } private readonly List<LazyComponentRegistration> entries = new List<LazyComponentRegistration>(); public int Count => entries.Count; public IEnumerable<Func<TArgument, TComponent>> InReverseOrder { get { int i = entries.Count - 1; while (i >= 0) { yield return entries[i].Factory; int num = i - 1; i = num; } } } public LazyComponentRegistrationList<TArgument, TComponent> Clone() { LazyComponentRegistrationList<TArgument, TComponent> lazyComponentRegistrationList = new LazyComponentRegistrationList<TArgument, TComponent>(); foreach (LazyComponentRegistration entry in entries) { lazyComponentRegistrationList.entries.Add(entry); } return lazyComponentRegistrationList; } public void Clear() { entries.Clear(); } public void Add(Type componentType, Func<TArgument, TComponent> factory) { entries.Add(new LazyComponentRegistration(componentType, factory)); } public void Remove(Type componentType) { for (int i = 0; i < entries.Count; i++) { if (entries[i].ComponentType == componentType) { entries.RemoveAt(i); return; } } throw new KeyNotFoundException("A component registration of type '" + componentType.FullName + "' was not found."); } public IRegistrationLocationSelectionSyntax<TComponent> CreateRegistrationLocationSelector(Type componentType, Func<TArgument, TComponent> factory) { return new RegistrationLocationSelector(this, new LazyComponentRegistration(componentType, factory)); } public ITrackingRegistrationLocationSelectionSyntax<TComponent> CreateTrackingRegistrationLocationSelector(Type componentType, Func<TComponent, TArgument, TComponent> factory) { return new TrackingRegistrationLocationSelector(this, new TrackingLazyComponentRegistration(componentType, factory)); } public IEnumerator<Func<TArgument, TComponent>> GetEnumerator() { return entries.Select((LazyComponentRegistration e) => e.Factory).GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } private int IndexOfRegistration(Type registrationType) { for (int i = 0; i < entries.Count; i++) { if (registrationType == entries[i].ComponentType) { return i; } } return -1; } private void EnsureNoDuplicateRegistrationType(Type componentType) { if (IndexOfRegistration(componentType) != -1) { throw new InvalidOperationException("A component of type '" + componentType.FullName + "' has already been registered."); } } private int EnsureRegistrationExists<TRegistrationType>() { int num = IndexOfRegistration(typeof(TRegistrationType)); if (num == -1) { throw new InvalidOperationException("A component of type '" + typeof(TRegistrationType).FullName + "' has not been registered."); } return num; } } internal static class LazyComponentRegistrationListExtensions { public static TComponent BuildComponentChain<TComponent>(this LazyComponentRegistrationList<TComponent, TComponent> registrations, TComponent innerComponent) { return registrations.InReverseOrder.Aggregate(innerComponent, (TComponent inner, Func<TComponent, TComponent> factory) => factory(inner)); } public static TComponent BuildComponentChain<TArgument, TComponent>(this LazyComponentRegistrationList<TArgument, TComponent> registrations, TComponent innerComponent, Func<TComponent, TArgument> argumentBuilder) { Func<TComponent, TArgument> argumentBuilder2 = argumentBuilder; return registrations.InReverseOrder.Aggregate(innerComponent, (TComponent inner, Func<TArgument, TComponent> factory) => factory(argumentBuilder2(inner))); } public static List<TComponent> BuildComponentList<TComponent>(this LazyComponentRegistrationList<Nothing, TComponent> registrations) { return registrations.Select((Func<Nothing, TComponent> factory) => factory(default(Nothing))).ToList(); } public static List<TComponent> BuildComponentList<TArgument, TComponent>(this LazyComponentRegistrationList<TArgument, TComponent> registrations, TArgument argument) { TArgument argument2 = argument; return registrations.Select((Func<TArgument, TComponent> factory) => factory(argument2)).ToList(); } } [StructLayout(LayoutKind.Sequential, Size = 1)] public struct Nothing { } public sealed class ObjectDescriptor : IObjectDescriptor { public object? Value { get; private set; } public Type Type { get; private set; } public Type StaticType { get; private set; } public ScalarStyle ScalarStyle { get; private set; } public ObjectDescriptor(object? value, Type type, Type staticType) : this(value, type, staticType, ScalarStyle.Any) { } public ObjectDescriptor(object? value, Type type, Type staticType, ScalarStyle scalarStyle) { Value = value; Type = type ?? throw new ArgumentNullException("type"); StaticType = staticType ?? throw new ArgumentNullException("staticType"); ScalarStyle = scalarStyle; } } public delegate IObjectGraphTraversalStrategy ObjectGraphTraversalStrategyFactory(ITypeInspector typeInspector, ITypeResolver typeResolver, IEnumerable<IYamlTypeConverter> typeConverters, int maximumRecursion); public sealed class PropertyDescriptor : IPropertyDescriptor { private readonly IPropertyDescriptor baseDescriptor; public bool AllowNulls => baseDescriptor.AllowNulls; public string Name { get; set; } public bool Required => baseDescriptor.Required; public Type Type => baseDescriptor.Type; public Type? TypeOverride { get { return baseDescriptor.TypeOverride; } set { baseDescriptor.TypeOverride = value; } } public Type? ConverterType => baseDescriptor.ConverterType; public int Order { get; set; } public ScalarStyle ScalarStyle { get { return baseDescriptor.ScalarStyle; } set { baseDescriptor.ScalarStyle = value; } } public bool CanWrite => baseDescriptor.CanWrite; public PropertyDescriptor(IPropertyDescriptor baseDescriptor) { this.baseDescriptor = baseDescriptor; Name = baseDescriptor.Name; } public void Write(object target, object? value) { baseDescriptor.Write(target, value); } public T? GetCustomAttribute<T>() where T : Attribute { return baseDescriptor.GetCustomAttribute<T>(); } public IObjectDescriptor Read(object target) { return baseDescriptor.Read(target); } } public sealed class Serializer : ISerializer { private readonly IValueSerializer valueSerializer; private readonly EmitterSettings emitterSettings; public Serializer() : this(new SerializerBuilder().BuildValueSerializer(), EmitterSettings.Default) { } private Serializer(IValueSerializer valueSerializer, EmitterSettings emitterSettings) { this.valueSerializer = valueSerializer ?? throw new ArgumentNullException("valueSerializer"); this.emitterSettings = emitterSettings ?? throw new ArgumentNullException("emitterSettings"); } public static Serializer FromValueSerializer(IValueSerializer valueSerializer, EmitterSettings emitterSettings) { return new Serializer(valueSerializer, emitterSettings); } public string Serialize(object? graph) { using StringWriter stringWriter = new StringWriter(); Serialize(stringWriter, graph); return stringWriter.ToString(); } public string Serialize(object? graph, Type type) { using StringWriter stringWriter = new StringWriter(); Serialize(stringWriter, graph, type); return stringWriter.ToString(); } public void Serialize(TextWriter writer, object? graph) { Serialize(new Emitter(writer, emitterSettings), graph); } public void Serialize(TextWriter writer, object? graph, Type type) { Serialize(new Emitter(writer, emitterSettings), graph, type); } public void Serialize(IEmitter emitter, object? graph) { if (emitter == null) { throw new ArgumentNullException("emitter"); } EmitDocument(emitter, graph, null); } public void Serialize(IEmitter emitter, object? graph, Type type) { if (emitter == null) { throw new ArgumentNullException("emitter"); } if (type == null) { throw new ArgumentNullException("type"); } EmitDocument(emitter, graph, type); } private void EmitDocument(IEmitter emitter, object? graph, Type? type) { emitter.Emit(new YamlDotNet.Core.Events.StreamStart()); emitter.Emit(new YamlDotNet.Core.Events.DocumentStart()); valueSerializer.SerializeValue(emitter, graph, type); emitter.Emit(new YamlDotNet.Core.Events.DocumentEnd(isImplicit: true)); emitter.Emit(new YamlDotNet.Core.Events.StreamEnd()); } } public sealed class SerializerBuilder : BuilderSkeleton<SerializerBuilder> { private class ValueSerializer : IValueSerializer { private readonly IObjectGraphTraversalStrategy traversalStrategy; private readonly IEventEmitter eventEmitter; private readonly IEnumerable<IYamlTypeConverter> typeConverters; private readonly LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories; private readonly LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories; public ValueSerializer(IObjectGraphTraversalStrategy traversalStrategy, IEventEmitter eventEmitter, IEnumerable<IYamlTypeConverter> typeConverters, LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories, LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories) { this.traversalStrategy = traversalStrategy; this.eventEmitter = eventEmitter; this.typeConverters = typeConverters; this.preProcessingPhaseObjectGraphVisitorFactories = preProcessingPhaseObjectGraphVisitorFactories; this.emissionPhaseObjectGraphVisitorFactories = emissionPhaseObjectGraphVisitorFactories; } public void SerializeValue(IEmitter emitter, object? value, Type? type) { IEmitter emitter2 = emitter; Type type2 = type ?? ((value != null) ? value.GetType() : typeof(object)); Type staticType = type ?? typeof(object); ObjectDescriptor graph = new ObjectDescriptor(value, type2, staticType); List<IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitors = preProcessingPhaseObjectGraphVisitorFactories.BuildComponentList(typeConverters); IObjectGraphVisitor<IEmitter> visitor = emissionPhaseObjectGraphVisitorFactories.BuildComponentChain<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>>(new EmittingObjectGraphVisitor(eventEmitter), (IObjectGraphVisitor<IEmitter> inner) => new EmissionPhaseObjectGraphVisitorArgs(inner, eventEmitter, preProcessingPhaseObjectGraphVisitors, typeConverters, NestedObjectSerializer)); foreach (IObjectGraphVisitor<Nothing> item in preProcessingPhaseObjectGraphVisitors) { traversalStrategy.Traverse(graph, item, default(Nothing), NestedObjectSerializer); } traversalStrategy.Traverse(graph, visitor, emitter2, NestedObjectSerializer); void NestedObjectSerializer(object? v, Type? t) { SerializeValue(emitter2, v, t); } } } private ObjectGraphTraversalStrategyFactory objectGraphTraversalStrategyFactory; private readonly LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories; private readonly LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories; private readonly LazyComponentRegistrationList<IEventEmitter, IEventEmitter> eventEmitterFactories; private readonly Dictionary<Type, TagName> tagMappings = new Dictionary<Type, TagName>(); private readonly IObjectFactory objectFactory; private int maximumRecursion = 50; private EmitterSettings emitterSettings = EmitterSettings.Default; private DefaultValuesHandling defaultValuesHandlingConfiguration; private ScalarStyle defaultScalarStyle; private bool quoteNecessaryStrings; private bool quoteYaml1_1Strings; protected override SerializerBuilder Self => this; public SerializerBuilder() : base((ITypeResolver)new DynamicTypeResolver()) { typeInspectorFactories.Add(typeof(CachedTypeInspector), (ITypeInspector inner) => new CachedTypeInspector(inner)); typeInspectorFactories.Add(typeof(NamingConventionTypeInspector), (ITypeInspector inner) => (!(namingConvention is NullNamingConvention)) ? new NamingConventionTypeInspector(inner, namingConvention) : inner); typeInspectorFactories.Add(typeof(YamlAttributesTypeInspector), (ITypeInspector inner) => new YamlAttributesTypeInspector(inner)); typeInspectorFactories.Add(typeof(YamlAttributeOverridesInspector), (ITypeInspector inner) => (overrides == null) ? inner : new YamlAttributeOverridesInspector(inner, overrides.Clone())); preProcessingPhaseObjectGraphVisitorFactories = new LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> { { typeof(AnchorAssigner), (IEnumerable<IYamlTypeConverter> typeConverters) => new AnchorAssigner(typeConverters) } }; emissionPhaseObjectGraphVisitorFactories = new LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> { { typeof(CustomSerializationObjectGraphVisitor), (EmissionPhaseObjectGraphVisitorArgs args) => new CustomSerializationObjectGraphVisitor(args.InnerVisitor, args.TypeConverters, args.NestedObjectSerializer) }, { typeof(AnchorAssigningObjectGraphVisitor), (EmissionPhaseObjectGraphVisitorArgs args) => new AnchorAssigningObjectGraphVisitor(args.InnerVisitor, args.EventEmitter, args.GetPreProcessingPhaseObjectGraphVisitor<AnchorAssigner>()) }, { typeof(DefaultValuesObjectGraphVisitor), (EmissionPhaseObjectGraphVisitorArgs args) => new DefaultValuesObjectGraphVisitor(defaultValuesHandlingConfiguration, args.InnerVisitor, new DefaultObjectFactory()) }, { typeof(CommentsObjectGraphVisitor), (EmissionPhaseObjectGraphVisitorArgs args) => new CommentsObjectGraphVisitor(args.InnerVisitor) } }; eventEmitterFactories = new LazyComponentRegistrationList<IEventEmitter, IEventEmitter> { { typeof(TypeAssigningEventEmitter), (IEventEmitter inner) => new TypeAssigningEventEmitter(inner, tagMappings, quoteNecessaryStrings, quoteYaml1_1Strings, defaultScalarStyle, yamlFormatter, enumNamingConvention, BuildTypeInspector()) } }; objectFactory = new DefaultObjectFactory(); objectGraphTraversalStrategyFactory = (ITypeInspector typeInspector, ITypeResolver typeResolver, IEnumerable<IYamlTypeConverter> typeConverters, int maximumRecursion) => new FullObjectGraphTraversalStrategy(typeInspector, typeResolver, maximumRecursion, namingConvention, objectFactory); } public SerializerBuilder WithQuotingNecessaryStrings(bool quoteYaml1_1Strings = false) { quoteNecessaryStrings = true; this.quoteYaml1_1Strings = quoteYaml1_1Strings; return this; } public SerializerBuilder WithDefaultScalarStyle(ScalarStyle style) { defaultScalarStyle = style; return this; } public SerializerBuilder WithMaximumRecursion(int maximumRecursion) { if (maximumRecursion <= 0) { throw new ArgumentOutOfRangeException("maximumRecursion", $"The maximum recursion specified ({maximumRecursion}) is invalid. It should be a positive integer."); } this.maximumRecursion = maximumRecursion; return this; } public SerializerBuilder WithEventEmitter<TEventEmitter>(Func<IEventEmitter, TEventEmitter> eventEmitterFactory) where TEventEmitter : IEventEmitter { return WithEventEmitter(eventEmitterFactory, delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> w) { w.OnTop(); }); } public SerializerBuilder WithEventEmitter<TEventEmitter>(Func<IEventEmitter, ITypeInspector, TEventEmitter> eventEmitterFactory) where TEventEmitter : IEventEmitter { return WithEventEmitter(eventEmitterFactory, delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> w) { w.OnTop(); }); } public SerializerBuilder WithEventEmitter<TEventEmitter>(Func<IEventEmitter, TEventEmitter> eventEmitterFactory, Action<IRegistrationLocationSelectionSyntax<IEventEmitter>> where) where TEventEmitter : IEventEmitter { Func<IEventEmitter, TEventEmitter> eventEmitterFactory2 = eventEmitterFactory; return WithEventEmitter((IEventEmitter e, ITypeInspector _) => eventEmitterFactory2(e), where); } public SerializerBuilder WithEventEmitter<TEventEmitter>(Func<IEventEmitter, ITypeInspector, TEventEmitter> eventEmitterFactory, Action<IRegistrationLocationSelectionSyntax<IEventEmitter>> where) where TEventEmitter : IEventEmitter { Func<IEventEmitter, ITypeInspector, TEventEmitter> eventEmitterFactory2 = eventEmitterFactory; if (eventEmitterFactory2 == null) { throw new ArgumentNullException("eventEmitterFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(eventEmitterFactories.CreateRegistrationLocationSelector(typeof(TEventEmitter), (IEventEmitter inner) => eventEmitterFactory2(inner, BuildTypeInspector()))); return Self; } public SerializerBuilder WithEventEmitter<TEventEmitter>(WrapperFactory<IEventEmitter, IEventEmitter, TEventEmitter> eventEmitterFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IEventEmitter>> where) where TEventEmitter : IEventEmitter { WrapperFactory<IEventEmitter, IEventEmitter, TEventEmitter> eventEmitterFactory2 = eventEmitterFactory; if (eventEmitterFactory2 == null) { throw new ArgumentNullException("eventEmitterFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(eventEmitterFactories.CreateTrackingRegistrationLocationSelector(typeof(TEventEmitter), (IEventEmitter wrapped, IEventEmitter inner) => eventEmitterFactory2(wrapped, inner))); return Self; } public SerializerBuilder WithoutEventEmitter<TEventEmitter>() where TEventEmitter : IEventEmitter { return WithoutEventEmitter(typeof(TEventEmitter)); } public SerializerBuilder WithoutEventEmitter(Type eventEmitterType) { if (eventEmitterType == null) { throw new ArgumentNullException("eventEmitterType"); } eventEmitterFactories.Remove(eventEmitterType); return this; } public override SerializerBuilder WithTagMapping(TagName tag, Type type) { if (tag.IsEmpty) { throw new ArgumentException("Non-specific tags cannot be maped"); } if (type == null) { throw new ArgumentNullException("type"); } if (tagMappings.TryGetValue(type, out var value)) { throw new ArgumentException($"Type already has a registered tag '{value}' for type '{type.FullName}'", "type"); } tagMappings.Add(type, tag); return this; } public SerializerBuilder WithoutTagMapping(Type type) { if (type == null) { throw new ArgumentNullException("type"); } if (!tagMappings.Remove(type)) { throw new KeyNotFoundException("Tag for type '" + type.FullName + "' is not registered"); } return this; } public SerializerBuilder EnsureRoundtrip() { objectGraphTraversalStrategyFactory = (ITypeInspector typeInspector, ITypeResolver typeResolver, IEnumerable<IYamlTypeConverter> typeConverters, int maximumRecursion) => new RoundtripObjectGraphTraversalStrategy(typeConverters, typeInspector, typeResolver, maximumRecursion, namingConvention, settings, objectFactory); WithEventEmitter((IEventEmitter inner) => new TypeAssigningEventEmitter(inner, tagMappings, quoteNecessaryStrings, quoteYaml1_1Strings, defaultScalarStyle, yamlFormatter, enumNamingConvention, BuildTypeInspector()), delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> loc) { loc.InsteadOf<TypeAssigningEventEmitter>(); }); return WithTypeInspector((ITypeInspector inner) => new ReadableAndWritablePropertiesTypeInspector(inner), delegate(IRegistrationLocationSelectionSyntax<ITypeInspector> loc) { loc.OnBottom(); }); } public SerializerBuilder DisableAliases() { preProcessingPhaseObjectGraphVisitorFactories.Remove(typeof(AnchorAssigner)); emissionPhaseObjectGraphVisitorFactories.Remove(typeof(AnchorAssigningObjectGraphVisitor)); return this; } [Obsolete("The default behavior is now to always emit default values, thefore calling this method has no effect. This behavior is now controlled by ConfigureDefaultValuesHandling.", true)] public SerializerBuilder EmitDefaults() { return ConfigureDefaultValuesHandling(DefaultValuesHandling.Preserve); } public SerializerBuilder ConfigureDefaultValuesHandling(DefaultValuesHandling configuration) { defaultValuesHandlingConfiguration = configuration; return this; } public SerializerBuilder JsonCompatible() { emitterSettings = emitterSettings.WithMaxSimpleKeyLength(int.MaxValue).WithoutAnchorName().WithUtf16SurrogatePairs(); return WithTypeConverter(new YamlDotNet.Serialization.Converters.GuidConverter(jsonCompatible: true), delegate(IRegistrationLocationSelectionSyntax<IYamlTypeConverter> w) { w.InsteadOf<YamlDotNet.Serialization.Converters.GuidConverter>(); }).WithTypeConverter(new DateTime8601Converter(ScalarStyle.DoubleQuoted)).WithTypeConverter(new DateOnlyConverter(null, true)).WithTypeConverter(new TimeOnlyConverter(null, true)) .WithEventEmitter((IEventEmitter inner) => new JsonEventEmitter(inner, yamlFormatter, enumNamingConvention, BuildTypeInspector()), delegate(IRegistrationLocationSelectionSyntax<IEventEmitter> loc) { loc.InsteadOf<TypeAssigningEventEmitter>(); }); } public SerializerBuilder WithNewLine(string newLine) { emitterSettings = emitterSettings.WithNewLine(newLine); return this; } public SerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(TObjectGraphVisitor objectGraphVisitor) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { return WithPreProcessingPhaseObjectGraphVisitor(objectGraphVisitor, delegate(IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>> w) { w.OnTop(); }); } public SerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(Func<IEnumerable<IYamlTypeConverter>, TObjectGraphVisitor> objectGraphVisitorFactory) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { return WithPreProcessingPhaseObjectGraphVisitor(objectGraphVisitorFactory, delegate(IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>> w) { w.OnTop(); }); } public SerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(TObjectGraphVisitor objectGraphVisitor, Action<IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { TObjectGraphVisitor objectGraphVisitor2 = objectGraphVisitor; if (objectGraphVisitor2 == null) { throw new ArgumentNullException("objectGraphVisitor"); } if (where == null) { throw new ArgumentNullException("where"); } where(preProcessingPhaseObjectGraphVisitorFactories.CreateRegistrationLocationSelector(typeof(TObjectGraphVisitor), (IEnumerable<IYamlTypeConverter> _) => objectGraphVisitor2)); return this; } public SerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(Func<IEnumerable<IYamlTypeConverter>, TObjectGraphVisitor> objectGraphVisitorFactory, Action<IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { Func<IEnumerable<IYamlTypeConverter>, TObjectGraphVisitor> objectGraphVisitorFactory2 = objectGraphVisitorFactory; if (objectGraphVisitorFactory2 == null) { throw new ArgumentNullException("objectGraphVisitorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(preProcessingPhaseObjectGraphVisitorFactories.CreateRegistrationLocationSelector(typeof(TObjectGraphVisitor), (IEnumerable<IYamlTypeConverter> typeConverters) => objectGraphVisitorFactory2(typeConverters))); return this; } public SerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(WrapperFactory<IObjectGraphVisitor<Nothing>, TObjectGraphVisitor> objectGraphVisitorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { WrapperFactory<IObjectGraphVisitor<Nothing>, TObjectGraphVisitor> objectGraphVisitorFactory2 = objectGraphVisitorFactory; if (objectGraphVisitorFactory2 == null) { throw new ArgumentNullException("objectGraphVisitorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(preProcessingPhaseObjectGraphVisitorFactories.CreateTrackingRegistrationLocationSelector(typeof(TObjectGraphVisitor), (IObjectGraphVisitor<Nothing> wrapped, IEnumerable<IYamlTypeConverter> _) => objectGraphVisitorFactory2(wrapped))); return this; } public SerializerBuilder WithPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>(WrapperFactory<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>, TObjectGraphVisitor> objectGraphVisitorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IObjectGraphVisitor<Nothing>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { WrapperFactory<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>, TObjectGraphVisitor> objectGraphVisitorFactory2 = objectGraphVisitorFactory; if (objectGraphVisitorFactory2 == null) { throw new ArgumentNullException("objectGraphVisitorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(preProcessingPhaseObjectGraphVisitorFactories.CreateTrackingRegistrationLocationSelector(typeof(TObjectGraphVisitor), (IObjectGraphVisitor<Nothing> wrapped, IEnumerable<IYamlTypeConverter> typeConverters) => objectGraphVisitorFactory2(wrapped, typeConverters))); return this; } public SerializerBuilder WithoutPreProcessingPhaseObjectGraphVisitor<TObjectGraphVisitor>() where TObjectGraphVisitor : IObjectGraphVisitor<Nothing> { return WithoutPreProcessingPhaseObjectGraphVisitor(typeof(TObjectGraphVisitor)); } public SerializerBuilder WithoutPreProcessingPhaseObjectGraphVisitor(Type objectGraphVisitorType) { if (objectGraphVisitorType == null) { throw new ArgumentNullException("objectGraphVisitorType"); } preProcessingPhaseObjectGraphVisitorFactories.Remove(objectGraphVisitorType); return this; } public SerializerBuilder WithObjectGraphTraversalStrategyFactory(ObjectGraphTraversalStrategyFactory objectGraphTraversalStrategyFactory) { this.objectGraphTraversalStrategyFactory = objectGraphTraversalStrategyFactory; return this; } public SerializerBuilder WithEmissionPhaseObjectGraphVisitor<TObjectGraphVisitor>(Func<EmissionPhaseObjectGraphVisitorArgs, TObjectGraphVisitor> objectGraphVisitorFactory) where TObjectGraphVisitor : IObjectGraphVisitor<IEmitter> { return WithEmissionPhaseObjectGraphVisitor(objectGraphVisitorFactory, delegate(IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<IEmitter>> w) { w.OnTop(); }); } public SerializerBuilder WithEmissionPhaseObjectGraphVisitor<TObjectGraphVisitor>(Func<EmissionPhaseObjectGraphVisitorArgs, TObjectGraphVisitor> objectGraphVisitorFactory, Action<IRegistrationLocationSelectionSyntax<IObjectGraphVisitor<IEmitter>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<IEmitter> { Func<EmissionPhaseObjectGraphVisitorArgs, TObjectGraphVisitor> objectGraphVisitorFactory2 = objectGraphVisitorFactory; if (objectGraphVisitorFactory2 == null) { throw new ArgumentNullException("objectGraphVisitorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(emissionPhaseObjectGraphVisitorFactories.CreateRegistrationLocationSelector(typeof(TObjectGraphVisitor), (EmissionPhaseObjectGraphVisitorArgs args) => objectGraphVisitorFactory2(args))); return this; } public SerializerBuilder WithEmissionPhaseObjectGraphVisitor<TObjectGraphVisitor>(WrapperFactory<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>, TObjectGraphVisitor> objectGraphVisitorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IObjectGraphVisitor<IEmitter>>> where) where TObjectGraphVisitor : IObjectGraphVisitor<IEmitter> { WrapperFactory<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>, TObjectGraphVisitor> objectGraphVisitorFactory2 = objectGraphVisitorFactory; if (objectGraphVisitorFactory2 == null) { throw new ArgumentNullException("objectGraphVisitorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(emissionPhaseObjectGraphVisitorFactories.CreateTrackingRegistrationLocationSelector(typeof(TObjectGraphVisitor), (IObjectGraphVisitor<IEmitter> wrapped, EmissionPhaseObjectGraphVisitorArgs args) => objectGraphVisitorFactory2(wrapped, args))); return this; } public SerializerBuilder WithoutEmissionPhaseObjectGraphVisitor<TObjectGraphVisitor>() where TObjectGraphVisitor : IObjectGraphVisitor<IEmitter> { return WithoutEmissionPhaseObjectGraphVisitor(typeof(TObjectGraphVisitor)); } public SerializerBuilder WithoutEmissionPhaseObjectGraphVisitor(Type objectGraphVisitorType) { if (objectGraphVisitorType == null) { throw new ArgumentNullException("objectGraphVisitorType"); } emissionPhaseObjectGraphVisitorFactories.Remove(objectGraphVisitorType); return this; } public SerializerBuilder WithIndentedSequences() { emitterSettings = emitterSettings.WithIndentedSequences(); return this; } public ISerializer Build() { if (FsharpHelper.Instance == null) { FsharpHelper.Instance = new DefaultFsharpHelper(); } return Serializer.FromValueSerializer(BuildValueSerializer(), emitterSettings); } public IValueSerializer BuildValueSerializer() { IEnumerable<IYamlTypeConverter> typeConverters = BuildTypeConverters(); ITypeInspector typeInspector = BuildTypeInspector(); IObjectGraphTraversalStrategy traversalStrategy = objectGraphTraversalStrategyFactory(typeInspector, typeResolver, typeConverters, maximumRecursion); IEventEmitter eventEmitter = eventEmitterFactories.BuildComponentChain(new WriterEventEmitter()); return new ValueSerializer(traversalStrategy, eventEmitter, typeConverters, preProcessingPhaseObjectGraphVisitorFactories.Clone(), emissionPhaseObjectGraphVisitorFactories.Clone()); } public ITypeInspector BuildTypeInspector() { ITypeInspector typeInspector = new ReadablePropertiesTypeInspector(typeResolver, includeNonPublicProperties); if (!ignoreFields) { typeInspector = new CompositeTypeInspector(new ReadableFieldsTypeInspector(typeResolver), typeInspector); } return typeInspectorFactories.BuildComponentChain(typeInspector); } } public class Settings { public bool AllowPrivateConstructors { get; set; } } public abstract class StaticBuilderSkeleton<TBuilder> where TBuilder : StaticBuilderSkeleton<TBuilder> { internal INamingConvention namingConvention = NullNamingConvention.Instance; internal INamingConvention enumNamingConvention = NullNamingConvention.Instance; internal ITypeResolver typeResolver; internal readonly LazyComponentRegistrationList<Nothing, IYamlTypeConverter> typeConverterFactories; internal readonly LazyComponentRegistrationList<ITypeInspector, ITypeInspector> typeInspectorFactories; internal bool includeNonPublicProperties; internal Settings settings; internal YamlFormatter yamlFormatter = YamlFormatter.Default; protected abstract TBuilder Self { get; } internal StaticBuilderSkeleton(ITypeResolver typeResolver) { typeConverterFactories = new LazyComponentRegistrationList<Nothing, IYamlTypeConverter> { { typeof(YamlDotNet.Serialization.Converters.GuidConverter), (Nothing _) => new YamlDotNet.Serialization.Converters.GuidConverter(jsonCompatible: false) } }; typeInspectorFactories = new LazyComponentRegistrationList<ITypeInspector, ITypeInspector>(); this.typeResolver = typeResolver ?? throw new ArgumentNullException("typeResolver"); settings = new Settings(); } public TBuilder WithNamingConvention(INamingConvention namingConvention) { this.namingConvention = namingConvention ?? throw new ArgumentNullException("namingConvention"); return Self; } public TBuilder WithEnumNamingConvention(INamingConvention enumNamingConvention) { this.enumNamingConvention = enumNamingConvention ?? throw new ArgumentNullException("enumNamingConvention"); return Self; } public TBuilder WithTypeResolver(ITypeResolver typeResolver) { this.typeResolver = typeResolver ?? throw new ArgumentNullException("typeResolver"); return Self; } public abstract TBuilder WithTagMapping(TagName tag, Type type); public TBuilder WithTypeConverter(IYamlTypeConverter typeConverter) { return WithTypeConverter(typeConverter, delegate(IRegistrationLocationSelectionSyntax<IYamlTypeConverter> w) { w.OnTop(); }); } public TBuilder WithTypeConverter(IYamlTypeConverter typeConverter, Action<IRegistrationLocationSelectionSyntax<IYamlTypeConverter>> where) { IYamlTypeConverter typeConverter2 = typeConverter; if (typeConverter2 == null) { throw new ArgumentNullException("typeConverter"); } if (where == null) { throw new ArgumentNullException("where"); } where(typeConverterFactories.CreateRegistrationLocationSelector(typeConverter2.GetType(), (Nothing _) => typeConverter2)); return Self; } public TBuilder WithTypeConverter<TYamlTypeConverter>(WrapperFactory<IYamlTypeConverter, IYamlTypeConverter> typeConverterFactory, Action<ITrackingRegistrationLocationSelectionSyntax<IYamlTypeConverter>> where) where TYamlTypeConverter : IYamlTypeConverter { WrapperFactory<IYamlTypeConverter, IYamlTypeConverter> typeConverterFactory2 = typeConverterFactory; if (typeConverterFactory2 == null) { throw new ArgumentNullException("typeConverterFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(typeConverterFactories.CreateTrackingRegistrationLocationSelector(typeof(TYamlTypeConverter), (IYamlTypeConverter wrapped, Nothing _) => typeConverterFactory2(wrapped))); return Self; } public TBuilder WithoutTypeConverter<TYamlTypeConverter>() where TYamlTypeConverter : IYamlTypeConverter { return WithoutTypeConverter(typeof(TYamlTypeConverter)); } public TBuilder WithoutTypeConverter(Type converterType) { if (converterType == null) { throw new ArgumentNullException("converterType"); } typeConverterFactories.Remove(converterType); return Self; } public TBuilder WithTypeInspector<TTypeInspector>(Func<ITypeInspector, TTypeInspector> typeInspectorFactory) where TTypeInspector : ITypeInspector { return WithTypeInspector(typeInspectorFactory, delegate(IRegistrationLocationSelectionSyntax<ITypeInspector> w) { w.OnTop(); }); } public TBuilder WithTypeInspector<TTypeInspector>(Func<ITypeInspector, TTypeInspector> typeInspectorFactory, Action<IRegistrationLocationSelectionSyntax<ITypeInspector>> where) where TTypeInspector : ITypeInspector { Func<ITypeInspector, TTypeInspector> typeInspectorFactory2 = typeInspectorFactory; if (typeInspectorFactory2 == null) { throw new ArgumentNullException("typeInspectorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(typeInspectorFactories.CreateRegistrationLocationSelector(typeof(TTypeInspector), (ITypeInspector inner) => typeInspectorFactory2(inner))); return Self; } public TBuilder WithTypeInspector<TTypeInspector>(WrapperFactory<ITypeInspector, ITypeInspector, TTypeInspector> typeInspectorFactory, Action<ITrackingRegistrationLocationSelectionSyntax<ITypeInspector>> where) where TTypeInspector : ITypeInspector { WrapperFactory<ITypeInspector, ITypeInspector, TTypeInspector> typeInspectorFactory2 = typeInspectorFactory; if (typeInspectorFactory2 == null) { throw new ArgumentNullException("typeInspectorFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(typeInspectorFactories.CreateTrackingRegistrationLocationSelector(typeof(TTypeInspector), (ITypeInspector wrapped, ITypeInspector inner) => typeInspectorFactory2(wrapped, inner))); return Self; } public TBuilder WithoutTypeInspector<TTypeInspector>() where TTypeInspector : ITypeInspector { return WithoutTypeInspector(typeof(TTypeInspector)); } public TBuilder WithoutTypeInspector(Type inspectorType) { if (inspectorType == null) { throw new ArgumentNullException("inspectorType"); } typeInspectorFactories.Remove(inspectorType); return Self; } public TBuilder WithYamlFormatter(YamlFormatter formatter) { yamlFormatter = formatter ?? throw new ArgumentNullException("formatter"); return Self; } protected IEnumerable<IYamlTypeConverter> BuildTypeConverters() { return typeConverterFactories.BuildComponentList(); } } public abstract class StaticContext { public virtual bool IsKnownType(Type type) { throw new NotImplementedException(); } public virtual ITypeResolver GetTypeResolver() { throw new NotImplementedException(); } public virtual StaticObjectFactory GetFactory() { throw new NotImplementedException(); } public virtual ITypeInspector GetTypeInspector() { throw new NotImplementedException(); } } public sealed class StaticDeserializerBuilder : StaticBuilderSkeleton<StaticDeserializerBuilder> { private readonly StaticContext context; private readonly StaticObjectFactory factory; private readonly LazyComponentRegistrationList<Nothing, INodeDeserializer> nodeDeserializerFactories; private readonly LazyComponentRegistrationList<Nothing, INodeTypeResolver> nodeTypeResolverFactories; private readonly Dictionary<TagName, Type> tagMappings; private readonly ITypeConverter typeConverter; private readonly Dictionary<Type, Type> typeMappings; private bool ignoreUnmatched; private bool duplicateKeyChecking; private bool attemptUnknownTypeDeserialization; private bool enforceNullability; private bool caseInsensitivePropertyMatching; protected override StaticDeserializerBuilder Self => this; public StaticDeserializerBuilder(StaticContext context) : base(context.GetTypeResolver()) { this.context = context; factory = context.GetFactory(); typeMappings = new Dictionary<Type, Type>(); tagMappings = new Dictionary<TagName, Type> { { FailsafeSchema.Tags.Map, typeof(Dictionary<object, object>) }, { FailsafeSchema.Tags.Str, typeof(string) }, { JsonSchema.Tags.Bool, typeof(bool) }, { JsonSchema.Tags.Float, typeof(double) }, { JsonSchema.Tags.Int, typeof(int) }, { DefaultSchema.Tags.Timestamp, typeof(DateTime) } }; typeInspectorFactories.Add(typeof(CachedTypeInspector), (ITypeInspector inner) => new CachedTypeInspector(inner)); typeInspectorFactories.Add(typeof(NamingConventionTypeInspector), (ITypeInspector inner) => (!(namingConvention is NullNamingConvention)) ? new NamingConventionTypeInspector(inner, namingConvention) : inner); typeInspectorFactories.Add(typeof(YamlAttributesTypeInspector), (ITypeInspector inner) => new YamlAttributesTypeInspector(inner)); nodeDeserializerFactories = new LazyComponentRegistrationList<Nothing, INodeDeserializer> { { typeof(YamlConvertibleNodeDeserializer), (Nothing _) => new YamlConvertibleNodeDeserializer(factory) }, { typeof(YamlSerializableNodeDeserializer), (Nothing _) => new YamlSerializableNodeDeserializer(factory) }, { typeof(TypeConverterNodeDeserializer), (Nothing _) => new TypeConverterNodeDeserializer(BuildTypeConverters()) }, { typeof(NullNodeDeserializer), (Nothing _) => new NullNodeDeserializer() }, { typeof(ScalarNodeDeserializer), (Nothing _) => new ScalarNodeDeserializer(attemptUnknownTypeDeserialization, typeConverter, BuildTypeInspector(), yamlFormatter, enumNamingConvention) }, { typeof(StaticArrayNodeDeserializer), (Nothing _) => new StaticArrayNodeDeserializer(factory) }, { typeof(StaticDictionaryNodeDeserializer), (Nothing _) => new StaticDictionaryNodeDeserializer(factory, duplicateKeyChecking) }, { typeof(StaticCollectionNodeDeserializer), (Nothing _) => new StaticCollectionNodeDeserializer(factory) }, { typeof(ObjectNodeDeserializer), (Nothing _) => new ObjectNodeDeserializer(factory, BuildTypeInspector(), ignoreUnmatched, duplicateKeyChecking, typeConverter, enumNamingConvention, enforceNullability, caseInsensitivePropertyMatching, enforceRequiredProperties: false, BuildTypeConverters()) } }; nodeTypeResolverFactories = new LazyComponentRegistrationList<Nothing, INodeTypeResolver> { { typeof(MappingNodeTypeResolver), (Nothing _) => new MappingNodeTypeResolver(typeMappings) }, { typeof(YamlConvertibleTypeResolver), (Nothing _) => new YamlConvertibleTypeResolver() }, { typeof(YamlSerializableTypeResolver), (Nothing _) => new YamlSerializableTypeResolver() }, { typeof(TagNodeTypeResolver), (Nothing _) => new TagNodeTypeResolver(tagMappings) }, { typeof(PreventUnknownTagsNodeTypeResolver), (Nothing _) => new PreventUnknownTagsNodeTypeResolver() }, { typeof(DefaultContainersNodeTypeResolver), (Nothing _) => new DefaultContainersNodeTypeResolver() } }; typeConverter = new NullTypeConverter(); } public ITypeInspector BuildTypeInspector() { ITypeInspector typeInspector = context.GetTypeInspector(); return typeInspectorFactories.BuildComponentChain(typeInspector); } public StaticDeserializerBuilder WithAttemptingUnquotedStringTypeDeserialization() { attemptUnknownTypeDeserialization = true; return this; } public StaticDeserializerBuilder WithNodeDeserializer(INodeDeserializer nodeDeserializer) { return WithNodeDeserializer(nodeDeserializer, delegate(IRegistrationLocationSelectionSyntax<INodeDeserializer> w) { w.OnTop(); }); } public StaticDeserializerBuilder WithNodeDeserializer(INodeDeserializer nodeDeserializer, Action<IRegistrationLocationSelectionSyntax<INodeDeserializer>> where) { INodeDeserializer nodeDeserializer2 = nodeDeserializer; if (nodeDeserializer2 == null) { throw new ArgumentNullException("nodeDeserializer"); } if (where == null) { throw new ArgumentNullException("where"); } where(nodeDeserializerFactories.CreateRegistrationLocationSelector(nodeDeserializer2.GetType(), (Nothing _) => nodeDeserializer2)); return this; } public StaticDeserializerBuilder WithNodeDeserializer<TNodeDeserializer>(WrapperFactory<INodeDeserializer, TNodeDeserializer> nodeDeserializerFactory, Action<ITrackingRegistrationLocationSelectionSyntax<INodeDeserializer>> where) where TNodeDeserializer : INodeDeserializer { WrapperFactory<INodeDeserializer, TNodeDeserializer> nodeDeserializerFactory2 = nodeDeserializerFactory; if (nodeDeserializerFactory2 == null) { throw new ArgumentNullException("nodeDeserializerFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(nodeDeserializerFactories.CreateTrackingRegistrationLocationSelector(typeof(TNodeDeserializer), (INodeDeserializer wrapped, Nothing _) => nodeDeserializerFactory2(wrapped))); return this; } public StaticDeserializerBuilder WithCaseInsensitivePropertyMatching() { caseInsensitivePropertyMatching = true; return this; } public StaticDeserializerBuilder WithEnforceNullability() { enforceNullability = true; return this; } public StaticDeserializerBuilder WithoutNodeDeserializer<TNodeDeserializer>() where TNodeDeserializer : INodeDeserializer { return WithoutNodeDeserializer(typeof(TNodeDeserializer)); } public StaticDeserializerBuilder WithoutNodeDeserializer(Type nodeDeserializerType) { if (nodeDeserializerType == null) { throw new ArgumentNullException("nodeDeserializerType"); } nodeDeserializerFactories.Remove(nodeDeserializerType); return this; } public StaticDeserializerBuilder WithTypeDiscriminatingNodeDeserializer(Action<ITypeDiscriminatingNodeDeserializerOptions> configureTypeDiscriminatingNodeDeserializerOptions, int maxDepth = -1, int maxLength = -1) { TypeDiscriminatingNodeDeserializerOptions typeDiscriminatingNodeDeserializerOptions = new TypeDiscriminatingNodeDeserializerOptions(); configureTypeDiscriminatingNodeDeserializerOptions(typeDiscriminatingNodeDeserializerOptions); TypeDiscriminatingNodeDeserializer nodeDeserializer = new TypeDiscriminatingNodeDeserializer(nodeDeserializerFactories.BuildComponentList(), typeDiscriminatingNodeDeserializerOptions.discriminators, maxDepth, maxLength); return WithNodeDeserializer(nodeDeserializer, delegate(IRegistrationLocationSelectionSyntax<INodeDeserializer> s) { s.Before<DictionaryNodeDeserializer>(); }); } public StaticDeserializerBuilder WithNodeTypeResolver(INodeTypeResolver nodeTypeResolver) { return WithNodeTypeResolver(nodeTypeResolver, delegate(IRegistrationLocationSelectionSyntax<INodeTypeResolver> w) { w.OnTop(); }); } public StaticDeserializerBuilder WithNodeTypeResolver(INodeTypeResolver nodeTypeResolver, Action<IRegistrationLocationSelectionSyntax<INodeTypeResolver>> where) { INodeTypeResolver nodeTypeResolver2 = nodeTypeResolver; if (nodeTypeResolver2 == null) { throw new ArgumentNullException("nodeTypeResolver"); } if (where == null) { throw new ArgumentNullException("where"); } where(nodeTypeResolverFactories.CreateRegistrationLocationSelector(nodeTypeResolver2.GetType(), (Nothing _) => nodeTypeResolver2)); return this; } public StaticDeserializerBuilder WithNodeTypeResolver<TNodeTypeResolver>(WrapperFactory<INodeTypeResolver, TNodeTypeResolver> nodeTypeResolverFactory, Action<ITrackingRegistrationLocationSelectionSyntax<INodeTypeResolver>> where) where TNodeTypeResolver : INodeTypeResolver { WrapperFactory<INodeTypeResolver, TNodeTypeResolver> nodeTypeResolverFactory2 = nodeTypeResolverFactory; if (nodeTypeResolverFactory2 == null) { throw new ArgumentNullException("nodeTypeResolverFactory"); } if (where == null) { throw new ArgumentNullException("where"); } where(nodeTypeResolverFactories.CreateTrackingRegistrationLocationSelector(typeof(TNodeTypeResolver), (INodeTypeResolver wrapped, Nothing _) => nodeTypeResolverFactory2(wrapped))); return this; } public StaticDeserializerBuilder WithoutNodeTypeResolver<TNodeTypeResolver>() where TNodeTypeResolver : INodeTypeResolver { return WithoutNodeTypeResolver(typeof(TNodeTypeResolver)); } public StaticDeserializerBuilder WithoutNodeTypeResolver(Type nodeTypeResolverType) { if (nodeTypeResolverType == null) { throw new ArgumentNullException("nodeTypeResolverType"); } nodeTypeResolverFactories.Remove(nodeTypeResolverType); return this; } public override StaticDeserializerBuilder WithTagMapping(TagName tag, Type type) { if (tag.IsEmpty) { throw new ArgumentException("Non-specific tags cannot be maped"); } if (type == null) { throw new ArgumentNullException("type"); } if (tagMappings.TryGetValue(tag, out Type value)) { throw new ArgumentException($"Type already has a registered type '{value.FullName}' for tag '{tag}'", "tag"); } tagMappings.Add(tag, type); return this; } public StaticDeserializerBuilder WithTypeMapping<TInterface, TConcrete>() where TConcrete : TInterface { Type typeFromHandle = typeof(TInterface); Type typeFromHandle2 = typeof(TConcrete); if (!typeFromHandle.IsAssignableFrom(typeFromHandle2)) { throw new InvalidOperationException($"The type '{typeFromHandle2.Name}' does not implement interface '{typeFromHandle.Name}'."); } typeMappings[typeFromHandle] = typeFromHandle2; return this; } public StaticDeserializerBuilder WithoutTagMapping(TagName tag) { if (tag.IsEmpty) { throw new ArgumentException("Non-specific tags cannot be maped"); } if (!tagMappings.Remove(tag)) { throw new KeyNotFoundException($"Tag '{tag}' is not registered"); } return this; } public StaticDeserializerBuilder IgnoreUnmatchedProperties() { ignoreUnmatched = true; return this; } public StaticDeserializerBuilder WithDuplicateKeyChecking() { duplicateKeyChecking = true; return this; } public IDeserializer Build() { return Deserializer.FromValueDeserializer(BuildValueDeserializer()); } public IValueDeserializer BuildValueDeserializer() { return new AliasValueDeserializer(new NodeValueDeserializer(nodeDeserializerFactories.BuildComponentList(), nodeTypeResolverFactories.BuildComponentList(), typeConverter, enumNamingConvention, BuildTypeInspector())); } } public sealed class StaticSerializerBuilder : StaticBuilderSkeleton<StaticSerializerBuilder> { private class ValueSerializer : IValueSerializer { private readonly IObjectGraphTraversalStrategy traversalStrategy; private readonly IEventEmitter eventEmitter; private readonly IEnumerable<IYamlTypeConverter> typeConverters; private readonly LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories; private readonly LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories; public ValueSerializer(IObjectGraphTraversalStrategy traversalStrategy, IEventEmitter eventEmitter, IEnumerable<IYamlTypeConverter> typeConverters, LazyComponentRegistrationList<IEnumerable<IYamlTypeConverter>, IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitorFactories, LazyComponentRegistrationList<EmissionPhaseObjectGraphVisitorArgs, IObjectGraphVisitor<IEmitter>> emissionPhaseObjectGraphVisitorFactories) { this.traversalStrategy = traversalStrategy; this.eventEmitter = eventEmitter; this.typeConverters = typeConverters; this.preProcessingPhaseObjectGraphVisitorFactories = preProcessingPhaseObjectGraphVisitorFactories; this.emissionPhaseObjectGraphVisitorFactories = emissionPhaseObjectGraphVisitorFactories; } public void SerializeValue(IEmitter emitter, object? value, Type? type) { IEmitter emitter2 = emitter; Type type2 = type ?? ((value != null) ? value.GetType() : typeof(object)); Type staticType = type ?? typeof(object); ObjectDescriptor graph = new ObjectDescriptor(value, type2, staticType); List<IObjectGraphVisitor<Nothing>> preProcessingPhaseObjectGraphVisitors = preProcessingPhaseObjectGraphVisitorFactories.BuildComponentList(typeConverters); foreach (IObjectGraphVisitor<Nothing> item in preProcessingPhaseObjectGraphVisitors) { traversalStrategy.Traverse(graph, item, default(Nothing), NestedObjectSerializer); } IObjectGraphVisitor<IEmitter> visitor = emissionPhaseObjectGraphVisitorFactories.B