@Override
    public <N extends Node> List<NodeEntry<UUID, N>> searchUserNodes(ConstraintNodeMatcher<N> constraint) throws Exception {
        List<NodeEntry<UUID, N>> held = new ArrayList<>();
        this.users.apply(false, true, root -> {
            for (Map.Entry<Object, ? extends ConfigurationNode> entry : root.getChildrenMap().entrySet()) {
                try {
                    UUID holder = UUID.fromString(entry.getKey().toString());
                    ConfigurationNode object = entry.getValue();

                    Set<Node> nodes = readNodes(object);
                    for (Node e : nodes) {
                        N match = constraint.match(e);
                        if (match != null) {
                            held.add(NodeEntry.of(holder, match));
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        return held;
    }
Flat-file storage using Configurate {@link ConfigurationNode}s.
The data for users/groups/tracks is stored in a single shared file.
common/src/main/java/me/lucko/luckperms/common/storage/implementation/file/CombinedConfigurateStorage.java