public static void UpdateHierarchy(Fabric.Component component = null)
    {
        GameObject gameObject        = null;
        List <Fabric.Component> list = null;

        if (component == null && Instance != null)
        {
            gameObject = Instance.gameObject;
            list       = Instance._components;
        }
        else if (component != null)
        {
            gameObject = component.gameObject;
            list       = component.Components;
        }
        if (gameObject == null || list == null)
        {
            return;
        }
        for (int i = 0; i < gameObject.transform.childCount; i++)
        {
            Fabric.Component component2 = gameObject.transform.GetChild(i).GetComponent <Fabric.Component>();
            if (!(component2 != null) || component2.IsInstance)
            {
                continue;
            }
            GroupComponent groupComponent = component2 as GroupComponent;
            if (groupComponent != null && groupComponent._isRegisteredWithMainHierarchy)
            {
                groupComponent.UnregisterWithMainHierarchy();
            }
            bool flag = false;
            for (int j = 0; j < list.Count; j++)
            {
                if (list[j] == component2)
                {
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                list.Add(component2);
                if (component != null)
                {
                    component.UpdateComponentsArray();
                }
                if (component2.ParentComponent != null)
                {
                    component2.ParentComponent.Initialise(component, isComponentInstance: false);
                }
                else
                {
                    component2.Initialise(component, isComponentInstance: false);
                }
                Instance.RefreshComponents();
            }
            else
            {
                UpdateHierarchy(component2);
            }
        }
        for (int k = 0; k < list.Count; k++)
        {
            bool flag2 = false;
            for (int l = 0; l < gameObject.transform.childCount; l++)
            {
                Fabric.Component    component3 = gameObject.transform.GetChild(l).GetComponent <Fabric.Component>();
                GroupComponentProxy component4 = gameObject.transform.GetChild(l).GetComponent <GroupComponentProxy>();
                if (component3 == list[k] || (component4 != null && component4._groupComponent == list[k]))
                {
                    flag2 = true;
                    break;
                }
            }
            if (!flag2)
            {
                Fabric.Component component5      = list[k];
                GroupComponent   groupComponent2 = component5 as GroupComponent;
                list.Remove(component5);
                if (component != null)
                {
                    component.UpdateComponentsArray();
                }
                if (component5.ParentComponent != null)
                {
                    component5.ParentComponent.Initialise(component, isComponentInstance: false);
                }
                if (groupComponent2 != null)
                {
                    groupComponent2.RegisterWithMainHierarchy();
                }
                Instance.RefreshComponents();
            }
        }
    }