private static void StoreHierarchyData(Scene targetScene, ref HashSet <GameObject> alreadySelectedGameObjects)
        {
            if (EditorApplication.isPlayingOrWillChangePlaymode)
            {
                return;
            }

            if (!SceneKeeperTools.IsHierarchyKeeperActive())
            {
                return;
            }

            int[] expandedItemIDs = UnityHierarchyTools.GetExpandedItems();

            HierarchyData data = SceneData.GetOrAddSceneData(targetScene.path);

            data.itemsPath.Clear();

            for (int i = 0; i < expandedItemIDs.Length; i++)
            {
                int    instanceID = expandedItemIDs[i];
                Object targetObj  = EditorUtility.InstanceIDToObject(instanceID);

                if (targetObj == null)
                {
                    continue;
                }

                if (targetObj.hideFlags.HasFlag(HideFlags.HideInHierarchy) ||
                    targetObj.hideFlags.HasFlag(HideFlags.NotEditable) ||
                    targetObj.hideFlags.HasFlag(HideFlags.HideAndDontSave))
                {
                    continue;
                }

                if (targetObj is GameObject gameObject)
                {
                    if (alreadySelectedGameObjects.Contains(gameObject))
                    {
                        continue;
                    }

                    string scenePath = gameObject.scene.path;

                    if (!string.Equals(targetScene.path, scenePath, StringComparison.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    data.itemsPath.Add(gameObject.transform.GetPath());
                }
            }
        }
        private static void RestoreHierarchyData(Scene scene, ref HashSet <string> alreadySelectedGameObjectPaths)
        {
            if (!SceneKeeperTools.IsHierarchyKeeperActive())
            {
                return;
            }

            for (int i = 0; i < SceneData.alwaysExpanded.Count; i++)
            {
                string alwaysExpandedItemPath = SceneData.alwaysExpanded[i];
                if (TryToFindInAllOpenScenes(alwaysExpandedItemPath, out GameObject targetGameObject))
                {
                    alreadySelectedGameObjectPaths.Add(alwaysExpandedItemPath);
                    UnityHierarchyTools.SetExpanded(targetGameObject.GetInstanceID(), true);
                }
            }

            if (!SceneData.TryGetSceneData(scene.path, out HierarchyData sceneHierarchyData))
            {
                return;
            }

            UnityHierarchyTools.SetExpanded(scene.handle, true);

            for (int i = 0; i < sceneHierarchyData.itemsPath.Count; i++)
            {
                string expandedItemPath = sceneHierarchyData.itemsPath[i];

                if (alreadySelectedGameObjectPaths.Contains(expandedItemPath))
                {
                    continue;
                }

                if (!TryToFindBySceneRootObjects(scene, expandedItemPath, out GameObject gameObjectAtPath))
                {
                    continue;
                }

                UnityHierarchyTools.SetExpanded(gameObjectAtPath.GetInstanceID(), true);
            }
        }