public static void SimplifyLib(string assemblyName, string outputPath)
        {
            var         simplify      = new Simplify();
            ModuleDefMD mod           = ModuleDefMD.Load(Path.Combine(Program.ManagedDir, assemblyName));
            var         structRef     = new TypeRefUser(mod, "System", "ValueType", mod.CorLibTypes.AssemblyRef);
            var         exceptionRef  = new TypeRefUser(mod, "System", "NotImplementedException", mod.CorLibTypes.AssemblyRef);
            var         exceptionCtor = new MemberRefUser(mod, ".ctor",
                                                          MethodSig.CreateInstance(exceptionRef.ToTypeSig()),
                                                          exceptionRef);

            simplify.NotImplementedBody = new List <Instruction>()
            {
                OpCodes.Nop.ToInstruction(),
                    OpCodes.Newobj.ToInstruction(exceptionCtor),
                OpCodes.Throw.ToInstruction()
            };
            Console.WriteLine($"Simplifying {assemblyName}");
            var AttributeBlackList = new HashSet <string>()
            {
                "System.Runtime.CompilerServices.AsyncStateMachineAttribute",
                "System.Diagnostics.DebuggerHiddenAttribute",
                "System.Security.SecurityCriticalAttribute"
            };
            var MethodWhiteList = new HashSet <string>()
            {
                "System.Void QuickGraph.SUndirectedTaggedEdge`2::add_TagChanged(System.EventHandler)",
                "System.Void QuickGraph.SUndirectedTaggedEdge`2::remove_TagChanged(System.EventHandler)",
                "System.Void QuickGraph.STaggedEquatableEdge`2::add_TagChanged(System.EventHandler)",
                "System.Void QuickGraph.STaggedEquatableEdge`2::remove_TagChanged(System.EventHandler)",
                "System.Void QuickGraph.STaggedEdge`2::add_TagChanged(System.EventHandler)",
                "System.Void QuickGraph.STaggedEdge`2::remove_TagChanged(System.EventHandler)",
                "System.Void Steamworks.CallResult`1::add_m_Func(Steamworks.CallResult`1/APIDispatchDelegate<T>)",
                "System.Void Steamworks.CallResult`1::remove_m_Func(Steamworks.CallResult`1/APIDispatchDelegate<T>)",
                "Kingmaker.Utility.Feet Kingmaker.Utility.FeetExtension::Feet(System.Int32)",
                "Kingmaker.UnitLogic.Mechanics.ContextValue Kingmaker.UnitLogic.Mechanics.ContextValue::op_Implicit(System.Int32)",
                "System.Boolean Kingmaker.UnitLogic.Customization.UnitCustomizationVariation::Equals(Kingmaker.UnitLogic.Customization.UnitCustomizationVariation)",
                "System.Boolean Kingmaker.UnitLogic.Customization.UnitCustomizationVariation::Equals(System.Object)",
            };
            var PropertyWhiteList = new HashSet <string>()
            {
                "System.String UnityEngine.CreateAssetMenuAttribute::menuName()",
                "System.String UnityEngine.CreateAssetMenuAttribute::ileName()",
                "System.Int32 UnityEngine.CreateAssetMenuAttribute::order()",
                "System.String UnityEngine.Bindings.NativeTypeAttribute::Header()",
                "Kingmaker.Blueprints.BlueprintComponent Kingmaker.Blueprints.BlueprintScriptableObject::ComponentsArray()",
                "UnityEngine.Color UnityEngine.Color::red()",
                "UnityEngine.Color UnityEngine.Color::green()",
                "UnityEngine.Color UnityEngine.Color::blue()",
                "UnityEngine.Color UnityEngine.Color::white()",
                "UnityEngine.Color UnityEngine.Color::black()",
                "UnityEngine.Color UnityEngine.Color::yellow()",
                "UnityEngine.Color UnityEngine.Color::cyan()",
                "UnityEngine.Color UnityEngine.Color::magenta()",
                "UnityEngine.Color UnityEngine.Color::gray()",
                "UnityEngine.Color UnityEngine.Color::grey()",
                "UnityEngine.Color UnityEngine.Color::clear()",
                "UnityEngine.Vector3 UnityEngine.Vector3::zero()",
                "UnityEngine.Vector3 UnityEngine.Vector3::one()",
                "UnityEngine.Vector3 UnityEngine.Vector3::up()",
                "UnityEngine.Vector3 UnityEngine.Vector3::down()",
                "UnityEngine.Vector3 UnityEngine.Vector3::left()",
                "UnityEngine.Vector3 UnityEngine.Vector3::right()",
                "UnityEngine.Vector3 UnityEngine.Vector3::forward()",
                "UnityEngine.Vector3 UnityEngine.Vector3::back()",
                "UnityEngine.Vector3 UnityEngine.Vector3::positiveInfinity()",
                "UnityEngine.Vector3 UnityEngine.Vector3::negativeInfinity()",
            };

            RemoveInterfaceProperties(mod);
            foreach (var type in mod.GetTypes())
            {
                foreach (var property in type.Properties.ToArray())
                {
                    /*
                     * Properties must be changed or preserved in unison
                     * removing a getter body while keeping the setter body causes the
                     * setter to become recursive
                     * PropertyName {
                     *  getter { throw new NotImplementedException() }
                     *  setter { PropertyName = value }
                     * }
                     * TODO: Look at replacing properties with default implemtation
                     * PropertyName { get; set; }
                     */
                    if (PropertyWhiteList.Contains(property.FullName))
                    {
                        continue;
                    }
                    var  getter        = property.GetMethod;
                    var  setter        = property.SetMethod;
                    bool canSkipGetter = getter == null || !getter.HasBody || getter.Body.Instructions.Count <= 3;
                    bool canSkipSetter = getter == null || !getter.HasBody || getter.Body.Instructions.Count <= 4;
                    if (canSkipGetter && canSkipSetter)
                    {
                        continue;
                    }
                    if (getter != null && getter.HasBody)
                    {
                        simplify.ClearMethod(getter);
                    }
                    if (setter != null && setter.HasBody)
                    {
                        simplify.ClearMethod(setter);
                    }
                }
                foreach (var method in type.Methods.ToArray())
                {
                    if (method.IsGetter || method.IsSetter)
                    {
                        continue;
                    }
                    if (MethodWhiteList.Contains(method.FullName))
                    {
                        continue;
                    }
                    foreach (var att in method.CustomAttributes.ToArray())
                    {
                        if (AttributeBlackList.Contains(att.TypeFullName))
                        {
                            method.CustomAttributes.Remove(att);
                        }
                    }
                    simplify.ClearMethod(method);
                }
            }
            simplify.ManualFixes(mod);
            mod.Write(Path.Combine(Program.ManagedDir, outputPath));
        }