/*
 *
 *    Copyright (c) 2022 Project CHIP Authors
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

// THIS FILE IS GENERATED BY ZAP

package chip.devicecontroller;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javax.annotation.Nullable;

public class ChipClusters {

  public interface DefaultClusterCallback {
    void onSuccess();

    void onError(Exception error);
  }

  public interface CharStringAttributeCallback {
    /** Indicates a successful read for a CHAR_STRING attribute. */
    void onSuccess(String value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface OctetStringAttributeCallback {
    /** Indicates a successful read for an OCTET_STRING attribute. */
    void onSuccess(byte[] value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface IntegerAttributeCallback {
    void onSuccess(int value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface LongAttributeCallback {
    void onSuccess(long value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface BooleanAttributeCallback {
    void onSuccess(boolean value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface FloatAttributeCallback {
    void onSuccess(float value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public interface DoubleAttributeCallback {
    void onSuccess(double value);

    void onError(Exception error);

    default void onSubscriptionEstablished() {}
  }

  public abstract static class BaseChipCluster {
    protected long chipClusterPtr;

    public BaseChipCluster(long devicePtr, int endpointId) {
      chipClusterPtr = initWithDevice(devicePtr, endpointId);
    }

    /**
     * Sets the timeout, in milliseconds, after which commands sent through this cluster will fail
     * with a timeout (regardless of whether or not a response has been received). If set to an
     * empty optional, the default timeout will be used.
     */
    public void setCommandTimeout(Optional<Long> timeoutMillis) {
      setCommandTimeout(chipClusterPtr, timeoutMillis);
    }

    private native void setCommandTimeout(long clusterPtr, Optional<Long> timeoutMillis);

    /** Returns the current timeout (in milliseconds) for commands sent through this cluster. */
    public Optional<Long> getCommandTimeout() {
      Optional<Long> timeout = getCommandTimeout(chipClusterPtr);
      return timeout == null ? Optional.empty() : timeout;
    }

    private native Optional<Long> getCommandTimeout(long clusterPtr);

    public abstract long initWithDevice(long devicePtr, int endpointId);

    public native void deleteCluster(long chipClusterPtr);

    @SuppressWarnings("deprecation")
    protected void finalize() throws Throwable {
      super.finalize();

      if (chipClusterPtr != 0) {
        deleteCluster(chipClusterPtr);
        chipClusterPtr = 0;
      }
    }
  }

  public static class IdentifyCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 3L;

    public IdentifyCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void identify(DefaultClusterCallback callback, Integer identifyTime) {
      identify(chipClusterPtr, callback, identifyTime, null);
    }

    public void identify(
        DefaultClusterCallback callback, Integer identifyTime, int timedInvokeTimeoutMs) {
      identify(chipClusterPtr, callback, identifyTime, timedInvokeTimeoutMs);
    }

    public void triggerEffect(
        DefaultClusterCallback callback, Integer effectIdentifier, Integer effectVariant) {
      triggerEffect(chipClusterPtr, callback, effectIdentifier, effectVariant, null);
    }

    public void triggerEffect(
        DefaultClusterCallback callback,
        Integer effectIdentifier,
        Integer effectVariant,
        int timedInvokeTimeoutMs) {
      triggerEffect(
          chipClusterPtr, callback, effectIdentifier, effectVariant, timedInvokeTimeoutMs);
    }

    private native void identify(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer identifyTime,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void triggerEffect(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer effectIdentifier,
        Integer effectVariant,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readIdentifyTimeAttribute(IntegerAttributeCallback callback) {
      readIdentifyTimeAttribute(chipClusterPtr, callback);
    }

    public void writeIdentifyTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeIdentifyTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeIdentifyTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeIdentifyTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeIdentifyTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeIdentifyTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readIdentifyTypeAttribute(IntegerAttributeCallback callback) {
      readIdentifyTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeIdentifyTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeIdentifyTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readIdentifyTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeIdentifyTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeIdentifyTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readIdentifyTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeIdentifyTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class GroupsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 4L;

    public GroupsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void addGroup(AddGroupResponseCallback callback, Integer groupID, String groupName) {
      addGroup(chipClusterPtr, callback, groupID, groupName, null);
    }

    public void addGroup(
        AddGroupResponseCallback callback,
        Integer groupID,
        String groupName,
        int timedInvokeTimeoutMs) {
      addGroup(chipClusterPtr, callback, groupID, groupName, timedInvokeTimeoutMs);
    }

    public void viewGroup(ViewGroupResponseCallback callback, Integer groupID) {
      viewGroup(chipClusterPtr, callback, groupID, null);
    }

    public void viewGroup(
        ViewGroupResponseCallback callback, Integer groupID, int timedInvokeTimeoutMs) {
      viewGroup(chipClusterPtr, callback, groupID, timedInvokeTimeoutMs);
    }

    public void getGroupMembership(
        GetGroupMembershipResponseCallback callback, ArrayList<Integer> groupList) {
      getGroupMembership(chipClusterPtr, callback, groupList, null);
    }

    public void getGroupMembership(
        GetGroupMembershipResponseCallback callback,
        ArrayList<Integer> groupList,
        int timedInvokeTimeoutMs) {
      getGroupMembership(chipClusterPtr, callback, groupList, timedInvokeTimeoutMs);
    }

    public void removeGroup(RemoveGroupResponseCallback callback, Integer groupID) {
      removeGroup(chipClusterPtr, callback, groupID, null);
    }

    public void removeGroup(
        RemoveGroupResponseCallback callback, Integer groupID, int timedInvokeTimeoutMs) {
      removeGroup(chipClusterPtr, callback, groupID, timedInvokeTimeoutMs);
    }

    public void removeAllGroups(DefaultClusterCallback callback) {
      removeAllGroups(chipClusterPtr, callback, null);
    }

    public void removeAllGroups(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      removeAllGroups(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void addGroupIfIdentifying(
        DefaultClusterCallback callback, Integer groupID, String groupName) {
      addGroupIfIdentifying(chipClusterPtr, callback, groupID, groupName, null);
    }

    public void addGroupIfIdentifying(
        DefaultClusterCallback callback,
        Integer groupID,
        String groupName,
        int timedInvokeTimeoutMs) {
      addGroupIfIdentifying(chipClusterPtr, callback, groupID, groupName, timedInvokeTimeoutMs);
    }

    private native void addGroup(
        long chipClusterPtr,
        AddGroupResponseCallback Callback,
        Integer groupID,
        String groupName,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void viewGroup(
        long chipClusterPtr,
        ViewGroupResponseCallback Callback,
        Integer groupID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getGroupMembership(
        long chipClusterPtr,
        GetGroupMembershipResponseCallback Callback,
        ArrayList<Integer> groupList,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeGroup(
        long chipClusterPtr,
        RemoveGroupResponseCallback Callback,
        Integer groupID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeAllGroups(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addGroupIfIdentifying(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer groupID,
        String groupName,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface AddGroupResponseCallback {
      void onSuccess(Integer status, Integer groupID);

      void onError(Exception error);
    }

    public interface ViewGroupResponseCallback {
      void onSuccess(Integer status, Integer groupID, String groupName);

      void onError(Exception error);
    }

    public interface GetGroupMembershipResponseCallback {
      void onSuccess(@Nullable Integer capacity, ArrayList<Integer> groupList);

      void onError(Exception error);
    }

    public interface RemoveGroupResponseCallback {
      void onSuccess(Integer status, Integer groupID);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readNameSupportAttribute(IntegerAttributeCallback callback) {
      readNameSupportAttribute(chipClusterPtr, callback);
    }

    public void subscribeNameSupportAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNameSupportAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readNameSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNameSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ScenesCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 5L;

    public ScenesCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void addScene(
        AddSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        Integer transitionTime,
        String sceneName,
        ArrayList<ChipStructs.ScenesClusterExtensionFieldSet> extensionFieldSets) {
      addScene(
          chipClusterPtr,
          callback,
          groupId,
          sceneId,
          transitionTime,
          sceneName,
          extensionFieldSets,
          null);
    }

    public void addScene(
        AddSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        Integer transitionTime,
        String sceneName,
        ArrayList<ChipStructs.ScenesClusterExtensionFieldSet> extensionFieldSets,
        int timedInvokeTimeoutMs) {
      addScene(
          chipClusterPtr,
          callback,
          groupId,
          sceneId,
          transitionTime,
          sceneName,
          extensionFieldSets,
          timedInvokeTimeoutMs);
    }

    public void viewScene(ViewSceneResponseCallback callback, Integer groupId, Integer sceneId) {
      viewScene(chipClusterPtr, callback, groupId, sceneId, null);
    }

    public void viewScene(
        ViewSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        int timedInvokeTimeoutMs) {
      viewScene(chipClusterPtr, callback, groupId, sceneId, timedInvokeTimeoutMs);
    }

    public void removeScene(
        RemoveSceneResponseCallback callback, Integer groupId, Integer sceneId) {
      removeScene(chipClusterPtr, callback, groupId, sceneId, null);
    }

    public void removeScene(
        RemoveSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        int timedInvokeTimeoutMs) {
      removeScene(chipClusterPtr, callback, groupId, sceneId, timedInvokeTimeoutMs);
    }

    public void removeAllScenes(RemoveAllScenesResponseCallback callback, Integer groupId) {
      removeAllScenes(chipClusterPtr, callback, groupId, null);
    }

    public void removeAllScenes(
        RemoveAllScenesResponseCallback callback, Integer groupId, int timedInvokeTimeoutMs) {
      removeAllScenes(chipClusterPtr, callback, groupId, timedInvokeTimeoutMs);
    }

    public void storeScene(StoreSceneResponseCallback callback, Integer groupId, Integer sceneId) {
      storeScene(chipClusterPtr, callback, groupId, sceneId, null);
    }

    public void storeScene(
        StoreSceneResponseCallback callback,
        Integer groupId,
        Integer sceneId,
        int timedInvokeTimeoutMs) {
      storeScene(chipClusterPtr, callback, groupId, sceneId, timedInvokeTimeoutMs);
    }

    public void recallScene(
        DefaultClusterCallback callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Optional<Integer> transitionTime) {
      recallScene(chipClusterPtr, callback, groupId, sceneId, transitionTime, null);
    }

    public void recallScene(
        DefaultClusterCallback callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Optional<Integer> transitionTime,
        int timedInvokeTimeoutMs) {
      recallScene(chipClusterPtr, callback, groupId, sceneId, transitionTime, timedInvokeTimeoutMs);
    }

    public void getSceneMembership(GetSceneMembershipResponseCallback callback, Integer groupId) {
      getSceneMembership(chipClusterPtr, callback, groupId, null);
    }

    public void getSceneMembership(
        GetSceneMembershipResponseCallback callback, Integer groupId, int timedInvokeTimeoutMs) {
      getSceneMembership(chipClusterPtr, callback, groupId, timedInvokeTimeoutMs);
    }

    private native void addScene(
        long chipClusterPtr,
        AddSceneResponseCallback Callback,
        Integer groupId,
        Integer sceneId,
        Integer transitionTime,
        String sceneName,
        ArrayList<ChipStructs.ScenesClusterExtensionFieldSet> extensionFieldSets,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void viewScene(
        long chipClusterPtr,
        ViewSceneResponseCallback Callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeScene(
        long chipClusterPtr,
        RemoveSceneResponseCallback Callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeAllScenes(
        long chipClusterPtr,
        RemoveAllScenesResponseCallback Callback,
        Integer groupId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void storeScene(
        long chipClusterPtr,
        StoreSceneResponseCallback Callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void recallScene(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer groupId,
        Integer sceneId,
        @Nullable Optional<Integer> transitionTime,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getSceneMembership(
        long chipClusterPtr,
        GetSceneMembershipResponseCallback Callback,
        Integer groupId,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface AddSceneResponseCallback {
      void onSuccess(Integer status, Integer groupId, Integer sceneId);

      void onError(Exception error);
    }

    public interface ViewSceneResponseCallback {
      void onSuccess(
          Integer status,
          Integer groupId,
          Integer sceneId,
          Optional<Integer> transitionTime,
          Optional<String> sceneName,
          Optional<ArrayList<ChipStructs.ScenesClusterExtensionFieldSet>> extensionFieldSets);

      void onError(Exception error);
    }

    public interface RemoveSceneResponseCallback {
      void onSuccess(Integer status, Integer groupId, Integer sceneId);

      void onError(Exception error);
    }

    public interface RemoveAllScenesResponseCallback {
      void onSuccess(Integer status, Integer groupId);

      void onError(Exception error);
    }

    public interface StoreSceneResponseCallback {
      void onSuccess(Integer status, Integer groupId, Integer sceneId);

      void onError(Exception error);
    }

    public interface GetSceneMembershipResponseCallback {
      void onSuccess(
          Integer status,
          @Nullable Integer capacity,
          Integer groupId,
          Optional<ArrayList<Integer>> sceneList);

      void onError(Exception error);
    }

    public interface CurrentGroupAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readSceneCountAttribute(IntegerAttributeCallback callback) {
      readSceneCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeSceneCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSceneCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentSceneAttribute(IntegerAttributeCallback callback) {
      readCurrentSceneAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentSceneAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentSceneAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentGroupAttribute(CurrentGroupAttributeCallback callback) {
      readCurrentGroupAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentGroupAttribute(
        CurrentGroupAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentGroupAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSceneValidAttribute(BooleanAttributeCallback callback) {
      readSceneValidAttribute(chipClusterPtr, callback);
    }

    public void subscribeSceneValidAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSceneValidAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNameSupportAttribute(IntegerAttributeCallback callback) {
      readNameSupportAttribute(chipClusterPtr, callback);
    }

    public void subscribeNameSupportAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNameSupportAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readSceneCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSceneCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentSceneAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentSceneAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentGroupAttribute(
        long chipClusterPtr, CurrentGroupAttributeCallback callback);

    private native void subscribeCurrentGroupAttribute(
        long chipClusterPtr,
        CurrentGroupAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSceneValidAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeSceneValidAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNameSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNameSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OnOffCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 6L;

    public OnOffCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void off(DefaultClusterCallback callback) {
      off(chipClusterPtr, callback, null);
    }

    public void off(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      off(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void on(DefaultClusterCallback callback) {
      on(chipClusterPtr, callback, null);
    }

    public void on(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      on(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void toggle(DefaultClusterCallback callback) {
      toggle(chipClusterPtr, callback, null);
    }

    public void toggle(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      toggle(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void offWithEffect(
        DefaultClusterCallback callback, Integer effectIdentifier, Integer effectVariant) {
      offWithEffect(chipClusterPtr, callback, effectIdentifier, effectVariant, null);
    }

    public void offWithEffect(
        DefaultClusterCallback callback,
        Integer effectIdentifier,
        Integer effectVariant,
        int timedInvokeTimeoutMs) {
      offWithEffect(
          chipClusterPtr, callback, effectIdentifier, effectVariant, timedInvokeTimeoutMs);
    }

    public void onWithRecallGlobalScene(DefaultClusterCallback callback) {
      onWithRecallGlobalScene(chipClusterPtr, callback, null);
    }

    public void onWithRecallGlobalScene(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      onWithRecallGlobalScene(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void onWithTimedOff(
        DefaultClusterCallback callback,
        Integer onOffControl,
        Integer onTime,
        Integer offWaitTime) {
      onWithTimedOff(chipClusterPtr, callback, onOffControl, onTime, offWaitTime, null);
    }

    public void onWithTimedOff(
        DefaultClusterCallback callback,
        Integer onOffControl,
        Integer onTime,
        Integer offWaitTime,
        int timedInvokeTimeoutMs) {
      onWithTimedOff(
          chipClusterPtr, callback, onOffControl, onTime, offWaitTime, timedInvokeTimeoutMs);
    }

    private native void off(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void on(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void toggle(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void offWithEffect(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer effectIdentifier,
        Integer effectVariant,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void onWithRecallGlobalScene(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void onWithTimedOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer onOffControl,
        Integer onTime,
        Integer offWaitTime,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface StartUpOnOffAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readOnOffAttribute(BooleanAttributeCallback callback) {
      readOnOffAttribute(chipClusterPtr, callback);
    }

    public void subscribeOnOffAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnOffAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGlobalSceneControlAttribute(BooleanAttributeCallback callback) {
      readGlobalSceneControlAttribute(chipClusterPtr, callback);
    }

    public void subscribeGlobalSceneControlAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGlobalSceneControlAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnTimeAttribute(IntegerAttributeCallback callback) {
      readOnTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOnTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOffWaitTimeAttribute(IntegerAttributeCallback callback) {
      readOffWaitTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOffWaitTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOffWaitTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOffWaitTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOffWaitTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOffWaitTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOffWaitTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartUpOnOffAttribute(StartUpOnOffAttributeCallback callback) {
      readStartUpOnOffAttribute(chipClusterPtr, callback);
    }

    public void writeStartUpOnOffAttribute(DefaultClusterCallback callback, Integer value) {
      writeStartUpOnOffAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeStartUpOnOffAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeStartUpOnOffAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeStartUpOnOffAttribute(
        StartUpOnOffAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartUpOnOffAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readOnOffAttribute(long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeOnOffAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGlobalSceneControlAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeGlobalSceneControlAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOnTimeAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOnTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOffWaitTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOffWaitTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOffWaitTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartUpOnOffAttribute(
        long chipClusterPtr, StartUpOnOffAttributeCallback callback);

    private native void writeStartUpOnOffAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeStartUpOnOffAttribute(
        long chipClusterPtr,
        StartUpOnOffAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OnOffSwitchConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 7L;

    public OnOffSwitchConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readSwitchTypeAttribute(IntegerAttributeCallback callback) {
      readSwitchTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeSwitchTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSwitchTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSwitchActionsAttribute(IntegerAttributeCallback callback) {
      readSwitchActionsAttribute(chipClusterPtr, callback);
    }

    public void writeSwitchActionsAttribute(DefaultClusterCallback callback, Integer value) {
      writeSwitchActionsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSwitchActionsAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeSwitchActionsAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSwitchActionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSwitchActionsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readSwitchTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSwitchTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSwitchActionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeSwitchActionsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSwitchActionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class LevelControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 8L;

    public LevelControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void moveToLevel(
        DefaultClusterCallback callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToLevel(
          chipClusterPtr, callback, level, transitionTime, optionsMask, optionsOverride, null);
    }

    public void moveToLevel(
        DefaultClusterCallback callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToLevel(
          chipClusterPtr,
          callback,
          level,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void move(
        DefaultClusterCallback callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      move(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void move(
        DefaultClusterCallback callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      move(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void step(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      step(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void step(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      step(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stop(
        DefaultClusterCallback callback, Integer optionsMask, Integer optionsOverride) {
      stop(chipClusterPtr, callback, optionsMask, optionsOverride, null);
    }

    public void stop(
        DefaultClusterCallback callback,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stop(chipClusterPtr, callback, optionsMask, optionsOverride, timedInvokeTimeoutMs);
    }

    public void moveToLevelWithOnOff(
        DefaultClusterCallback callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToLevelWithOnOff(
          chipClusterPtr, callback, level, transitionTime, optionsMask, optionsOverride, null);
    }

    public void moveToLevelWithOnOff(
        DefaultClusterCallback callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToLevelWithOnOff(
          chipClusterPtr,
          callback,
          level,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveWithOnOff(
        DefaultClusterCallback callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      moveWithOnOff(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void moveWithOnOff(
        DefaultClusterCallback callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveWithOnOff(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepWithOnOff(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      stepWithOnOff(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepWithOnOff(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepWithOnOff(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stopWithOnOff(
        DefaultClusterCallback callback, Integer optionsMask, Integer optionsOverride) {
      stopWithOnOff(chipClusterPtr, callback, optionsMask, optionsOverride, null);
    }

    public void stopWithOnOff(
        DefaultClusterCallback callback,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stopWithOnOff(chipClusterPtr, callback, optionsMask, optionsOverride, timedInvokeTimeoutMs);
    }

    private native void moveToLevel(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void move(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void step(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stop(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToLevelWithOnOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer level,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveWithOnOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        @Nullable Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepWithOnOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        @Nullable Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopWithOnOff(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface CurrentLevelAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OnLevelAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OnTransitionTimeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OffTransitionTimeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DefaultMoveRateAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface StartUpCurrentLevelAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readCurrentLevelAttribute(CurrentLevelAttributeCallback callback) {
      readCurrentLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentLevelAttribute(
        CurrentLevelAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRemainingTimeAttribute(IntegerAttributeCallback callback) {
      readRemainingTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeRemainingTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRemainingTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinLevelAttribute(IntegerAttributeCallback callback) {
      readMinLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxLevelAttribute(IntegerAttributeCallback callback) {
      readMaxLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentFrequencyAttribute(IntegerAttributeCallback callback) {
      readCurrentFrequencyAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentFrequencyAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentFrequencyAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinFrequencyAttribute(IntegerAttributeCallback callback) {
      readMinFrequencyAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinFrequencyAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinFrequencyAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxFrequencyAttribute(IntegerAttributeCallback callback) {
      readMaxFrequencyAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxFrequencyAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxFrequencyAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOptionsAttribute(IntegerAttributeCallback callback) {
      readOptionsAttribute(chipClusterPtr, callback);
    }

    public void writeOptionsAttribute(DefaultClusterCallback callback, Integer value) {
      writeOptionsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOptionsAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOptionsAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOptionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOptionsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnOffTransitionTimeAttribute(IntegerAttributeCallback callback) {
      readOnOffTransitionTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOnOffTransitionTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnOffTransitionTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnOffTransitionTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnOffTransitionTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnOffTransitionTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnOffTransitionTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnLevelAttribute(OnLevelAttributeCallback callback) {
      readOnLevelAttribute(chipClusterPtr, callback);
    }

    public void writeOnLevelAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnLevelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnLevelAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnLevelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnLevelAttribute(
        OnLevelAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnTransitionTimeAttribute(OnTransitionTimeAttributeCallback callback) {
      readOnTransitionTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOnTransitionTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnTransitionTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnTransitionTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnTransitionTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnTransitionTimeAttribute(
        OnTransitionTimeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnTransitionTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOffTransitionTimeAttribute(OffTransitionTimeAttributeCallback callback) {
      readOffTransitionTimeAttribute(chipClusterPtr, callback);
    }

    public void writeOffTransitionTimeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOffTransitionTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOffTransitionTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOffTransitionTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOffTransitionTimeAttribute(
        OffTransitionTimeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOffTransitionTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDefaultMoveRateAttribute(DefaultMoveRateAttributeCallback callback) {
      readDefaultMoveRateAttribute(chipClusterPtr, callback);
    }

    public void writeDefaultMoveRateAttribute(DefaultClusterCallback callback, Integer value) {
      writeDefaultMoveRateAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeDefaultMoveRateAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeDefaultMoveRateAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeDefaultMoveRateAttribute(
        DefaultMoveRateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDefaultMoveRateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartUpCurrentLevelAttribute(StartUpCurrentLevelAttributeCallback callback) {
      readStartUpCurrentLevelAttribute(chipClusterPtr, callback);
    }

    public void writeStartUpCurrentLevelAttribute(DefaultClusterCallback callback, Integer value) {
      writeStartUpCurrentLevelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeStartUpCurrentLevelAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeStartUpCurrentLevelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeStartUpCurrentLevelAttribute(
        StartUpCurrentLevelAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartUpCurrentLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readCurrentLevelAttribute(
        long chipClusterPtr, CurrentLevelAttributeCallback callback);

    private native void subscribeCurrentLevelAttribute(
        long chipClusterPtr,
        CurrentLevelAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readRemainingTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRemainingTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMinFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxFrequencyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOptionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOptionsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOptionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOnOffTransitionTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOnOffTransitionTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnOffTransitionTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOnLevelAttribute(
        long chipClusterPtr, OnLevelAttributeCallback callback);

    private native void writeOnLevelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnLevelAttribute(
        long chipClusterPtr, OnLevelAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOnTransitionTimeAttribute(
        long chipClusterPtr, OnTransitionTimeAttributeCallback callback);

    private native void writeOnTransitionTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnTransitionTimeAttribute(
        long chipClusterPtr,
        OnTransitionTimeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOffTransitionTimeAttribute(
        long chipClusterPtr, OffTransitionTimeAttributeCallback callback);

    private native void writeOffTransitionTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOffTransitionTimeAttribute(
        long chipClusterPtr,
        OffTransitionTimeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readDefaultMoveRateAttribute(
        long chipClusterPtr, DefaultMoveRateAttributeCallback callback);

    private native void writeDefaultMoveRateAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeDefaultMoveRateAttribute(
        long chipClusterPtr,
        DefaultMoveRateAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readStartUpCurrentLevelAttribute(
        long chipClusterPtr, StartUpCurrentLevelAttributeCallback callback);

    private native void writeStartUpCurrentLevelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeStartUpCurrentLevelAttribute(
        long chipClusterPtr,
        StartUpCurrentLevelAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BinaryInputBasicCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 15L;

    public BinaryInputBasicCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readOutOfServiceAttribute(BooleanAttributeCallback callback) {
      readOutOfServiceAttribute(chipClusterPtr, callback);
    }

    public void writeOutOfServiceAttribute(DefaultClusterCallback callback, Boolean value) {
      writeOutOfServiceAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOutOfServiceAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeOutOfServiceAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOutOfServiceAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOutOfServiceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPresentValueAttribute(BooleanAttributeCallback callback) {
      readPresentValueAttribute(chipClusterPtr, callback);
    }

    public void writePresentValueAttribute(DefaultClusterCallback callback, Boolean value) {
      writePresentValueAttribute(chipClusterPtr, callback, value, null);
    }

    public void writePresentValueAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writePresentValueAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribePresentValueAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePresentValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStatusFlagsAttribute(IntegerAttributeCallback callback) {
      readStatusFlagsAttribute(chipClusterPtr, callback);
    }

    public void subscribeStatusFlagsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStatusFlagsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readOutOfServiceAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeOutOfServiceAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOutOfServiceAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPresentValueAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writePresentValueAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribePresentValueAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStatusFlagsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeStatusFlagsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class DescriptorCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 29L;

    public DescriptorCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface DeviceTypeListAttributeCallback {
      void onSuccess(List<ChipStructs.DescriptorClusterDeviceTypeStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ServerListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ClientListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PartsListAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readDeviceTypeListAttribute(DeviceTypeListAttributeCallback callback) {
      readDeviceTypeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeDeviceTypeListAttribute(
        DeviceTypeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDeviceTypeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readServerListAttribute(ServerListAttributeCallback callback) {
      readServerListAttribute(chipClusterPtr, callback);
    }

    public void subscribeServerListAttribute(
        ServerListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeServerListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClientListAttribute(ClientListAttributeCallback callback) {
      readClientListAttribute(chipClusterPtr, callback);
    }

    public void subscribeClientListAttribute(
        ClientListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClientListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartsListAttribute(PartsListAttributeCallback callback) {
      readPartsListAttribute(chipClusterPtr, callback);
    }

    public void subscribePartsListAttribute(
        PartsListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartsListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readDeviceTypeListAttribute(
        long chipClusterPtr, DeviceTypeListAttributeCallback callback);

    private native void subscribeDeviceTypeListAttribute(
        long chipClusterPtr,
        DeviceTypeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readServerListAttribute(
        long chipClusterPtr, ServerListAttributeCallback callback);

    private native void subscribeServerListAttribute(
        long chipClusterPtr,
        ServerListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readClientListAttribute(
        long chipClusterPtr, ClientListAttributeCallback callback);

    private native void subscribeClientListAttribute(
        long chipClusterPtr,
        ClientListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPartsListAttribute(
        long chipClusterPtr, PartsListAttributeCallback callback);

    private native void subscribePartsListAttribute(
        long chipClusterPtr, PartsListAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BindingCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 30L;

    public BindingCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface BindingAttributeCallback {
      void onSuccess(List<ChipStructs.BindingClusterTargetStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBindingAttribute(BindingAttributeCallback callback) {
      readBindingAttribute(chipClusterPtr, callback);
    }

    public void writeBindingAttribute(
        DefaultClusterCallback callback, ArrayList<ChipStructs.BindingClusterTargetStruct> value) {
      writeBindingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeBindingAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.BindingClusterTargetStruct> value,
        int timedWriteTimeoutMs) {
      writeBindingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBindingAttribute(
        BindingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBindingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBindingAttribute(
        long chipClusterPtr, BindingAttributeCallback callback);

    private native void writeBindingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.BindingClusterTargetStruct> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBindingAttribute(
        long chipClusterPtr, BindingAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class AccessControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 31L;

    public AccessControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface AclAttributeCallback {
      void onSuccess(List<ChipStructs.AccessControlClusterAccessControlEntry> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ExtensionAttributeCallback {
      void onSuccess(List<ChipStructs.AccessControlClusterExtensionEntry> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readAclAttribute(AclAttributeCallback callback) {
      readAclAttribute(chipClusterPtr, callback);
    }

    public void writeAclAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterAccessControlEntry> value) {
      writeAclAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeAclAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterAccessControlEntry> value,
        int timedWriteTimeoutMs) {
      writeAclAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeAclAttribute(
        AclAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAclAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readExtensionAttribute(ExtensionAttributeCallback callback) {
      readExtensionAttribute(chipClusterPtr, callback);
    }

    public void writeExtensionAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterExtensionEntry> value) {
      writeExtensionAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeExtensionAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterExtensionEntry> value,
        int timedWriteTimeoutMs) {
      writeExtensionAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeExtensionAttribute(
        ExtensionAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeExtensionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSubjectsPerAccessControlEntryAttribute(IntegerAttributeCallback callback) {
      readSubjectsPerAccessControlEntryAttribute(chipClusterPtr, callback);
    }

    public void subscribeSubjectsPerAccessControlEntryAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSubjectsPerAccessControlEntryAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTargetsPerAccessControlEntryAttribute(IntegerAttributeCallback callback) {
      readTargetsPerAccessControlEntryAttribute(chipClusterPtr, callback);
    }

    public void subscribeTargetsPerAccessControlEntryAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTargetsPerAccessControlEntryAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAccessControlEntriesPerFabricAttribute(IntegerAttributeCallback callback) {
      readAccessControlEntriesPerFabricAttribute(chipClusterPtr, callback);
    }

    public void subscribeAccessControlEntriesPerFabricAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAccessControlEntriesPerFabricAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readAclAttribute(long chipClusterPtr, AclAttributeCallback callback);

    private native void writeAclAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterAccessControlEntry> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeAclAttribute(
        long chipClusterPtr, AclAttributeCallback callback, int minInterval, int maxInterval);

    private native void readExtensionAttribute(
        long chipClusterPtr, ExtensionAttributeCallback callback);

    private native void writeExtensionAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.AccessControlClusterExtensionEntry> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeExtensionAttribute(
        long chipClusterPtr, ExtensionAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSubjectsPerAccessControlEntryAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSubjectsPerAccessControlEntryAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTargetsPerAccessControlEntryAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeTargetsPerAccessControlEntryAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAccessControlEntriesPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAccessControlEntriesPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ActionsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 37L;

    public ActionsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void instantAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      instantAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void instantAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      instantAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void instantActionWithTransition(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Integer transitionTime) {
      instantActionWithTransition(
          chipClusterPtr, callback, actionID, invokeID, transitionTime, null);
    }

    public void instantActionWithTransition(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Integer transitionTime,
        int timedInvokeTimeoutMs) {
      instantActionWithTransition(
          chipClusterPtr, callback, actionID, invokeID, transitionTime, timedInvokeTimeoutMs);
    }

    public void startAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      startAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void startAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      startAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void startActionWithDuration(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID, Long duration) {
      startActionWithDuration(chipClusterPtr, callback, actionID, invokeID, duration, null);
    }

    public void startActionWithDuration(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        int timedInvokeTimeoutMs) {
      startActionWithDuration(
          chipClusterPtr, callback, actionID, invokeID, duration, timedInvokeTimeoutMs);
    }

    public void stopAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      stopAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void stopAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      stopAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void pauseAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      pauseAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void pauseAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      pauseAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void pauseActionWithDuration(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID, Long duration) {
      pauseActionWithDuration(chipClusterPtr, callback, actionID, invokeID, duration, null);
    }

    public void pauseActionWithDuration(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        int timedInvokeTimeoutMs) {
      pauseActionWithDuration(
          chipClusterPtr, callback, actionID, invokeID, duration, timedInvokeTimeoutMs);
    }

    public void resumeAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      resumeAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void resumeAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      resumeAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void enableAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      enableAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void enableAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      enableAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void enableActionWithDuration(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID, Long duration) {
      enableActionWithDuration(chipClusterPtr, callback, actionID, invokeID, duration, null);
    }

    public void enableActionWithDuration(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        int timedInvokeTimeoutMs) {
      enableActionWithDuration(
          chipClusterPtr, callback, actionID, invokeID, duration, timedInvokeTimeoutMs);
    }

    public void disableAction(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID) {
      disableAction(chipClusterPtr, callback, actionID, invokeID, null);
    }

    public void disableAction(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        int timedInvokeTimeoutMs) {
      disableAction(chipClusterPtr, callback, actionID, invokeID, timedInvokeTimeoutMs);
    }

    public void disableActionWithDuration(
        DefaultClusterCallback callback, Integer actionID, Optional<Long> invokeID, Long duration) {
      disableActionWithDuration(chipClusterPtr, callback, actionID, invokeID, duration, null);
    }

    public void disableActionWithDuration(
        DefaultClusterCallback callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        int timedInvokeTimeoutMs) {
      disableActionWithDuration(
          chipClusterPtr, callback, actionID, invokeID, duration, timedInvokeTimeoutMs);
    }

    private native void instantAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void instantActionWithTransition(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Integer transitionTime,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void startAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void startActionWithDuration(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void pauseAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void pauseActionWithDuration(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void resumeAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enableAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enableActionWithDuration(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void disableAction(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void disableActionWithDuration(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer actionID,
        Optional<Long> invokeID,
        Long duration,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ActionListAttributeCallback {
      void onSuccess(List<ChipStructs.ActionsClusterActionStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface EndpointListsAttributeCallback {
      void onSuccess(List<ChipStructs.ActionsClusterEndpointListStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readActionListAttribute(ActionListAttributeCallback callback) {
      readActionListAttribute(chipClusterPtr, callback);
    }

    public void subscribeActionListAttribute(
        ActionListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActionListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEndpointListsAttribute(EndpointListsAttributeCallback callback) {
      readEndpointListsAttribute(chipClusterPtr, callback);
    }

    public void subscribeEndpointListsAttribute(
        EndpointListsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEndpointListsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSetupURLAttribute(CharStringAttributeCallback callback) {
      readSetupURLAttribute(chipClusterPtr, callback);
    }

    public void subscribeSetupURLAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSetupURLAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readActionListAttribute(
        long chipClusterPtr, ActionListAttributeCallback callback);

    private native void subscribeActionListAttribute(
        long chipClusterPtr,
        ActionListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEndpointListsAttribute(
        long chipClusterPtr, EndpointListsAttributeCallback callback);

    private native void subscribeEndpointListsAttribute(
        long chipClusterPtr,
        EndpointListsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSetupURLAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSetupURLAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BasicInformationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 40L;

    public BasicInformationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface VendorIDAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readDataModelRevisionAttribute(IntegerAttributeCallback callback) {
      readDataModelRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeDataModelRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDataModelRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorNameAttribute(CharStringAttributeCallback callback) {
      readVendorNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorIDAttribute(VendorIDAttributeCallback callback) {
      readVendorIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorIDAttribute(
        VendorIDAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductNameAttribute(CharStringAttributeCallback callback) {
      readProductNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductIDAttribute(IntegerAttributeCallback callback) {
      readProductIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductIDAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNodeLabelAttribute(CharStringAttributeCallback callback) {
      readNodeLabelAttribute(chipClusterPtr, callback);
    }

    public void writeNodeLabelAttribute(DefaultClusterCallback callback, String value) {
      writeNodeLabelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNodeLabelAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeNodeLabelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNodeLabelAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNodeLabelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLocationAttribute(CharStringAttributeCallback callback) {
      readLocationAttribute(chipClusterPtr, callback);
    }

    public void writeLocationAttribute(DefaultClusterCallback callback, String value) {
      writeLocationAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLocationAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLocationAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLocationAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLocationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readHardwareVersionAttribute(IntegerAttributeCallback callback) {
      readHardwareVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeHardwareVersionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHardwareVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readHardwareVersionStringAttribute(CharStringAttributeCallback callback) {
      readHardwareVersionStringAttribute(chipClusterPtr, callback);
    }

    public void subscribeHardwareVersionStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHardwareVersionStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoftwareVersionAttribute(LongAttributeCallback callback) {
      readSoftwareVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeSoftwareVersionAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoftwareVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoftwareVersionStringAttribute(CharStringAttributeCallback callback) {
      readSoftwareVersionStringAttribute(chipClusterPtr, callback);
    }

    public void subscribeSoftwareVersionStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoftwareVersionStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readManufacturingDateAttribute(CharStringAttributeCallback callback) {
      readManufacturingDateAttribute(chipClusterPtr, callback);
    }

    public void subscribeManufacturingDateAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeManufacturingDateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartNumberAttribute(CharStringAttributeCallback callback) {
      readPartNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribePartNumberAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductURLAttribute(CharStringAttributeCallback callback) {
      readProductURLAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductURLAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductURLAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductLabelAttribute(CharStringAttributeCallback callback) {
      readProductLabelAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductLabelAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductLabelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSerialNumberAttribute(CharStringAttributeCallback callback) {
      readSerialNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribeSerialNumberAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSerialNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLocalConfigDisabledAttribute(BooleanAttributeCallback callback) {
      readLocalConfigDisabledAttribute(chipClusterPtr, callback);
    }

    public void writeLocalConfigDisabledAttribute(DefaultClusterCallback callback, Boolean value) {
      writeLocalConfigDisabledAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLocalConfigDisabledAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeLocalConfigDisabledAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLocalConfigDisabledAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLocalConfigDisabledAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readReachableAttribute(BooleanAttributeCallback callback) {
      readReachableAttribute(chipClusterPtr, callback);
    }

    public void subscribeReachableAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeReachableAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUniqueIDAttribute(CharStringAttributeCallback callback) {
      readUniqueIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeUniqueIDAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUniqueIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readDataModelRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeDataModelRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readVendorNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeVendorNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback);

    private native void subscribeVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback, int minInterval, int maxInterval);

    private native void readProductNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductIDAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeProductIDAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNodeLabelAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeNodeLabelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNodeLabelAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLocationAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLocationAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLocationAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readHardwareVersionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeHardwareVersionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readHardwareVersionStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeHardwareVersionStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSoftwareVersionAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeSoftwareVersionAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSoftwareVersionStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSoftwareVersionStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readManufacturingDateAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeManufacturingDateAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPartNumberAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribePartNumberAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductURLAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductURLAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductLabelAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductLabelAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSerialNumberAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSerialNumberAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLocalConfigDisabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeLocalConfigDisabledAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLocalConfigDisabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readReachableAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeReachableAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUniqueIDAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeUniqueIDAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OtaSoftwareUpdateProviderCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 41L;

    public OtaSoftwareUpdateProviderCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void queryImage(
        QueryImageResponseCallback callback,
        Integer vendorID,
        Integer productID,
        Long softwareVersion,
        ArrayList<Integer> protocolsSupported,
        Optional<Integer> hardwareVersion,
        Optional<String> location,
        Optional<Boolean> requestorCanConsent,
        Optional<byte[]> metadataForProvider) {
      queryImage(
          chipClusterPtr,
          callback,
          vendorID,
          productID,
          softwareVersion,
          protocolsSupported,
          hardwareVersion,
          location,
          requestorCanConsent,
          metadataForProvider,
          null);
    }

    public void queryImage(
        QueryImageResponseCallback callback,
        Integer vendorID,
        Integer productID,
        Long softwareVersion,
        ArrayList<Integer> protocolsSupported,
        Optional<Integer> hardwareVersion,
        Optional<String> location,
        Optional<Boolean> requestorCanConsent,
        Optional<byte[]> metadataForProvider,
        int timedInvokeTimeoutMs) {
      queryImage(
          chipClusterPtr,
          callback,
          vendorID,
          productID,
          softwareVersion,
          protocolsSupported,
          hardwareVersion,
          location,
          requestorCanConsent,
          metadataForProvider,
          timedInvokeTimeoutMs);
    }

    public void applyUpdateRequest(
        ApplyUpdateResponseCallback callback, byte[] updateToken, Long newVersion) {
      applyUpdateRequest(chipClusterPtr, callback, updateToken, newVersion, null);
    }

    public void applyUpdateRequest(
        ApplyUpdateResponseCallback callback,
        byte[] updateToken,
        Long newVersion,
        int timedInvokeTimeoutMs) {
      applyUpdateRequest(chipClusterPtr, callback, updateToken, newVersion, timedInvokeTimeoutMs);
    }

    public void notifyUpdateApplied(
        DefaultClusterCallback callback, byte[] updateToken, Long softwareVersion) {
      notifyUpdateApplied(chipClusterPtr, callback, updateToken, softwareVersion, null);
    }

    public void notifyUpdateApplied(
        DefaultClusterCallback callback,
        byte[] updateToken,
        Long softwareVersion,
        int timedInvokeTimeoutMs) {
      notifyUpdateApplied(
          chipClusterPtr, callback, updateToken, softwareVersion, timedInvokeTimeoutMs);
    }

    private native void queryImage(
        long chipClusterPtr,
        QueryImageResponseCallback Callback,
        Integer vendorID,
        Integer productID,
        Long softwareVersion,
        ArrayList<Integer> protocolsSupported,
        Optional<Integer> hardwareVersion,
        Optional<String> location,
        Optional<Boolean> requestorCanConsent,
        Optional<byte[]> metadataForProvider,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void applyUpdateRequest(
        long chipClusterPtr,
        ApplyUpdateResponseCallback Callback,
        byte[] updateToken,
        Long newVersion,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void notifyUpdateApplied(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        byte[] updateToken,
        Long softwareVersion,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface QueryImageResponseCallback {
      void onSuccess(
          Integer status,
          Optional<Long> delayedActionTime,
          Optional<String> imageURI,
          Optional<Long> softwareVersion,
          Optional<String> softwareVersionString,
          Optional<byte[]> updateToken,
          Optional<Boolean> userConsentNeeded,
          Optional<byte[]> metadataForRequestor);

      void onError(Exception error);
    }

    public interface ApplyUpdateResponseCallback {
      void onSuccess(Integer action, Long delayedActionTime);

      void onError(Exception error);
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OtaSoftwareUpdateRequestorCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 42L;

    public OtaSoftwareUpdateRequestorCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void announceOTAProvider(
        DefaultClusterCallback callback,
        Long providerNodeID,
        Integer vendorID,
        Integer announcementReason,
        Optional<byte[]> metadataForNode,
        Integer endpoint) {
      announceOTAProvider(
          chipClusterPtr,
          callback,
          providerNodeID,
          vendorID,
          announcementReason,
          metadataForNode,
          endpoint,
          null);
    }

    public void announceOTAProvider(
        DefaultClusterCallback callback,
        Long providerNodeID,
        Integer vendorID,
        Integer announcementReason,
        Optional<byte[]> metadataForNode,
        Integer endpoint,
        int timedInvokeTimeoutMs) {
      announceOTAProvider(
          chipClusterPtr,
          callback,
          providerNodeID,
          vendorID,
          announcementReason,
          metadataForNode,
          endpoint,
          timedInvokeTimeoutMs);
    }

    private native void announceOTAProvider(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Long providerNodeID,
        Integer vendorID,
        Integer announcementReason,
        Optional<byte[]> metadataForNode,
        Integer endpoint,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface DefaultOTAProvidersAttributeCallback {
      void onSuccess(List<ChipStructs.OtaSoftwareUpdateRequestorClusterProviderLocation> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface UpdateStateProgressAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readDefaultOTAProvidersAttribute(DefaultOTAProvidersAttributeCallback callback) {
      readDefaultOTAProvidersAttribute(chipClusterPtr, callback);
    }

    public void writeDefaultOTAProvidersAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.OtaSoftwareUpdateRequestorClusterProviderLocation> value) {
      writeDefaultOTAProvidersAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeDefaultOTAProvidersAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.OtaSoftwareUpdateRequestorClusterProviderLocation> value,
        int timedWriteTimeoutMs) {
      writeDefaultOTAProvidersAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeDefaultOTAProvidersAttribute(
        DefaultOTAProvidersAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDefaultOTAProvidersAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUpdatePossibleAttribute(BooleanAttributeCallback callback) {
      readUpdatePossibleAttribute(chipClusterPtr, callback);
    }

    public void subscribeUpdatePossibleAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUpdatePossibleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUpdateStateAttribute(IntegerAttributeCallback callback) {
      readUpdateStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeUpdateStateAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUpdateStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUpdateStateProgressAttribute(UpdateStateProgressAttributeCallback callback) {
      readUpdateStateProgressAttribute(chipClusterPtr, callback);
    }

    public void subscribeUpdateStateProgressAttribute(
        UpdateStateProgressAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUpdateStateProgressAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readDefaultOTAProvidersAttribute(
        long chipClusterPtr, DefaultOTAProvidersAttributeCallback callback);

    private native void writeDefaultOTAProvidersAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.OtaSoftwareUpdateRequestorClusterProviderLocation> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeDefaultOTAProvidersAttribute(
        long chipClusterPtr,
        DefaultOTAProvidersAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readUpdatePossibleAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeUpdatePossibleAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUpdateStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeUpdateStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUpdateStateProgressAttribute(
        long chipClusterPtr, UpdateStateProgressAttributeCallback callback);

    private native void subscribeUpdateStateProgressAttribute(
        long chipClusterPtr,
        UpdateStateProgressAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class LocalizationConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 43L;

    public LocalizationConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface SupportedLocalesAttributeCallback {
      void onSuccess(List<String> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readActiveLocaleAttribute(CharStringAttributeCallback callback) {
      readActiveLocaleAttribute(chipClusterPtr, callback);
    }

    public void writeActiveLocaleAttribute(DefaultClusterCallback callback, String value) {
      writeActiveLocaleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeActiveLocaleAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeActiveLocaleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeActiveLocaleAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveLocaleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedLocalesAttribute(SupportedLocalesAttributeCallback callback) {
      readSupportedLocalesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedLocalesAttribute(
        SupportedLocalesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedLocalesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readActiveLocaleAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeActiveLocaleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeActiveLocaleAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSupportedLocalesAttribute(
        long chipClusterPtr, SupportedLocalesAttributeCallback callback);

    private native void subscribeSupportedLocalesAttribute(
        long chipClusterPtr,
        SupportedLocalesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class TimeFormatLocalizationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 44L;

    public TimeFormatLocalizationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface SupportedCalendarTypesAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readHourFormatAttribute(IntegerAttributeCallback callback) {
      readHourFormatAttribute(chipClusterPtr, callback);
    }

    public void writeHourFormatAttribute(DefaultClusterCallback callback, Integer value) {
      writeHourFormatAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeHourFormatAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeHourFormatAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeHourFormatAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHourFormatAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveCalendarTypeAttribute(IntegerAttributeCallback callback) {
      readActiveCalendarTypeAttribute(chipClusterPtr, callback);
    }

    public void writeActiveCalendarTypeAttribute(DefaultClusterCallback callback, Integer value) {
      writeActiveCalendarTypeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeActiveCalendarTypeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeActiveCalendarTypeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeActiveCalendarTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveCalendarTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedCalendarTypesAttribute(
        SupportedCalendarTypesAttributeCallback callback) {
      readSupportedCalendarTypesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedCalendarTypesAttribute(
        SupportedCalendarTypesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedCalendarTypesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readHourFormatAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeHourFormatAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeHourFormatAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveCalendarTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeActiveCalendarTypeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeActiveCalendarTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSupportedCalendarTypesAttribute(
        long chipClusterPtr, SupportedCalendarTypesAttributeCallback callback);

    private native void subscribeSupportedCalendarTypesAttribute(
        long chipClusterPtr,
        SupportedCalendarTypesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class UnitLocalizationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 45L;

    public UnitLocalizationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readTemperatureUnitAttribute(IntegerAttributeCallback callback) {
      readTemperatureUnitAttribute(chipClusterPtr, callback);
    }

    public void writeTemperatureUnitAttribute(DefaultClusterCallback callback, Integer value) {
      writeTemperatureUnitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeTemperatureUnitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeTemperatureUnitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeTemperatureUnitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTemperatureUnitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readTemperatureUnitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeTemperatureUnitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeTemperatureUnitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class PowerSourceConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 46L;

    public PowerSourceConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface SourcesAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readSourcesAttribute(SourcesAttributeCallback callback) {
      readSourcesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSourcesAttribute(
        SourcesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSourcesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readSourcesAttribute(
        long chipClusterPtr, SourcesAttributeCallback callback);

    private native void subscribeSourcesAttribute(
        long chipClusterPtr, SourcesAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class PowerSourceCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 47L;

    public PowerSourceCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface WiredAssessedInputVoltageAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface WiredAssessedInputFrequencyAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface WiredAssessedCurrentAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveWiredFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatVoltageAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatPercentRemainingAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatTimeRemainingAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveBatFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatTimeToFullChargeAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BatChargingCurrentAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveBatChargeFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readStatusAttribute(IntegerAttributeCallback callback) {
      readStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOrderAttribute(IntegerAttributeCallback callback) {
      readOrderAttribute(chipClusterPtr, callback);
    }

    public void subscribeOrderAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOrderAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDescriptionAttribute(CharStringAttributeCallback callback) {
      readDescriptionAttribute(chipClusterPtr, callback);
    }

    public void subscribeDescriptionAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDescriptionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredAssessedInputVoltageAttribute(
        WiredAssessedInputVoltageAttributeCallback callback) {
      readWiredAssessedInputVoltageAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredAssessedInputVoltageAttribute(
        WiredAssessedInputVoltageAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredAssessedInputVoltageAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredAssessedInputFrequencyAttribute(
        WiredAssessedInputFrequencyAttributeCallback callback) {
      readWiredAssessedInputFrequencyAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredAssessedInputFrequencyAttribute(
        WiredAssessedInputFrequencyAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredAssessedInputFrequencyAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredCurrentTypeAttribute(IntegerAttributeCallback callback) {
      readWiredCurrentTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredCurrentTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredCurrentTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredAssessedCurrentAttribute(WiredAssessedCurrentAttributeCallback callback) {
      readWiredAssessedCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredAssessedCurrentAttribute(
        WiredAssessedCurrentAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredAssessedCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredNominalVoltageAttribute(LongAttributeCallback callback) {
      readWiredNominalVoltageAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredNominalVoltageAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredNominalVoltageAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredMaximumCurrentAttribute(LongAttributeCallback callback) {
      readWiredMaximumCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredMaximumCurrentAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredMaximumCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiredPresentAttribute(BooleanAttributeCallback callback) {
      readWiredPresentAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiredPresentAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiredPresentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveWiredFaultsAttribute(ActiveWiredFaultsAttributeCallback callback) {
      readActiveWiredFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveWiredFaultsAttribute(
        ActiveWiredFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveWiredFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatVoltageAttribute(BatVoltageAttributeCallback callback) {
      readBatVoltageAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatVoltageAttribute(
        BatVoltageAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatVoltageAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatPercentRemainingAttribute(BatPercentRemainingAttributeCallback callback) {
      readBatPercentRemainingAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatPercentRemainingAttribute(
        BatPercentRemainingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatPercentRemainingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatTimeRemainingAttribute(BatTimeRemainingAttributeCallback callback) {
      readBatTimeRemainingAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatTimeRemainingAttribute(
        BatTimeRemainingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatTimeRemainingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatChargeLevelAttribute(IntegerAttributeCallback callback) {
      readBatChargeLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatChargeLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatChargeLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatReplacementNeededAttribute(BooleanAttributeCallback callback) {
      readBatReplacementNeededAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatReplacementNeededAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatReplacementNeededAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatReplaceabilityAttribute(IntegerAttributeCallback callback) {
      readBatReplaceabilityAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatReplaceabilityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatReplaceabilityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatPresentAttribute(BooleanAttributeCallback callback) {
      readBatPresentAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatPresentAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatPresentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveBatFaultsAttribute(ActiveBatFaultsAttributeCallback callback) {
      readActiveBatFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveBatFaultsAttribute(
        ActiveBatFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveBatFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatReplacementDescriptionAttribute(CharStringAttributeCallback callback) {
      readBatReplacementDescriptionAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatReplacementDescriptionAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatReplacementDescriptionAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatCommonDesignationAttribute(LongAttributeCallback callback) {
      readBatCommonDesignationAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatCommonDesignationAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatCommonDesignationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatANSIDesignationAttribute(CharStringAttributeCallback callback) {
      readBatANSIDesignationAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatANSIDesignationAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatANSIDesignationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatIECDesignationAttribute(CharStringAttributeCallback callback) {
      readBatIECDesignationAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatIECDesignationAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatIECDesignationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatApprovedChemistryAttribute(LongAttributeCallback callback) {
      readBatApprovedChemistryAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatApprovedChemistryAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatApprovedChemistryAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatCapacityAttribute(LongAttributeCallback callback) {
      readBatCapacityAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatCapacityAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatCapacityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatQuantityAttribute(IntegerAttributeCallback callback) {
      readBatQuantityAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatQuantityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatQuantityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatChargeStateAttribute(IntegerAttributeCallback callback) {
      readBatChargeStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatChargeStateAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatChargeStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatTimeToFullChargeAttribute(BatTimeToFullChargeAttributeCallback callback) {
      readBatTimeToFullChargeAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatTimeToFullChargeAttribute(
        BatTimeToFullChargeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatTimeToFullChargeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatFunctionalWhileChargingAttribute(BooleanAttributeCallback callback) {
      readBatFunctionalWhileChargingAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatFunctionalWhileChargingAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatFunctionalWhileChargingAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBatChargingCurrentAttribute(BatChargingCurrentAttributeCallback callback) {
      readBatChargingCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeBatChargingCurrentAttribute(
        BatChargingCurrentAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBatChargingCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveBatChargeFaultsAttribute(
        ActiveBatChargeFaultsAttributeCallback callback) {
      readActiveBatChargeFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveBatChargeFaultsAttribute(
        ActiveBatChargeFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveBatChargeFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readStatusAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOrderAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOrderAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDescriptionAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeDescriptionAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiredAssessedInputVoltageAttribute(
        long chipClusterPtr, WiredAssessedInputVoltageAttributeCallback callback);

    private native void subscribeWiredAssessedInputVoltageAttribute(
        long chipClusterPtr,
        WiredAssessedInputVoltageAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiredAssessedInputFrequencyAttribute(
        long chipClusterPtr, WiredAssessedInputFrequencyAttributeCallback callback);

    private native void subscribeWiredAssessedInputFrequencyAttribute(
        long chipClusterPtr,
        WiredAssessedInputFrequencyAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiredCurrentTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeWiredCurrentTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWiredAssessedCurrentAttribute(
        long chipClusterPtr, WiredAssessedCurrentAttributeCallback callback);

    private native void subscribeWiredAssessedCurrentAttribute(
        long chipClusterPtr,
        WiredAssessedCurrentAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiredNominalVoltageAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeWiredNominalVoltageAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWiredMaximumCurrentAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeWiredMaximumCurrentAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWiredPresentAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeWiredPresentAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveWiredFaultsAttribute(
        long chipClusterPtr, ActiveWiredFaultsAttributeCallback callback);

    private native void subscribeActiveWiredFaultsAttribute(
        long chipClusterPtr,
        ActiveWiredFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatVoltageAttribute(
        long chipClusterPtr, BatVoltageAttributeCallback callback);

    private native void subscribeBatVoltageAttribute(
        long chipClusterPtr,
        BatVoltageAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatPercentRemainingAttribute(
        long chipClusterPtr, BatPercentRemainingAttributeCallback callback);

    private native void subscribeBatPercentRemainingAttribute(
        long chipClusterPtr,
        BatPercentRemainingAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatTimeRemainingAttribute(
        long chipClusterPtr, BatTimeRemainingAttributeCallback callback);

    private native void subscribeBatTimeRemainingAttribute(
        long chipClusterPtr,
        BatTimeRemainingAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatChargeLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBatChargeLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatReplacementNeededAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeBatReplacementNeededAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatReplaceabilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBatReplaceabilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatPresentAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeBatPresentAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveBatFaultsAttribute(
        long chipClusterPtr, ActiveBatFaultsAttributeCallback callback);

    private native void subscribeActiveBatFaultsAttribute(
        long chipClusterPtr,
        ActiveBatFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatReplacementDescriptionAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeBatReplacementDescriptionAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatCommonDesignationAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeBatCommonDesignationAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatANSIDesignationAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeBatANSIDesignationAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatIECDesignationAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeBatIECDesignationAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatApprovedChemistryAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeBatApprovedChemistryAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatCapacityAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeBatCapacityAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatQuantityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBatQuantityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatChargeStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBatChargeStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatTimeToFullChargeAttribute(
        long chipClusterPtr, BatTimeToFullChargeAttributeCallback callback);

    private native void subscribeBatTimeToFullChargeAttribute(
        long chipClusterPtr,
        BatTimeToFullChargeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBatFunctionalWhileChargingAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeBatFunctionalWhileChargingAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBatChargingCurrentAttribute(
        long chipClusterPtr, BatChargingCurrentAttributeCallback callback);

    private native void subscribeBatChargingCurrentAttribute(
        long chipClusterPtr,
        BatChargingCurrentAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readActiveBatChargeFaultsAttribute(
        long chipClusterPtr, ActiveBatChargeFaultsAttributeCallback callback);

    private native void subscribeActiveBatChargeFaultsAttribute(
        long chipClusterPtr,
        ActiveBatChargeFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class GeneralCommissioningCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 48L;

    public GeneralCommissioningCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void armFailSafe(
        ArmFailSafeResponseCallback callback, Integer expiryLengthSeconds, Long breadcrumb) {
      armFailSafe(chipClusterPtr, callback, expiryLengthSeconds, breadcrumb, null);
    }

    public void armFailSafe(
        ArmFailSafeResponseCallback callback,
        Integer expiryLengthSeconds,
        Long breadcrumb,
        int timedInvokeTimeoutMs) {
      armFailSafe(chipClusterPtr, callback, expiryLengthSeconds, breadcrumb, timedInvokeTimeoutMs);
    }

    public void setRegulatoryConfig(
        SetRegulatoryConfigResponseCallback callback,
        Integer newRegulatoryConfig,
        String countryCode,
        Long breadcrumb) {
      setRegulatoryConfig(
          chipClusterPtr, callback, newRegulatoryConfig, countryCode, breadcrumb, null);
    }

    public void setRegulatoryConfig(
        SetRegulatoryConfigResponseCallback callback,
        Integer newRegulatoryConfig,
        String countryCode,
        Long breadcrumb,
        int timedInvokeTimeoutMs) {
      setRegulatoryConfig(
          chipClusterPtr,
          callback,
          newRegulatoryConfig,
          countryCode,
          breadcrumb,
          timedInvokeTimeoutMs);
    }

    public void commissioningComplete(CommissioningCompleteResponseCallback callback) {
      commissioningComplete(chipClusterPtr, callback, null);
    }

    public void commissioningComplete(
        CommissioningCompleteResponseCallback callback, int timedInvokeTimeoutMs) {

      commissioningComplete(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void armFailSafe(
        long chipClusterPtr,
        ArmFailSafeResponseCallback Callback,
        Integer expiryLengthSeconds,
        Long breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setRegulatoryConfig(
        long chipClusterPtr,
        SetRegulatoryConfigResponseCallback Callback,
        Integer newRegulatoryConfig,
        String countryCode,
        Long breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void commissioningComplete(
        long chipClusterPtr,
        CommissioningCompleteResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ArmFailSafeResponseCallback {
      void onSuccess(Integer errorCode, String debugText);

      void onError(Exception error);
    }

    public interface SetRegulatoryConfigResponseCallback {
      void onSuccess(Integer errorCode, String debugText);

      void onError(Exception error);
    }

    public interface CommissioningCompleteResponseCallback {
      void onSuccess(Integer errorCode, String debugText);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBreadcrumbAttribute(LongAttributeCallback callback) {
      readBreadcrumbAttribute(chipClusterPtr, callback);
    }

    public void writeBreadcrumbAttribute(DefaultClusterCallback callback, Long value) {
      writeBreadcrumbAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeBreadcrumbAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeBreadcrumbAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBreadcrumbAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBreadcrumbAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRegulatoryConfigAttribute(IntegerAttributeCallback callback) {
      readRegulatoryConfigAttribute(chipClusterPtr, callback);
    }

    public void subscribeRegulatoryConfigAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRegulatoryConfigAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLocationCapabilityAttribute(IntegerAttributeCallback callback) {
      readLocationCapabilityAttribute(chipClusterPtr, callback);
    }

    public void subscribeLocationCapabilityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLocationCapabilityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportsConcurrentConnectionAttribute(BooleanAttributeCallback callback) {
      readSupportsConcurrentConnectionAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportsConcurrentConnectionAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportsConcurrentConnectionAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBreadcrumbAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void writeBreadcrumbAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBreadcrumbAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRegulatoryConfigAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRegulatoryConfigAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLocationCapabilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeLocationCapabilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSupportsConcurrentConnectionAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeSupportsConcurrentConnectionAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class NetworkCommissioningCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 49L;

    public NetworkCommissioningCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void scanNetworks(
        ScanNetworksResponseCallback callback,
        @Nullable Optional<byte[]> ssid,
        Optional<Long> breadcrumb) {
      scanNetworks(chipClusterPtr, callback, ssid, breadcrumb, null);
    }

    public void scanNetworks(
        ScanNetworksResponseCallback callback,
        @Nullable Optional<byte[]> ssid,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      scanNetworks(chipClusterPtr, callback, ssid, breadcrumb, timedInvokeTimeoutMs);
    }

    public void addOrUpdateWiFiNetwork(
        NetworkConfigResponseCallback callback,
        byte[] ssid,
        byte[] credentials,
        Optional<Long> breadcrumb) {
      addOrUpdateWiFiNetwork(chipClusterPtr, callback, ssid, credentials, breadcrumb, null);
    }

    public void addOrUpdateWiFiNetwork(
        NetworkConfigResponseCallback callback,
        byte[] ssid,
        byte[] credentials,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      addOrUpdateWiFiNetwork(
          chipClusterPtr, callback, ssid, credentials, breadcrumb, timedInvokeTimeoutMs);
    }

    public void addOrUpdateThreadNetwork(
        NetworkConfigResponseCallback callback,
        byte[] operationalDataset,
        Optional<Long> breadcrumb) {
      addOrUpdateThreadNetwork(chipClusterPtr, callback, operationalDataset, breadcrumb, null);
    }

    public void addOrUpdateThreadNetwork(
        NetworkConfigResponseCallback callback,
        byte[] operationalDataset,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      addOrUpdateThreadNetwork(
          chipClusterPtr, callback, operationalDataset, breadcrumb, timedInvokeTimeoutMs);
    }

    public void removeNetwork(
        NetworkConfigResponseCallback callback, byte[] networkID, Optional<Long> breadcrumb) {
      removeNetwork(chipClusterPtr, callback, networkID, breadcrumb, null);
    }

    public void removeNetwork(
        NetworkConfigResponseCallback callback,
        byte[] networkID,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      removeNetwork(chipClusterPtr, callback, networkID, breadcrumb, timedInvokeTimeoutMs);
    }

    public void connectNetwork(
        ConnectNetworkResponseCallback callback, byte[] networkID, Optional<Long> breadcrumb) {
      connectNetwork(chipClusterPtr, callback, networkID, breadcrumb, null);
    }

    public void connectNetwork(
        ConnectNetworkResponseCallback callback,
        byte[] networkID,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      connectNetwork(chipClusterPtr, callback, networkID, breadcrumb, timedInvokeTimeoutMs);
    }

    public void reorderNetwork(
        NetworkConfigResponseCallback callback,
        byte[] networkID,
        Integer networkIndex,
        Optional<Long> breadcrumb) {
      reorderNetwork(chipClusterPtr, callback, networkID, networkIndex, breadcrumb, null);
    }

    public void reorderNetwork(
        NetworkConfigResponseCallback callback,
        byte[] networkID,
        Integer networkIndex,
        Optional<Long> breadcrumb,
        int timedInvokeTimeoutMs) {
      reorderNetwork(
          chipClusterPtr, callback, networkID, networkIndex, breadcrumb, timedInvokeTimeoutMs);
    }

    private native void scanNetworks(
        long chipClusterPtr,
        ScanNetworksResponseCallback Callback,
        @Nullable Optional<byte[]> ssid,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addOrUpdateWiFiNetwork(
        long chipClusterPtr,
        NetworkConfigResponseCallback Callback,
        byte[] ssid,
        byte[] credentials,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addOrUpdateThreadNetwork(
        long chipClusterPtr,
        NetworkConfigResponseCallback Callback,
        byte[] operationalDataset,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeNetwork(
        long chipClusterPtr,
        NetworkConfigResponseCallback Callback,
        byte[] networkID,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void connectNetwork(
        long chipClusterPtr,
        ConnectNetworkResponseCallback Callback,
        byte[] networkID,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void reorderNetwork(
        long chipClusterPtr,
        NetworkConfigResponseCallback Callback,
        byte[] networkID,
        Integer networkIndex,
        Optional<Long> breadcrumb,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ScanNetworksResponseCallback {
      void onSuccess(
          Integer networkingStatus,
          Optional<String> debugText,
          Optional<ArrayList<ChipStructs.NetworkCommissioningClusterWiFiInterfaceScanResult>>
              wiFiScanResults,
          Optional<ArrayList<ChipStructs.NetworkCommissioningClusterThreadInterfaceScanResult>>
              threadScanResults);

      void onError(Exception error);
    }

    public interface NetworkConfigResponseCallback {
      void onSuccess(
          Integer networkingStatus, Optional<String> debugText, Optional<Integer> networkIndex);

      void onError(Exception error);
    }

    public interface ConnectNetworkResponseCallback {
      void onSuccess(
          Integer networkingStatus, Optional<String> debugText, @Nullable Long errorValue);

      void onError(Exception error);
    }

    public interface NetworksAttributeCallback {
      void onSuccess(List<ChipStructs.NetworkCommissioningClusterNetworkInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LastNetworkingStatusAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LastNetworkIDAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LastConnectErrorValueAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMaxNetworksAttribute(IntegerAttributeCallback callback) {
      readMaxNetworksAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxNetworksAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxNetworksAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNetworksAttribute(NetworksAttributeCallback callback) {
      readNetworksAttribute(chipClusterPtr, callback);
    }

    public void subscribeNetworksAttribute(
        NetworksAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNetworksAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScanMaxTimeSecondsAttribute(IntegerAttributeCallback callback) {
      readScanMaxTimeSecondsAttribute(chipClusterPtr, callback);
    }

    public void subscribeScanMaxTimeSecondsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScanMaxTimeSecondsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readConnectMaxTimeSecondsAttribute(IntegerAttributeCallback callback) {
      readConnectMaxTimeSecondsAttribute(chipClusterPtr, callback);
    }

    public void subscribeConnectMaxTimeSecondsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeConnectMaxTimeSecondsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInterfaceEnabledAttribute(BooleanAttributeCallback callback) {
      readInterfaceEnabledAttribute(chipClusterPtr, callback);
    }

    public void writeInterfaceEnabledAttribute(DefaultClusterCallback callback, Boolean value) {
      writeInterfaceEnabledAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInterfaceEnabledAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeInterfaceEnabledAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInterfaceEnabledAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInterfaceEnabledAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLastNetworkingStatusAttribute(LastNetworkingStatusAttributeCallback callback) {
      readLastNetworkingStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeLastNetworkingStatusAttribute(
        LastNetworkingStatusAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLastNetworkingStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLastNetworkIDAttribute(LastNetworkIDAttributeCallback callback) {
      readLastNetworkIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeLastNetworkIDAttribute(
        LastNetworkIDAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLastNetworkIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLastConnectErrorValueAttribute(
        LastConnectErrorValueAttributeCallback callback) {
      readLastConnectErrorValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeLastConnectErrorValueAttribute(
        LastConnectErrorValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLastConnectErrorValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMaxNetworksAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxNetworksAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNetworksAttribute(
        long chipClusterPtr, NetworksAttributeCallback callback);

    private native void subscribeNetworksAttribute(
        long chipClusterPtr, NetworksAttributeCallback callback, int minInterval, int maxInterval);

    private native void readScanMaxTimeSecondsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeScanMaxTimeSecondsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readConnectMaxTimeSecondsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeConnectMaxTimeSecondsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInterfaceEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeInterfaceEnabledAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInterfaceEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLastNetworkingStatusAttribute(
        long chipClusterPtr, LastNetworkingStatusAttributeCallback callback);

    private native void subscribeLastNetworkingStatusAttribute(
        long chipClusterPtr,
        LastNetworkingStatusAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLastNetworkIDAttribute(
        long chipClusterPtr, LastNetworkIDAttributeCallback callback);

    private native void subscribeLastNetworkIDAttribute(
        long chipClusterPtr,
        LastNetworkIDAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLastConnectErrorValueAttribute(
        long chipClusterPtr, LastConnectErrorValueAttributeCallback callback);

    private native void subscribeLastConnectErrorValueAttribute(
        long chipClusterPtr,
        LastConnectErrorValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class DiagnosticLogsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 50L;

    public DiagnosticLogsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void retrieveLogsRequest(
        RetrieveLogsResponseCallback callback,
        Integer intent,
        Integer requestedProtocol,
        byte[] transferFileDesignator) {
      retrieveLogsRequest(
          chipClusterPtr, callback, intent, requestedProtocol, transferFileDesignator, null);
    }

    public void retrieveLogsRequest(
        RetrieveLogsResponseCallback callback,
        Integer intent,
        Integer requestedProtocol,
        byte[] transferFileDesignator,
        int timedInvokeTimeoutMs) {
      retrieveLogsRequest(
          chipClusterPtr,
          callback,
          intent,
          requestedProtocol,
          transferFileDesignator,
          timedInvokeTimeoutMs);
    }

    private native void retrieveLogsRequest(
        long chipClusterPtr,
        RetrieveLogsResponseCallback Callback,
        Integer intent,
        Integer requestedProtocol,
        byte[] transferFileDesignator,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface RetrieveLogsResponseCallback {
      void onSuccess(Integer status, byte[] content, Long timeStamp, Long timeSinceBoot);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class GeneralDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 51L;

    public GeneralDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void testEventTrigger(
        DefaultClusterCallback callback, byte[] enableKey, Long eventTrigger) {
      testEventTrigger(chipClusterPtr, callback, enableKey, eventTrigger, null);
    }

    public void testEventTrigger(
        DefaultClusterCallback callback,
        byte[] enableKey,
        Long eventTrigger,
        int timedInvokeTimeoutMs) {
      testEventTrigger(chipClusterPtr, callback, enableKey, eventTrigger, timedInvokeTimeoutMs);
    }

    private native void testEventTrigger(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        byte[] enableKey,
        Long eventTrigger,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface NetworkInterfacesAttributeCallback {
      void onSuccess(List<ChipStructs.GeneralDiagnosticsClusterNetworkInterfaceType> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveHardwareFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveRadioFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveNetworkFaultsAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readNetworkInterfacesAttribute(NetworkInterfacesAttributeCallback callback) {
      readNetworkInterfacesAttribute(chipClusterPtr, callback);
    }

    public void subscribeNetworkInterfacesAttribute(
        NetworkInterfacesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNetworkInterfacesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRebootCountAttribute(IntegerAttributeCallback callback) {
      readRebootCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRebootCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRebootCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUpTimeAttribute(LongAttributeCallback callback) {
      readUpTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeUpTimeAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUpTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTotalOperationalHoursAttribute(LongAttributeCallback callback) {
      readTotalOperationalHoursAttribute(chipClusterPtr, callback);
    }

    public void subscribeTotalOperationalHoursAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTotalOperationalHoursAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBootReasonsAttribute(IntegerAttributeCallback callback) {
      readBootReasonsAttribute(chipClusterPtr, callback);
    }

    public void subscribeBootReasonsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBootReasonsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveHardwareFaultsAttribute(ActiveHardwareFaultsAttributeCallback callback) {
      readActiveHardwareFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveHardwareFaultsAttribute(
        ActiveHardwareFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveHardwareFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveRadioFaultsAttribute(ActiveRadioFaultsAttributeCallback callback) {
      readActiveRadioFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveRadioFaultsAttribute(
        ActiveRadioFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveRadioFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveNetworkFaultsAttribute(ActiveNetworkFaultsAttributeCallback callback) {
      readActiveNetworkFaultsAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveNetworkFaultsAttribute(
        ActiveNetworkFaultsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveNetworkFaultsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTestEventTriggersEnabledAttribute(BooleanAttributeCallback callback) {
      readTestEventTriggersEnabledAttribute(chipClusterPtr, callback);
    }

    public void subscribeTestEventTriggersEnabledAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTestEventTriggersEnabledAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readNetworkInterfacesAttribute(
        long chipClusterPtr, NetworkInterfacesAttributeCallback callback);

    private native void subscribeNetworkInterfacesAttribute(
        long chipClusterPtr,
        NetworkInterfacesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readRebootCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRebootCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUpTimeAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeUpTimeAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTotalOperationalHoursAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTotalOperationalHoursAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBootReasonsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBootReasonsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveHardwareFaultsAttribute(
        long chipClusterPtr, ActiveHardwareFaultsAttributeCallback callback);

    private native void subscribeActiveHardwareFaultsAttribute(
        long chipClusterPtr,
        ActiveHardwareFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readActiveRadioFaultsAttribute(
        long chipClusterPtr, ActiveRadioFaultsAttributeCallback callback);

    private native void subscribeActiveRadioFaultsAttribute(
        long chipClusterPtr,
        ActiveRadioFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readActiveNetworkFaultsAttribute(
        long chipClusterPtr, ActiveNetworkFaultsAttributeCallback callback);

    private native void subscribeActiveNetworkFaultsAttribute(
        long chipClusterPtr,
        ActiveNetworkFaultsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readTestEventTriggersEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeTestEventTriggersEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class SoftwareDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 52L;

    public SoftwareDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void resetWatermarks(DefaultClusterCallback callback) {
      resetWatermarks(chipClusterPtr, callback, null);
    }

    public void resetWatermarks(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      resetWatermarks(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void resetWatermarks(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ThreadMetricsAttributeCallback {
      void onSuccess(List<ChipStructs.SoftwareDiagnosticsClusterThreadMetrics> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readThreadMetricsAttribute(ThreadMetricsAttributeCallback callback) {
      readThreadMetricsAttribute(chipClusterPtr, callback);
    }

    public void subscribeThreadMetricsAttribute(
        ThreadMetricsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeThreadMetricsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentHeapFreeAttribute(LongAttributeCallback callback) {
      readCurrentHeapFreeAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentHeapFreeAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentHeapFreeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentHeapUsedAttribute(LongAttributeCallback callback) {
      readCurrentHeapUsedAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentHeapUsedAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentHeapUsedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentHeapHighWatermarkAttribute(LongAttributeCallback callback) {
      readCurrentHeapHighWatermarkAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentHeapHighWatermarkAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentHeapHighWatermarkAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readThreadMetricsAttribute(
        long chipClusterPtr, ThreadMetricsAttributeCallback callback);

    private native void subscribeThreadMetricsAttribute(
        long chipClusterPtr,
        ThreadMetricsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentHeapFreeAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeCurrentHeapFreeAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentHeapUsedAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeCurrentHeapUsedAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentHeapHighWatermarkAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeCurrentHeapHighWatermarkAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ThreadNetworkDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 53L;

    public ThreadNetworkDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void resetCounts(DefaultClusterCallback callback) {
      resetCounts(chipClusterPtr, callback, null);
    }

    public void resetCounts(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      resetCounts(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void resetCounts(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ChannelAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface RoutingRoleAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NetworkNameAttributeCallback {
      void onSuccess(@Nullable String value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PanIdAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ExtendedPanIdAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MeshLocalPrefixAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NeighborTableListAttributeCallback {
      void onSuccess(List<ChipStructs.ThreadNetworkDiagnosticsClusterNeighborTable> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface RouteTableListAttributeCallback {
      void onSuccess(List<ChipStructs.ThreadNetworkDiagnosticsClusterRouteTable> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PartitionIdAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface WeightingAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DataVersionAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface StableDataVersionAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LeaderRouterIdAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveTimestampAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PendingTimestampAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DelayAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ChannelPage0MaskAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ActiveNetworkFaultsListAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readChannelAttribute(ChannelAttributeCallback callback) {
      readChannelAttribute(chipClusterPtr, callback);
    }

    public void subscribeChannelAttribute(
        ChannelAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChannelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRoutingRoleAttribute(RoutingRoleAttributeCallback callback) {
      readRoutingRoleAttribute(chipClusterPtr, callback);
    }

    public void subscribeRoutingRoleAttribute(
        RoutingRoleAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRoutingRoleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNetworkNameAttribute(NetworkNameAttributeCallback callback) {
      readNetworkNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeNetworkNameAttribute(
        NetworkNameAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNetworkNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPanIdAttribute(PanIdAttributeCallback callback) {
      readPanIdAttribute(chipClusterPtr, callback);
    }

    public void subscribePanIdAttribute(
        PanIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePanIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readExtendedPanIdAttribute(ExtendedPanIdAttributeCallback callback) {
      readExtendedPanIdAttribute(chipClusterPtr, callback);
    }

    public void subscribeExtendedPanIdAttribute(
        ExtendedPanIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeExtendedPanIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMeshLocalPrefixAttribute(MeshLocalPrefixAttributeCallback callback) {
      readMeshLocalPrefixAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeshLocalPrefixAttribute(
        MeshLocalPrefixAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeshLocalPrefixAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOverrunCountAttribute(LongAttributeCallback callback) {
      readOverrunCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeOverrunCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOverrunCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNeighborTableListAttribute(NeighborTableListAttributeCallback callback) {
      readNeighborTableListAttribute(chipClusterPtr, callback);
    }

    public void subscribeNeighborTableListAttribute(
        NeighborTableListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNeighborTableListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRouteTableListAttribute(RouteTableListAttributeCallback callback) {
      readRouteTableListAttribute(chipClusterPtr, callback);
    }

    public void subscribeRouteTableListAttribute(
        RouteTableListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRouteTableListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartitionIdAttribute(PartitionIdAttributeCallback callback) {
      readPartitionIdAttribute(chipClusterPtr, callback);
    }

    public void subscribePartitionIdAttribute(
        PartitionIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartitionIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWeightingAttribute(WeightingAttributeCallback callback) {
      readWeightingAttribute(chipClusterPtr, callback);
    }

    public void subscribeWeightingAttribute(
        WeightingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWeightingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDataVersionAttribute(DataVersionAttributeCallback callback) {
      readDataVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeDataVersionAttribute(
        DataVersionAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDataVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStableDataVersionAttribute(StableDataVersionAttributeCallback callback) {
      readStableDataVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeStableDataVersionAttribute(
        StableDataVersionAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStableDataVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLeaderRouterIdAttribute(LeaderRouterIdAttributeCallback callback) {
      readLeaderRouterIdAttribute(chipClusterPtr, callback);
    }

    public void subscribeLeaderRouterIdAttribute(
        LeaderRouterIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLeaderRouterIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDetachedRoleCountAttribute(IntegerAttributeCallback callback) {
      readDetachedRoleCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeDetachedRoleCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDetachedRoleCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readChildRoleCountAttribute(IntegerAttributeCallback callback) {
      readChildRoleCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeChildRoleCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChildRoleCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRouterRoleCountAttribute(IntegerAttributeCallback callback) {
      readRouterRoleCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRouterRoleCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRouterRoleCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLeaderRoleCountAttribute(IntegerAttributeCallback callback) {
      readLeaderRoleCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeLeaderRoleCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLeaderRoleCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttachAttemptCountAttribute(IntegerAttributeCallback callback) {
      readAttachAttemptCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttachAttemptCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttachAttemptCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartitionIdChangeCountAttribute(IntegerAttributeCallback callback) {
      readPartitionIdChangeCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePartitionIdChangeCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartitionIdChangeCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBetterPartitionAttachAttemptCountAttribute(IntegerAttributeCallback callback) {
      readBetterPartitionAttachAttemptCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeBetterPartitionAttachAttemptCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBetterPartitionAttachAttemptCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readParentChangeCountAttribute(IntegerAttributeCallback callback) {
      readParentChangeCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeParentChangeCountAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeParentChangeCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxTotalCountAttribute(LongAttributeCallback callback) {
      readTxTotalCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxTotalCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxTotalCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxUnicastCountAttribute(LongAttributeCallback callback) {
      readTxUnicastCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxUnicastCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxUnicastCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxBroadcastCountAttribute(LongAttributeCallback callback) {
      readTxBroadcastCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxBroadcastCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxBroadcastCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxAckRequestedCountAttribute(LongAttributeCallback callback) {
      readTxAckRequestedCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxAckRequestedCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxAckRequestedCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxAckedCountAttribute(LongAttributeCallback callback) {
      readTxAckedCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxAckedCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxAckedCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxNoAckRequestedCountAttribute(LongAttributeCallback callback) {
      readTxNoAckRequestedCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxNoAckRequestedCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxNoAckRequestedCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxDataCountAttribute(LongAttributeCallback callback) {
      readTxDataCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxDataCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxDataCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxDataPollCountAttribute(LongAttributeCallback callback) {
      readTxDataPollCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxDataPollCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxDataPollCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxBeaconCountAttribute(LongAttributeCallback callback) {
      readTxBeaconCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxBeaconCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxBeaconCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxBeaconRequestCountAttribute(LongAttributeCallback callback) {
      readTxBeaconRequestCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxBeaconRequestCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxBeaconRequestCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxOtherCountAttribute(LongAttributeCallback callback) {
      readTxOtherCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxOtherCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxOtherCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxRetryCountAttribute(LongAttributeCallback callback) {
      readTxRetryCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxRetryCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxRetryCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxDirectMaxRetryExpiryCountAttribute(LongAttributeCallback callback) {
      readTxDirectMaxRetryExpiryCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxDirectMaxRetryExpiryCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxDirectMaxRetryExpiryCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxIndirectMaxRetryExpiryCountAttribute(LongAttributeCallback callback) {
      readTxIndirectMaxRetryExpiryCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxIndirectMaxRetryExpiryCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxIndirectMaxRetryExpiryCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxErrCcaCountAttribute(LongAttributeCallback callback) {
      readTxErrCcaCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxErrCcaCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxErrCcaCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxErrAbortCountAttribute(LongAttributeCallback callback) {
      readTxErrAbortCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxErrAbortCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxErrAbortCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxErrBusyChannelCountAttribute(LongAttributeCallback callback) {
      readTxErrBusyChannelCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxErrBusyChannelCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxErrBusyChannelCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxTotalCountAttribute(LongAttributeCallback callback) {
      readRxTotalCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxTotalCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxTotalCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxUnicastCountAttribute(LongAttributeCallback callback) {
      readRxUnicastCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxUnicastCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxUnicastCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxBroadcastCountAttribute(LongAttributeCallback callback) {
      readRxBroadcastCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxBroadcastCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxBroadcastCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxDataCountAttribute(LongAttributeCallback callback) {
      readRxDataCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxDataCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxDataCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxDataPollCountAttribute(LongAttributeCallback callback) {
      readRxDataPollCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxDataPollCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxDataPollCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxBeaconCountAttribute(LongAttributeCallback callback) {
      readRxBeaconCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxBeaconCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxBeaconCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxBeaconRequestCountAttribute(LongAttributeCallback callback) {
      readRxBeaconRequestCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxBeaconRequestCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxBeaconRequestCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxOtherCountAttribute(LongAttributeCallback callback) {
      readRxOtherCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxOtherCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxOtherCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxAddressFilteredCountAttribute(LongAttributeCallback callback) {
      readRxAddressFilteredCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxAddressFilteredCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxAddressFilteredCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxDestAddrFilteredCountAttribute(LongAttributeCallback callback) {
      readRxDestAddrFilteredCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxDestAddrFilteredCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxDestAddrFilteredCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxDuplicatedCountAttribute(LongAttributeCallback callback) {
      readRxDuplicatedCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxDuplicatedCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxDuplicatedCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrNoFrameCountAttribute(LongAttributeCallback callback) {
      readRxErrNoFrameCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrNoFrameCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrNoFrameCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrUnknownNeighborCountAttribute(LongAttributeCallback callback) {
      readRxErrUnknownNeighborCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrUnknownNeighborCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrUnknownNeighborCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrInvalidSrcAddrCountAttribute(LongAttributeCallback callback) {
      readRxErrInvalidSrcAddrCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrInvalidSrcAddrCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrInvalidSrcAddrCountAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrSecCountAttribute(LongAttributeCallback callback) {
      readRxErrSecCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrSecCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrSecCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrFcsCountAttribute(LongAttributeCallback callback) {
      readRxErrFcsCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrFcsCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrFcsCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRxErrOtherCountAttribute(LongAttributeCallback callback) {
      readRxErrOtherCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeRxErrOtherCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRxErrOtherCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveTimestampAttribute(ActiveTimestampAttributeCallback callback) {
      readActiveTimestampAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveTimestampAttribute(
        ActiveTimestampAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveTimestampAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPendingTimestampAttribute(PendingTimestampAttributeCallback callback) {
      readPendingTimestampAttribute(chipClusterPtr, callback);
    }

    public void subscribePendingTimestampAttribute(
        PendingTimestampAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePendingTimestampAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDelayAttribute(DelayAttributeCallback callback) {
      readDelayAttribute(chipClusterPtr, callback);
    }

    public void subscribeDelayAttribute(
        DelayAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDelayAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readChannelPage0MaskAttribute(ChannelPage0MaskAttributeCallback callback) {
      readChannelPage0MaskAttribute(chipClusterPtr, callback);
    }

    public void subscribeChannelPage0MaskAttribute(
        ChannelPage0MaskAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChannelPage0MaskAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActiveNetworkFaultsListAttribute(
        ActiveNetworkFaultsListAttributeCallback callback) {
      readActiveNetworkFaultsListAttribute(chipClusterPtr, callback);
    }

    public void subscribeActiveNetworkFaultsListAttribute(
        ActiveNetworkFaultsListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActiveNetworkFaultsListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readChannelAttribute(
        long chipClusterPtr, ChannelAttributeCallback callback);

    private native void subscribeChannelAttribute(
        long chipClusterPtr, ChannelAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRoutingRoleAttribute(
        long chipClusterPtr, RoutingRoleAttributeCallback callback);

    private native void subscribeRoutingRoleAttribute(
        long chipClusterPtr,
        RoutingRoleAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNetworkNameAttribute(
        long chipClusterPtr, NetworkNameAttributeCallback callback);

    private native void subscribeNetworkNameAttribute(
        long chipClusterPtr,
        NetworkNameAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPanIdAttribute(long chipClusterPtr, PanIdAttributeCallback callback);

    private native void subscribePanIdAttribute(
        long chipClusterPtr, PanIdAttributeCallback callback, int minInterval, int maxInterval);

    private native void readExtendedPanIdAttribute(
        long chipClusterPtr, ExtendedPanIdAttributeCallback callback);

    private native void subscribeExtendedPanIdAttribute(
        long chipClusterPtr,
        ExtendedPanIdAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMeshLocalPrefixAttribute(
        long chipClusterPtr, MeshLocalPrefixAttributeCallback callback);

    private native void subscribeMeshLocalPrefixAttribute(
        long chipClusterPtr,
        MeshLocalPrefixAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOverrunCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeOverrunCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNeighborTableListAttribute(
        long chipClusterPtr, NeighborTableListAttributeCallback callback);

    private native void subscribeNeighborTableListAttribute(
        long chipClusterPtr,
        NeighborTableListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readRouteTableListAttribute(
        long chipClusterPtr, RouteTableListAttributeCallback callback);

    private native void subscribeRouteTableListAttribute(
        long chipClusterPtr,
        RouteTableListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPartitionIdAttribute(
        long chipClusterPtr, PartitionIdAttributeCallback callback);

    private native void subscribePartitionIdAttribute(
        long chipClusterPtr,
        PartitionIdAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWeightingAttribute(
        long chipClusterPtr, WeightingAttributeCallback callback);

    private native void subscribeWeightingAttribute(
        long chipClusterPtr, WeightingAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDataVersionAttribute(
        long chipClusterPtr, DataVersionAttributeCallback callback);

    private native void subscribeDataVersionAttribute(
        long chipClusterPtr,
        DataVersionAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readStableDataVersionAttribute(
        long chipClusterPtr, StableDataVersionAttributeCallback callback);

    private native void subscribeStableDataVersionAttribute(
        long chipClusterPtr,
        StableDataVersionAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLeaderRouterIdAttribute(
        long chipClusterPtr, LeaderRouterIdAttributeCallback callback);

    private native void subscribeLeaderRouterIdAttribute(
        long chipClusterPtr,
        LeaderRouterIdAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readDetachedRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeDetachedRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readChildRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeChildRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRouterRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRouterRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLeaderRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeLeaderRoleCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttachAttemptCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAttachAttemptCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPartitionIdChangeCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePartitionIdChangeCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBetterPartitionAttachAttemptCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBetterPartitionAttachAttemptCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readParentChangeCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeParentChangeCountAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxTotalCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxTotalCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxUnicastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxUnicastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxBroadcastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxBroadcastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxAckRequestedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxAckRequestedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxAckedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxAckedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxNoAckRequestedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxNoAckRequestedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxDataCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxDataCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxDataPollCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxDataPollCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxBeaconCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxBeaconCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxBeaconRequestCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxBeaconRequestCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxRetryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxRetryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxDirectMaxRetryExpiryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxDirectMaxRetryExpiryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxIndirectMaxRetryExpiryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxIndirectMaxRetryExpiryCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxErrCcaCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxErrCcaCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxErrAbortCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxErrAbortCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxErrBusyChannelCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxErrBusyChannelCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxTotalCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxTotalCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxUnicastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxUnicastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxBroadcastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxBroadcastCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxDataCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxDataCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxDataPollCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxDataPollCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxBeaconCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxBeaconCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxBeaconRequestCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxBeaconRequestCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxAddressFilteredCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxAddressFilteredCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxDestAddrFilteredCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxDestAddrFilteredCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxDuplicatedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxDuplicatedCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrNoFrameCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrNoFrameCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrUnknownNeighborCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrUnknownNeighborCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrInvalidSrcAddrCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrInvalidSrcAddrCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrSecCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrSecCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrFcsCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrFcsCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRxErrOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeRxErrOtherCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActiveTimestampAttribute(
        long chipClusterPtr, ActiveTimestampAttributeCallback callback);

    private native void subscribeActiveTimestampAttribute(
        long chipClusterPtr,
        ActiveTimestampAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPendingTimestampAttribute(
        long chipClusterPtr, PendingTimestampAttributeCallback callback);

    private native void subscribePendingTimestampAttribute(
        long chipClusterPtr,
        PendingTimestampAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readDelayAttribute(long chipClusterPtr, DelayAttributeCallback callback);

    private native void subscribeDelayAttribute(
        long chipClusterPtr, DelayAttributeCallback callback, int minInterval, int maxInterval);

    private native void readChannelPage0MaskAttribute(
        long chipClusterPtr, ChannelPage0MaskAttributeCallback callback);

    private native void subscribeChannelPage0MaskAttribute(
        long chipClusterPtr,
        ChannelPage0MaskAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readActiveNetworkFaultsListAttribute(
        long chipClusterPtr, ActiveNetworkFaultsListAttributeCallback callback);

    private native void subscribeActiveNetworkFaultsListAttribute(
        long chipClusterPtr,
        ActiveNetworkFaultsListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class WiFiNetworkDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 54L;

    public WiFiNetworkDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void resetCounts(DefaultClusterCallback callback) {
      resetCounts(chipClusterPtr, callback, null);
    }

    public void resetCounts(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      resetCounts(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void resetCounts(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface BssidAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SecurityTypeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface WiFiVersionAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ChannelNumberAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface RssiAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BeaconLostCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BeaconRxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PacketMulticastRxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PacketMulticastTxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PacketUnicastRxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PacketUnicastTxCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentMaxRateAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OverrunCountAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBssidAttribute(BssidAttributeCallback callback) {
      readBssidAttribute(chipClusterPtr, callback);
    }

    public void subscribeBssidAttribute(
        BssidAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBssidAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSecurityTypeAttribute(SecurityTypeAttributeCallback callback) {
      readSecurityTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeSecurityTypeAttribute(
        SecurityTypeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSecurityTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWiFiVersionAttribute(WiFiVersionAttributeCallback callback) {
      readWiFiVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeWiFiVersionAttribute(
        WiFiVersionAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWiFiVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readChannelNumberAttribute(ChannelNumberAttributeCallback callback) {
      readChannelNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribeChannelNumberAttribute(
        ChannelNumberAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChannelNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRssiAttribute(RssiAttributeCallback callback) {
      readRssiAttribute(chipClusterPtr, callback);
    }

    public void subscribeRssiAttribute(
        RssiAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRssiAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBeaconLostCountAttribute(BeaconLostCountAttributeCallback callback) {
      readBeaconLostCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeBeaconLostCountAttribute(
        BeaconLostCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBeaconLostCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBeaconRxCountAttribute(BeaconRxCountAttributeCallback callback) {
      readBeaconRxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeBeaconRxCountAttribute(
        BeaconRxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBeaconRxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketMulticastRxCountAttribute(
        PacketMulticastRxCountAttributeCallback callback) {
      readPacketMulticastRxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketMulticastRxCountAttribute(
        PacketMulticastRxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketMulticastRxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketMulticastTxCountAttribute(
        PacketMulticastTxCountAttributeCallback callback) {
      readPacketMulticastTxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketMulticastTxCountAttribute(
        PacketMulticastTxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketMulticastTxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketUnicastRxCountAttribute(PacketUnicastRxCountAttributeCallback callback) {
      readPacketUnicastRxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketUnicastRxCountAttribute(
        PacketUnicastRxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketUnicastRxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketUnicastTxCountAttribute(PacketUnicastTxCountAttributeCallback callback) {
      readPacketUnicastTxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketUnicastTxCountAttribute(
        PacketUnicastTxCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketUnicastTxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentMaxRateAttribute(CurrentMaxRateAttributeCallback callback) {
      readCurrentMaxRateAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentMaxRateAttribute(
        CurrentMaxRateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentMaxRateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOverrunCountAttribute(OverrunCountAttributeCallback callback) {
      readOverrunCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeOverrunCountAttribute(
        OverrunCountAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOverrunCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBssidAttribute(long chipClusterPtr, BssidAttributeCallback callback);

    private native void subscribeBssidAttribute(
        long chipClusterPtr, BssidAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSecurityTypeAttribute(
        long chipClusterPtr, SecurityTypeAttributeCallback callback);

    private native void subscribeSecurityTypeAttribute(
        long chipClusterPtr,
        SecurityTypeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWiFiVersionAttribute(
        long chipClusterPtr, WiFiVersionAttributeCallback callback);

    private native void subscribeWiFiVersionAttribute(
        long chipClusterPtr,
        WiFiVersionAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readChannelNumberAttribute(
        long chipClusterPtr, ChannelNumberAttributeCallback callback);

    private native void subscribeChannelNumberAttribute(
        long chipClusterPtr,
        ChannelNumberAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readRssiAttribute(long chipClusterPtr, RssiAttributeCallback callback);

    private native void subscribeRssiAttribute(
        long chipClusterPtr, RssiAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBeaconLostCountAttribute(
        long chipClusterPtr, BeaconLostCountAttributeCallback callback);

    private native void subscribeBeaconLostCountAttribute(
        long chipClusterPtr,
        BeaconLostCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBeaconRxCountAttribute(
        long chipClusterPtr, BeaconRxCountAttributeCallback callback);

    private native void subscribeBeaconRxCountAttribute(
        long chipClusterPtr,
        BeaconRxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketMulticastRxCountAttribute(
        long chipClusterPtr, PacketMulticastRxCountAttributeCallback callback);

    private native void subscribePacketMulticastRxCountAttribute(
        long chipClusterPtr,
        PacketMulticastRxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketMulticastTxCountAttribute(
        long chipClusterPtr, PacketMulticastTxCountAttributeCallback callback);

    private native void subscribePacketMulticastTxCountAttribute(
        long chipClusterPtr,
        PacketMulticastTxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketUnicastRxCountAttribute(
        long chipClusterPtr, PacketUnicastRxCountAttributeCallback callback);

    private native void subscribePacketUnicastRxCountAttribute(
        long chipClusterPtr,
        PacketUnicastRxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketUnicastTxCountAttribute(
        long chipClusterPtr, PacketUnicastTxCountAttributeCallback callback);

    private native void subscribePacketUnicastTxCountAttribute(
        long chipClusterPtr,
        PacketUnicastTxCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentMaxRateAttribute(
        long chipClusterPtr, CurrentMaxRateAttributeCallback callback);

    private native void subscribeCurrentMaxRateAttribute(
        long chipClusterPtr,
        CurrentMaxRateAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOverrunCountAttribute(
        long chipClusterPtr, OverrunCountAttributeCallback callback);

    private native void subscribeOverrunCountAttribute(
        long chipClusterPtr,
        OverrunCountAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class EthernetNetworkDiagnosticsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 55L;

    public EthernetNetworkDiagnosticsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void resetCounts(DefaultClusterCallback callback) {
      resetCounts(chipClusterPtr, callback, null);
    }

    public void resetCounts(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      resetCounts(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void resetCounts(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface PHYRateAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface FullDuplexAttributeCallback {
      void onSuccess(@Nullable Boolean value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CarrierDetectAttributeCallback {
      void onSuccess(@Nullable Boolean value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readPHYRateAttribute(PHYRateAttributeCallback callback) {
      readPHYRateAttribute(chipClusterPtr, callback);
    }

    public void subscribePHYRateAttribute(
        PHYRateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePHYRateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFullDuplexAttribute(FullDuplexAttributeCallback callback) {
      readFullDuplexAttribute(chipClusterPtr, callback);
    }

    public void subscribeFullDuplexAttribute(
        FullDuplexAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFullDuplexAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketRxCountAttribute(LongAttributeCallback callback) {
      readPacketRxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketRxCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketRxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPacketTxCountAttribute(LongAttributeCallback callback) {
      readPacketTxCountAttribute(chipClusterPtr, callback);
    }

    public void subscribePacketTxCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePacketTxCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTxErrCountAttribute(LongAttributeCallback callback) {
      readTxErrCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeTxErrCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTxErrCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCollisionCountAttribute(LongAttributeCallback callback) {
      readCollisionCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeCollisionCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCollisionCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOverrunCountAttribute(LongAttributeCallback callback) {
      readOverrunCountAttribute(chipClusterPtr, callback);
    }

    public void subscribeOverrunCountAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOverrunCountAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCarrierDetectAttribute(CarrierDetectAttributeCallback callback) {
      readCarrierDetectAttribute(chipClusterPtr, callback);
    }

    public void subscribeCarrierDetectAttribute(
        CarrierDetectAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCarrierDetectAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTimeSinceResetAttribute(LongAttributeCallback callback) {
      readTimeSinceResetAttribute(chipClusterPtr, callback);
    }

    public void subscribeTimeSinceResetAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTimeSinceResetAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readPHYRateAttribute(
        long chipClusterPtr, PHYRateAttributeCallback callback);

    private native void subscribePHYRateAttribute(
        long chipClusterPtr, PHYRateAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFullDuplexAttribute(
        long chipClusterPtr, FullDuplexAttributeCallback callback);

    private native void subscribeFullDuplexAttribute(
        long chipClusterPtr,
        FullDuplexAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPacketRxCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribePacketRxCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPacketTxCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribePacketTxCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTxErrCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTxErrCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCollisionCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeCollisionCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOverrunCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeOverrunCountAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCarrierDetectAttribute(
        long chipClusterPtr, CarrierDetectAttributeCallback callback);

    private native void subscribeCarrierDetectAttribute(
        long chipClusterPtr,
        CarrierDetectAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readTimeSinceResetAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTimeSinceResetAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BridgedDeviceBasicCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 57L;

    public BridgedDeviceBasicCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface VendorIDAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readVendorNameAttribute(CharStringAttributeCallback callback) {
      readVendorNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorIDAttribute(VendorIDAttributeCallback callback) {
      readVendorIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorIDAttribute(
        VendorIDAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductNameAttribute(CharStringAttributeCallback callback) {
      readProductNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNodeLabelAttribute(CharStringAttributeCallback callback) {
      readNodeLabelAttribute(chipClusterPtr, callback);
    }

    public void writeNodeLabelAttribute(DefaultClusterCallback callback, String value) {
      writeNodeLabelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNodeLabelAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeNodeLabelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNodeLabelAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNodeLabelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readHardwareVersionAttribute(IntegerAttributeCallback callback) {
      readHardwareVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeHardwareVersionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHardwareVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readHardwareVersionStringAttribute(CharStringAttributeCallback callback) {
      readHardwareVersionStringAttribute(chipClusterPtr, callback);
    }

    public void subscribeHardwareVersionStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeHardwareVersionStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoftwareVersionAttribute(LongAttributeCallback callback) {
      readSoftwareVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeSoftwareVersionAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoftwareVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoftwareVersionStringAttribute(CharStringAttributeCallback callback) {
      readSoftwareVersionStringAttribute(chipClusterPtr, callback);
    }

    public void subscribeSoftwareVersionStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoftwareVersionStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readManufacturingDateAttribute(CharStringAttributeCallback callback) {
      readManufacturingDateAttribute(chipClusterPtr, callback);
    }

    public void subscribeManufacturingDateAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeManufacturingDateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPartNumberAttribute(CharStringAttributeCallback callback) {
      readPartNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribePartNumberAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePartNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductURLAttribute(CharStringAttributeCallback callback) {
      readProductURLAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductURLAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductURLAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductLabelAttribute(CharStringAttributeCallback callback) {
      readProductLabelAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductLabelAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductLabelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSerialNumberAttribute(CharStringAttributeCallback callback) {
      readSerialNumberAttribute(chipClusterPtr, callback);
    }

    public void subscribeSerialNumberAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSerialNumberAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readReachableAttribute(BooleanAttributeCallback callback) {
      readReachableAttribute(chipClusterPtr, callback);
    }

    public void subscribeReachableAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeReachableAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUniqueIDAttribute(CharStringAttributeCallback callback) {
      readUniqueIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeUniqueIDAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUniqueIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readVendorNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeVendorNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback);

    private native void subscribeVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback, int minInterval, int maxInterval);

    private native void readProductNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNodeLabelAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeNodeLabelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNodeLabelAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readHardwareVersionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeHardwareVersionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readHardwareVersionStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeHardwareVersionStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSoftwareVersionAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeSoftwareVersionAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSoftwareVersionStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSoftwareVersionStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readManufacturingDateAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeManufacturingDateAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPartNumberAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribePartNumberAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductURLAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductURLAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductLabelAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeProductLabelAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSerialNumberAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeSerialNumberAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readReachableAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeReachableAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUniqueIDAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeUniqueIDAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class SwitchCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 59L;

    public SwitchCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readNumberOfPositionsAttribute(IntegerAttributeCallback callback) {
      readNumberOfPositionsAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfPositionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfPositionsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionAttribute(IntegerAttributeCallback callback) {
      readCurrentPositionAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMultiPressMaxAttribute(IntegerAttributeCallback callback) {
      readMultiPressMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeMultiPressMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMultiPressMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readNumberOfPositionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfPositionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentPositionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentPositionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMultiPressMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMultiPressMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class AdministratorCommissioningCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 60L;

    public AdministratorCommissioningCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void openCommissioningWindow(
        DefaultClusterCallback callback,
        Integer commissioningTimeout,
        byte[] PAKEVerifier,
        Integer discriminator,
        Long iterations,
        byte[] salt,
        int timedInvokeTimeoutMs) {
      openCommissioningWindow(
          chipClusterPtr,
          callback,
          commissioningTimeout,
          PAKEVerifier,
          discriminator,
          iterations,
          salt,
          timedInvokeTimeoutMs);
    }

    public void openBasicCommissioningWindow(
        DefaultClusterCallback callback, Integer commissioningTimeout, int timedInvokeTimeoutMs) {
      openBasicCommissioningWindow(
          chipClusterPtr, callback, commissioningTimeout, timedInvokeTimeoutMs);
    }

    public void revokeCommissioning(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      revokeCommissioning(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void openCommissioningWindow(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer commissioningTimeout,
        byte[] PAKEVerifier,
        Integer discriminator,
        Long iterations,
        byte[] salt,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void openBasicCommissioningWindow(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer commissioningTimeout,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void revokeCommissioning(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface AdminFabricIndexAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AdminVendorIdAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readWindowStatusAttribute(IntegerAttributeCallback callback) {
      readWindowStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeWindowStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWindowStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAdminFabricIndexAttribute(AdminFabricIndexAttributeCallback callback) {
      readAdminFabricIndexAttribute(chipClusterPtr, callback);
    }

    public void subscribeAdminFabricIndexAttribute(
        AdminFabricIndexAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAdminFabricIndexAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAdminVendorIdAttribute(AdminVendorIdAttributeCallback callback) {
      readAdminVendorIdAttribute(chipClusterPtr, callback);
    }

    public void subscribeAdminVendorIdAttribute(
        AdminVendorIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAdminVendorIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readWindowStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeWindowStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAdminFabricIndexAttribute(
        long chipClusterPtr, AdminFabricIndexAttributeCallback callback);

    private native void subscribeAdminFabricIndexAttribute(
        long chipClusterPtr,
        AdminFabricIndexAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAdminVendorIdAttribute(
        long chipClusterPtr, AdminVendorIdAttributeCallback callback);

    private native void subscribeAdminVendorIdAttribute(
        long chipClusterPtr,
        AdminVendorIdAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OperationalCredentialsCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 62L;

    public OperationalCredentialsCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void attestationRequest(AttestationResponseCallback callback, byte[] attestationNonce) {
      attestationRequest(chipClusterPtr, callback, attestationNonce, null);
    }

    public void attestationRequest(
        AttestationResponseCallback callback, byte[] attestationNonce, int timedInvokeTimeoutMs) {
      attestationRequest(chipClusterPtr, callback, attestationNonce, timedInvokeTimeoutMs);
    }

    public void certificateChainRequest(
        CertificateChainResponseCallback callback, Integer certificateType) {
      certificateChainRequest(chipClusterPtr, callback, certificateType, null);
    }

    public void certificateChainRequest(
        CertificateChainResponseCallback callback,
        Integer certificateType,
        int timedInvokeTimeoutMs) {
      certificateChainRequest(chipClusterPtr, callback, certificateType, timedInvokeTimeoutMs);
    }

    public void CSRRequest(
        CSRResponseCallback callback, byte[] CSRNonce, Optional<Boolean> isForUpdateNOC) {
      CSRRequest(chipClusterPtr, callback, CSRNonce, isForUpdateNOC, null);
    }

    public void CSRRequest(
        CSRResponseCallback callback,
        byte[] CSRNonce,
        Optional<Boolean> isForUpdateNOC,
        int timedInvokeTimeoutMs) {
      CSRRequest(chipClusterPtr, callback, CSRNonce, isForUpdateNOC, timedInvokeTimeoutMs);
    }

    public void addNOC(
        NOCResponseCallback callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        byte[] IPKValue,
        Long caseAdminSubject,
        Integer adminVendorId) {
      addNOC(
          chipClusterPtr,
          callback,
          NOCValue,
          ICACValue,
          IPKValue,
          caseAdminSubject,
          adminVendorId,
          null);
    }

    public void addNOC(
        NOCResponseCallback callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        byte[] IPKValue,
        Long caseAdminSubject,
        Integer adminVendorId,
        int timedInvokeTimeoutMs) {
      addNOC(
          chipClusterPtr,
          callback,
          NOCValue,
          ICACValue,
          IPKValue,
          caseAdminSubject,
          adminVendorId,
          timedInvokeTimeoutMs);
    }

    public void updateNOC(
        NOCResponseCallback callback, byte[] NOCValue, Optional<byte[]> ICACValue) {
      updateNOC(chipClusterPtr, callback, NOCValue, ICACValue, null);
    }

    public void updateNOC(
        NOCResponseCallback callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        int timedInvokeTimeoutMs) {
      updateNOC(chipClusterPtr, callback, NOCValue, ICACValue, timedInvokeTimeoutMs);
    }

    public void updateFabricLabel(NOCResponseCallback callback, String label) {
      updateFabricLabel(chipClusterPtr, callback, label, null);
    }

    public void updateFabricLabel(
        NOCResponseCallback callback, String label, int timedInvokeTimeoutMs) {
      updateFabricLabel(chipClusterPtr, callback, label, timedInvokeTimeoutMs);
    }

    public void removeFabric(NOCResponseCallback callback, Integer fabricIndex) {
      removeFabric(chipClusterPtr, callback, fabricIndex, null);
    }

    public void removeFabric(
        NOCResponseCallback callback, Integer fabricIndex, int timedInvokeTimeoutMs) {
      removeFabric(chipClusterPtr, callback, fabricIndex, timedInvokeTimeoutMs);
    }

    public void addTrustedRootCertificate(DefaultClusterCallback callback, byte[] rootCertificate) {
      addTrustedRootCertificate(chipClusterPtr, callback, rootCertificate, null);
    }

    public void addTrustedRootCertificate(
        DefaultClusterCallback callback, byte[] rootCertificate, int timedInvokeTimeoutMs) {
      addTrustedRootCertificate(chipClusterPtr, callback, rootCertificate, timedInvokeTimeoutMs);
    }

    private native void attestationRequest(
        long chipClusterPtr,
        AttestationResponseCallback Callback,
        byte[] attestationNonce,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void certificateChainRequest(
        long chipClusterPtr,
        CertificateChainResponseCallback Callback,
        Integer certificateType,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void CSRRequest(
        long chipClusterPtr,
        CSRResponseCallback Callback,
        byte[] CSRNonce,
        Optional<Boolean> isForUpdateNOC,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addNOC(
        long chipClusterPtr,
        NOCResponseCallback Callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        byte[] IPKValue,
        Long caseAdminSubject,
        Integer adminVendorId,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void updateNOC(
        long chipClusterPtr,
        NOCResponseCallback Callback,
        byte[] NOCValue,
        Optional<byte[]> ICACValue,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void updateFabricLabel(
        long chipClusterPtr,
        NOCResponseCallback Callback,
        String label,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void removeFabric(
        long chipClusterPtr,
        NOCResponseCallback Callback,
        Integer fabricIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void addTrustedRootCertificate(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        byte[] rootCertificate,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface AttestationResponseCallback {
      void onSuccess(byte[] attestationElements, byte[] signature);

      void onError(Exception error);
    }

    public interface CertificateChainResponseCallback {
      void onSuccess(byte[] certificate);

      void onError(Exception error);
    }

    public interface CSRResponseCallback {
      void onSuccess(byte[] NOCSRElements, byte[] attestationSignature);

      void onError(Exception error);
    }

    public interface NOCResponseCallback {
      void onSuccess(Integer statusCode, Optional<Integer> fabricIndex, Optional<String> debugText);

      void onError(Exception error);
    }

    public interface NOCsAttributeCallback {
      void onSuccess(List<ChipStructs.OperationalCredentialsClusterNOCStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface FabricsAttributeCallback {
      void onSuccess(List<ChipStructs.OperationalCredentialsClusterFabricDescriptor> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface TrustedRootCertificatesAttributeCallback {
      void onSuccess(List<byte[]> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readNOCsAttribute(NOCsAttributeCallback callback) {
      readNOCsAttribute(chipClusterPtr, callback);
    }

    public void subscribeNOCsAttribute(
        NOCsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNOCsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFabricsAttribute(FabricsAttributeCallback callback) {
      readFabricsAttribute(chipClusterPtr, callback);
    }

    public void subscribeFabricsAttribute(
        FabricsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFabricsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedFabricsAttribute(IntegerAttributeCallback callback) {
      readSupportedFabricsAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedFabricsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedFabricsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCommissionedFabricsAttribute(IntegerAttributeCallback callback) {
      readCommissionedFabricsAttribute(chipClusterPtr, callback);
    }

    public void subscribeCommissionedFabricsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCommissionedFabricsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTrustedRootCertificatesAttribute(
        TrustedRootCertificatesAttributeCallback callback) {
      readTrustedRootCertificatesAttribute(chipClusterPtr, callback);
    }

    public void subscribeTrustedRootCertificatesAttribute(
        TrustedRootCertificatesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTrustedRootCertificatesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentFabricIndexAttribute(IntegerAttributeCallback callback) {
      readCurrentFabricIndexAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentFabricIndexAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentFabricIndexAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readNOCsAttribute(long chipClusterPtr, NOCsAttributeCallback callback);

    private native void subscribeNOCsAttribute(
        long chipClusterPtr, NOCsAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFabricsAttribute(
        long chipClusterPtr, FabricsAttributeCallback callback);

    private native void subscribeFabricsAttribute(
        long chipClusterPtr, FabricsAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSupportedFabricsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSupportedFabricsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCommissionedFabricsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCommissionedFabricsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTrustedRootCertificatesAttribute(
        long chipClusterPtr, TrustedRootCertificatesAttributeCallback callback);

    private native void subscribeTrustedRootCertificatesAttribute(
        long chipClusterPtr,
        TrustedRootCertificatesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentFabricIndexAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentFabricIndexAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class GroupKeyManagementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 63L;

    public GroupKeyManagementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void keySetWrite(
        DefaultClusterCallback callback,
        ChipStructs.GroupKeyManagementClusterGroupKeySetStruct groupKeySet) {
      keySetWrite(chipClusterPtr, callback, groupKeySet, null);
    }

    public void keySetWrite(
        DefaultClusterCallback callback,
        ChipStructs.GroupKeyManagementClusterGroupKeySetStruct groupKeySet,
        int timedInvokeTimeoutMs) {
      keySetWrite(chipClusterPtr, callback, groupKeySet, timedInvokeTimeoutMs);
    }

    public void keySetRead(KeySetReadResponseCallback callback, Integer groupKeySetID) {
      keySetRead(chipClusterPtr, callback, groupKeySetID, null);
    }

    public void keySetRead(
        KeySetReadResponseCallback callback, Integer groupKeySetID, int timedInvokeTimeoutMs) {
      keySetRead(chipClusterPtr, callback, groupKeySetID, timedInvokeTimeoutMs);
    }

    public void keySetRemove(DefaultClusterCallback callback, Integer groupKeySetID) {
      keySetRemove(chipClusterPtr, callback, groupKeySetID, null);
    }

    public void keySetRemove(
        DefaultClusterCallback callback, Integer groupKeySetID, int timedInvokeTimeoutMs) {
      keySetRemove(chipClusterPtr, callback, groupKeySetID, timedInvokeTimeoutMs);
    }

    public void keySetReadAllIndices(
        KeySetReadAllIndicesResponseCallback callback, ArrayList<Integer> groupKeySetIDs) {
      keySetReadAllIndices(chipClusterPtr, callback, groupKeySetIDs, null);
    }

    public void keySetReadAllIndices(
        KeySetReadAllIndicesResponseCallback callback,
        ArrayList<Integer> groupKeySetIDs,
        int timedInvokeTimeoutMs) {
      keySetReadAllIndices(chipClusterPtr, callback, groupKeySetIDs, timedInvokeTimeoutMs);
    }

    private native void keySetWrite(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        ChipStructs.GroupKeyManagementClusterGroupKeySetStruct groupKeySet,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void keySetRead(
        long chipClusterPtr,
        KeySetReadResponseCallback Callback,
        Integer groupKeySetID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void keySetRemove(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer groupKeySetID,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void keySetReadAllIndices(
        long chipClusterPtr,
        KeySetReadAllIndicesResponseCallback Callback,
        ArrayList<Integer> groupKeySetIDs,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface KeySetReadResponseCallback {
      void onSuccess(ChipStructs.GroupKeyManagementClusterGroupKeySetStruct groupKeySet);

      void onError(Exception error);
    }

    public interface KeySetReadAllIndicesResponseCallback {
      void onSuccess(ArrayList<Integer> groupKeySetIDs);

      void onError(Exception error);
    }

    public interface GroupKeyMapAttributeCallback {
      void onSuccess(List<ChipStructs.GroupKeyManagementClusterGroupKeyMapStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GroupTableAttributeCallback {
      void onSuccess(List<ChipStructs.GroupKeyManagementClusterGroupInfoMapStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGroupKeyMapAttribute(GroupKeyMapAttributeCallback callback) {
      readGroupKeyMapAttribute(chipClusterPtr, callback);
    }

    public void writeGroupKeyMapAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.GroupKeyManagementClusterGroupKeyMapStruct> value) {
      writeGroupKeyMapAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeGroupKeyMapAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.GroupKeyManagementClusterGroupKeyMapStruct> value,
        int timedWriteTimeoutMs) {
      writeGroupKeyMapAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeGroupKeyMapAttribute(
        GroupKeyMapAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGroupKeyMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGroupTableAttribute(GroupTableAttributeCallback callback) {
      readGroupTableAttribute(chipClusterPtr, callback);
    }

    public void subscribeGroupTableAttribute(
        GroupTableAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGroupTableAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxGroupsPerFabricAttribute(IntegerAttributeCallback callback) {
      readMaxGroupsPerFabricAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxGroupsPerFabricAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxGroupsPerFabricAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxGroupKeysPerFabricAttribute(IntegerAttributeCallback callback) {
      readMaxGroupKeysPerFabricAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxGroupKeysPerFabricAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxGroupKeysPerFabricAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGroupKeyMapAttribute(
        long chipClusterPtr, GroupKeyMapAttributeCallback callback);

    private native void writeGroupKeyMapAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.GroupKeyManagementClusterGroupKeyMapStruct> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeGroupKeyMapAttribute(
        long chipClusterPtr,
        GroupKeyMapAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGroupTableAttribute(
        long chipClusterPtr, GroupTableAttributeCallback callback);

    private native void subscribeGroupTableAttribute(
        long chipClusterPtr,
        GroupTableAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxGroupsPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxGroupsPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxGroupKeysPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxGroupKeysPerFabricAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class FixedLabelCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 64L;

    public FixedLabelCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface LabelListAttributeCallback {
      void onSuccess(List<ChipStructs.FixedLabelClusterLabelStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readLabelListAttribute(LabelListAttributeCallback callback) {
      readLabelListAttribute(chipClusterPtr, callback);
    }

    public void subscribeLabelListAttribute(
        LabelListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLabelListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readLabelListAttribute(
        long chipClusterPtr, LabelListAttributeCallback callback);

    private native void subscribeLabelListAttribute(
        long chipClusterPtr, LabelListAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class UserLabelCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 65L;

    public UserLabelCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface LabelListAttributeCallback {
      void onSuccess(List<ChipStructs.UserLabelClusterLabelStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readLabelListAttribute(LabelListAttributeCallback callback) {
      readLabelListAttribute(chipClusterPtr, callback);
    }

    public void writeLabelListAttribute(
        DefaultClusterCallback callback, ArrayList<ChipStructs.UserLabelClusterLabelStruct> value) {
      writeLabelListAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLabelListAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UserLabelClusterLabelStruct> value,
        int timedWriteTimeoutMs) {
      writeLabelListAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLabelListAttribute(
        LabelListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLabelListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readLabelListAttribute(
        long chipClusterPtr, LabelListAttributeCallback callback);

    private native void writeLabelListAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UserLabelClusterLabelStruct> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLabelListAttribute(
        long chipClusterPtr, LabelListAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BooleanStateCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 69L;

    public BooleanStateCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readStateValueAttribute(BooleanAttributeCallback callback) {
      readStateValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeStateValueAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStateValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readStateValueAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeStateValueAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ModeSelectCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 80L;

    public ModeSelectCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void changeToMode(DefaultClusterCallback callback, Integer newMode) {
      changeToMode(chipClusterPtr, callback, newMode, null);
    }

    public void changeToMode(
        DefaultClusterCallback callback, Integer newMode, int timedInvokeTimeoutMs) {
      changeToMode(chipClusterPtr, callback, newMode, timedInvokeTimeoutMs);
    }

    private native void changeToMode(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer newMode,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface StandardNamespaceAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SupportedModesAttributeCallback {
      void onSuccess(List<ChipStructs.ModeSelectClusterModeOptionStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface StartUpModeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface OnModeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readDescriptionAttribute(CharStringAttributeCallback callback) {
      readDescriptionAttribute(chipClusterPtr, callback);
    }

    public void subscribeDescriptionAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDescriptionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStandardNamespaceAttribute(StandardNamespaceAttributeCallback callback) {
      readStandardNamespaceAttribute(chipClusterPtr, callback);
    }

    public void subscribeStandardNamespaceAttribute(
        StandardNamespaceAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStandardNamespaceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedModesAttribute(SupportedModesAttributeCallback callback) {
      readSupportedModesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedModesAttribute(
        SupportedModesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedModesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentModeAttribute(IntegerAttributeCallback callback) {
      readCurrentModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartUpModeAttribute(StartUpModeAttributeCallback callback) {
      readStartUpModeAttribute(chipClusterPtr, callback);
    }

    public void writeStartUpModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeStartUpModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeStartUpModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeStartUpModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeStartUpModeAttribute(
        StartUpModeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartUpModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOnModeAttribute(OnModeAttributeCallback callback) {
      readOnModeAttribute(chipClusterPtr, callback);
    }

    public void writeOnModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOnModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOnModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOnModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOnModeAttribute(
        OnModeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOnModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readDescriptionAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeDescriptionAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readStandardNamespaceAttribute(
        long chipClusterPtr, StandardNamespaceAttributeCallback callback);

    private native void subscribeStandardNamespaceAttribute(
        long chipClusterPtr,
        StandardNamespaceAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSupportedModesAttribute(
        long chipClusterPtr, SupportedModesAttributeCallback callback);

    private native void subscribeSupportedModesAttribute(
        long chipClusterPtr,
        SupportedModesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartUpModeAttribute(
        long chipClusterPtr, StartUpModeAttributeCallback callback);

    private native void writeStartUpModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeStartUpModeAttribute(
        long chipClusterPtr,
        StartUpModeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOnModeAttribute(long chipClusterPtr, OnModeAttributeCallback callback);

    private native void writeOnModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOnModeAttribute(
        long chipClusterPtr, OnModeAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class DoorLockCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 257L;

    public DoorLockCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void lockDoor(
        DefaultClusterCallback callback, Optional<byte[]> pinCode, int timedInvokeTimeoutMs) {
      lockDoor(chipClusterPtr, callback, pinCode, timedInvokeTimeoutMs);
    }

    public void unlockDoor(
        DefaultClusterCallback callback, Optional<byte[]> pinCode, int timedInvokeTimeoutMs) {
      unlockDoor(chipClusterPtr, callback, pinCode, timedInvokeTimeoutMs);
    }

    public void unlockWithTimeout(
        DefaultClusterCallback callback,
        Integer timeout,
        Optional<byte[]> pinCode,
        int timedInvokeTimeoutMs) {
      unlockWithTimeout(chipClusterPtr, callback, timeout, pinCode, timedInvokeTimeoutMs);
    }

    public void setWeekDaySchedule(
        DefaultClusterCallback callback,
        Integer weekDayIndex,
        Integer userIndex,
        Integer daysMask,
        Integer startHour,
        Integer startMinute,
        Integer endHour,
        Integer endMinute) {
      setWeekDaySchedule(
          chipClusterPtr,
          callback,
          weekDayIndex,
          userIndex,
          daysMask,
          startHour,
          startMinute,
          endHour,
          endMinute,
          null);
    }

    public void setWeekDaySchedule(
        DefaultClusterCallback callback,
        Integer weekDayIndex,
        Integer userIndex,
        Integer daysMask,
        Integer startHour,
        Integer startMinute,
        Integer endHour,
        Integer endMinute,
        int timedInvokeTimeoutMs) {
      setWeekDaySchedule(
          chipClusterPtr,
          callback,
          weekDayIndex,
          userIndex,
          daysMask,
          startHour,
          startMinute,
          endHour,
          endMinute,
          timedInvokeTimeoutMs);
    }

    public void getWeekDaySchedule(
        GetWeekDayScheduleResponseCallback callback, Integer weekDayIndex, Integer userIndex) {
      getWeekDaySchedule(chipClusterPtr, callback, weekDayIndex, userIndex, null);
    }

    public void getWeekDaySchedule(
        GetWeekDayScheduleResponseCallback callback,
        Integer weekDayIndex,
        Integer userIndex,
        int timedInvokeTimeoutMs) {
      getWeekDaySchedule(chipClusterPtr, callback, weekDayIndex, userIndex, timedInvokeTimeoutMs);
    }

    public void clearWeekDaySchedule(
        DefaultClusterCallback callback, Integer weekDayIndex, Integer userIndex) {
      clearWeekDaySchedule(chipClusterPtr, callback, weekDayIndex, userIndex, null);
    }

    public void clearWeekDaySchedule(
        DefaultClusterCallback callback,
        Integer weekDayIndex,
        Integer userIndex,
        int timedInvokeTimeoutMs) {
      clearWeekDaySchedule(chipClusterPtr, callback, weekDayIndex, userIndex, timedInvokeTimeoutMs);
    }

    public void setYearDaySchedule(
        DefaultClusterCallback callback,
        Integer yearDayIndex,
        Integer userIndex,
        Long localStartTime,
        Long localEndTime) {
      setYearDaySchedule(
          chipClusterPtr, callback, yearDayIndex, userIndex, localStartTime, localEndTime, null);
    }

    public void setYearDaySchedule(
        DefaultClusterCallback callback,
        Integer yearDayIndex,
        Integer userIndex,
        Long localStartTime,
        Long localEndTime,
        int timedInvokeTimeoutMs) {
      setYearDaySchedule(
          chipClusterPtr,
          callback,
          yearDayIndex,
          userIndex,
          localStartTime,
          localEndTime,
          timedInvokeTimeoutMs);
    }

    public void getYearDaySchedule(
        GetYearDayScheduleResponseCallback callback, Integer yearDayIndex, Integer userIndex) {
      getYearDaySchedule(chipClusterPtr, callback, yearDayIndex, userIndex, null);
    }

    public void getYearDaySchedule(
        GetYearDayScheduleResponseCallback callback,
        Integer yearDayIndex,
        Integer userIndex,
        int timedInvokeTimeoutMs) {
      getYearDaySchedule(chipClusterPtr, callback, yearDayIndex, userIndex, timedInvokeTimeoutMs);
    }

    public void clearYearDaySchedule(
        DefaultClusterCallback callback, Integer yearDayIndex, Integer userIndex) {
      clearYearDaySchedule(chipClusterPtr, callback, yearDayIndex, userIndex, null);
    }

    public void clearYearDaySchedule(
        DefaultClusterCallback callback,
        Integer yearDayIndex,
        Integer userIndex,
        int timedInvokeTimeoutMs) {
      clearYearDaySchedule(chipClusterPtr, callback, yearDayIndex, userIndex, timedInvokeTimeoutMs);
    }

    public void setHolidaySchedule(
        DefaultClusterCallback callback,
        Integer holidayIndex,
        Long localStartTime,
        Long localEndTime,
        Integer operatingMode) {
      setHolidaySchedule(
          chipClusterPtr,
          callback,
          holidayIndex,
          localStartTime,
          localEndTime,
          operatingMode,
          null);
    }

    public void setHolidaySchedule(
        DefaultClusterCallback callback,
        Integer holidayIndex,
        Long localStartTime,
        Long localEndTime,
        Integer operatingMode,
        int timedInvokeTimeoutMs) {
      setHolidaySchedule(
          chipClusterPtr,
          callback,
          holidayIndex,
          localStartTime,
          localEndTime,
          operatingMode,
          timedInvokeTimeoutMs);
    }

    public void getHolidaySchedule(
        GetHolidayScheduleResponseCallback callback, Integer holidayIndex) {
      getHolidaySchedule(chipClusterPtr, callback, holidayIndex, null);
    }

    public void getHolidaySchedule(
        GetHolidayScheduleResponseCallback callback,
        Integer holidayIndex,
        int timedInvokeTimeoutMs) {
      getHolidaySchedule(chipClusterPtr, callback, holidayIndex, timedInvokeTimeoutMs);
    }

    public void clearHolidaySchedule(DefaultClusterCallback callback, Integer holidayIndex) {
      clearHolidaySchedule(chipClusterPtr, callback, holidayIndex, null);
    }

    public void clearHolidaySchedule(
        DefaultClusterCallback callback, Integer holidayIndex, int timedInvokeTimeoutMs) {
      clearHolidaySchedule(chipClusterPtr, callback, holidayIndex, timedInvokeTimeoutMs);
    }

    public void setUser(
        DefaultClusterCallback callback,
        Integer operationType,
        Integer userIndex,
        @Nullable String userName,
        @Nullable Long userUniqueId,
        @Nullable Integer userStatus,
        @Nullable Integer userType,
        @Nullable Integer credentialRule,
        int timedInvokeTimeoutMs) {
      setUser(
          chipClusterPtr,
          callback,
          operationType,
          userIndex,
          userName,
          userUniqueId,
          userStatus,
          userType,
          credentialRule,
          timedInvokeTimeoutMs);
    }

    public void getUser(GetUserResponseCallback callback, Integer userIndex) {
      getUser(chipClusterPtr, callback, userIndex, null);
    }

    public void getUser(
        GetUserResponseCallback callback, Integer userIndex, int timedInvokeTimeoutMs) {
      getUser(chipClusterPtr, callback, userIndex, timedInvokeTimeoutMs);
    }

    public void clearUser(
        DefaultClusterCallback callback, Integer userIndex, int timedInvokeTimeoutMs) {
      clearUser(chipClusterPtr, callback, userIndex, timedInvokeTimeoutMs);
    }

    public void setCredential(
        SetCredentialResponseCallback callback,
        Integer operationType,
        ChipStructs.DoorLockClusterDlCredential credential,
        byte[] credentialData,
        @Nullable Integer userIndex,
        @Nullable Integer userStatus,
        @Nullable Integer userType,
        int timedInvokeTimeoutMs) {
      setCredential(
          chipClusterPtr,
          callback,
          operationType,
          credential,
          credentialData,
          userIndex,
          userStatus,
          userType,
          timedInvokeTimeoutMs);
    }

    public void getCredentialStatus(
        GetCredentialStatusResponseCallback callback,
        ChipStructs.DoorLockClusterDlCredential credential) {
      getCredentialStatus(chipClusterPtr, callback, credential, null);
    }

    public void getCredentialStatus(
        GetCredentialStatusResponseCallback callback,
        ChipStructs.DoorLockClusterDlCredential credential,
        int timedInvokeTimeoutMs) {
      getCredentialStatus(chipClusterPtr, callback, credential, timedInvokeTimeoutMs);
    }

    public void clearCredential(
        DefaultClusterCallback callback,
        @Nullable ChipStructs.DoorLockClusterDlCredential credential,
        int timedInvokeTimeoutMs) {
      clearCredential(chipClusterPtr, callback, credential, timedInvokeTimeoutMs);
    }

    private native void lockDoor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Optional<byte[]> pinCode,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void unlockDoor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Optional<byte[]> pinCode,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void unlockWithTimeout(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer timeout,
        Optional<byte[]> pinCode,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setWeekDaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer weekDayIndex,
        Integer userIndex,
        Integer daysMask,
        Integer startHour,
        Integer startMinute,
        Integer endHour,
        Integer endMinute,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getWeekDaySchedule(
        long chipClusterPtr,
        GetWeekDayScheduleResponseCallback Callback,
        Integer weekDayIndex,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearWeekDaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer weekDayIndex,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setYearDaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer yearDayIndex,
        Integer userIndex,
        Long localStartTime,
        Long localEndTime,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getYearDaySchedule(
        long chipClusterPtr,
        GetYearDayScheduleResponseCallback Callback,
        Integer yearDayIndex,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearYearDaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer yearDayIndex,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setHolidaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer holidayIndex,
        Long localStartTime,
        Long localEndTime,
        Integer operatingMode,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getHolidaySchedule(
        long chipClusterPtr,
        GetHolidayScheduleResponseCallback Callback,
        Integer holidayIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearHolidaySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer holidayIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setUser(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer operationType,
        Integer userIndex,
        @Nullable String userName,
        @Nullable Long userUniqueId,
        @Nullable Integer userStatus,
        @Nullable Integer userType,
        @Nullable Integer credentialRule,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getUser(
        long chipClusterPtr,
        GetUserResponseCallback Callback,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearUser(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer userIndex,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setCredential(
        long chipClusterPtr,
        SetCredentialResponseCallback Callback,
        Integer operationType,
        ChipStructs.DoorLockClusterDlCredential credential,
        byte[] credentialData,
        @Nullable Integer userIndex,
        @Nullable Integer userStatus,
        @Nullable Integer userType,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getCredentialStatus(
        long chipClusterPtr,
        GetCredentialStatusResponseCallback Callback,
        ChipStructs.DoorLockClusterDlCredential credential,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearCredential(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable ChipStructs.DoorLockClusterDlCredential credential,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GetWeekDayScheduleResponseCallback {
      void onSuccess(
          Integer weekDayIndex,
          Integer userIndex,
          Integer status,
          Optional<Integer> daysMask,
          Optional<Integer> startHour,
          Optional<Integer> startMinute,
          Optional<Integer> endHour,
          Optional<Integer> endMinute);

      void onError(Exception error);
    }

    public interface GetYearDayScheduleResponseCallback {
      void onSuccess(
          Integer yearDayIndex,
          Integer userIndex,
          Integer status,
          Optional<Long> localStartTime,
          Optional<Long> localEndTime);

      void onError(Exception error);
    }

    public interface GetHolidayScheduleResponseCallback {
      void onSuccess(
          Integer holidayIndex,
          Integer status,
          Optional<Long> localStartTime,
          Optional<Long> localEndTime,
          Optional<Integer> operatingMode);

      void onError(Exception error);
    }

    public interface GetUserResponseCallback {
      void onSuccess(
          Integer userIndex,
          @Nullable String userName,
          @Nullable Long userUniqueId,
          @Nullable Integer userStatus,
          @Nullable Integer userType,
          @Nullable Integer credentialRule,
          @Nullable ArrayList<ChipStructs.DoorLockClusterDlCredential> credentials,
          @Nullable Integer creatorFabricIndex,
          @Nullable Integer lastModifiedFabricIndex,
          @Nullable Integer nextUserIndex);

      void onError(Exception error);
    }

    public interface SetCredentialResponseCallback {
      void onSuccess(
          Integer status, @Nullable Integer userIndex, @Nullable Integer nextCredentialIndex);

      void onError(Exception error);
    }

    public interface GetCredentialStatusResponseCallback {
      void onSuccess(
          Boolean credentialExists,
          @Nullable Integer userIndex,
          @Nullable Integer creatorFabricIndex,
          @Nullable Integer lastModifiedFabricIndex,
          @Nullable Integer nextCredentialIndex);

      void onError(Exception error);
    }

    public interface LockStateAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DoorStateAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readLockStateAttribute(LockStateAttributeCallback callback) {
      readLockStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeLockStateAttribute(
        LockStateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLockStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLockTypeAttribute(IntegerAttributeCallback callback) {
      readLockTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeLockTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLockTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActuatorEnabledAttribute(BooleanAttributeCallback callback) {
      readActuatorEnabledAttribute(chipClusterPtr, callback);
    }

    public void subscribeActuatorEnabledAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActuatorEnabledAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDoorStateAttribute(DoorStateAttributeCallback callback) {
      readDoorStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeDoorStateAttribute(
        DoorStateAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDoorStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfTotalUsersSupportedAttribute(IntegerAttributeCallback callback) {
      readNumberOfTotalUsersSupportedAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfTotalUsersSupportedAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfTotalUsersSupportedAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfPINUsersSupportedAttribute(IntegerAttributeCallback callback) {
      readNumberOfPINUsersSupportedAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfPINUsersSupportedAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfPINUsersSupportedAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfRFIDUsersSupportedAttribute(IntegerAttributeCallback callback) {
      readNumberOfRFIDUsersSupportedAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfRFIDUsersSupportedAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfRFIDUsersSupportedAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfWeekDaySchedulesSupportedPerUserAttribute(
        IntegerAttributeCallback callback) {
      readNumberOfWeekDaySchedulesSupportedPerUserAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfWeekDaySchedulesSupportedPerUserAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfWeekDaySchedulesSupportedPerUserAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfYearDaySchedulesSupportedPerUserAttribute(
        IntegerAttributeCallback callback) {
      readNumberOfYearDaySchedulesSupportedPerUserAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfYearDaySchedulesSupportedPerUserAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfYearDaySchedulesSupportedPerUserAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfHolidaySchedulesSupportedAttribute(IntegerAttributeCallback callback) {
      readNumberOfHolidaySchedulesSupportedAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfHolidaySchedulesSupportedAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfHolidaySchedulesSupportedAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxPINCodeLengthAttribute(IntegerAttributeCallback callback) {
      readMaxPINCodeLengthAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxPINCodeLengthAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxPINCodeLengthAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinPINCodeLengthAttribute(IntegerAttributeCallback callback) {
      readMinPINCodeLengthAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinPINCodeLengthAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinPINCodeLengthAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxRFIDCodeLengthAttribute(IntegerAttributeCallback callback) {
      readMaxRFIDCodeLengthAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxRFIDCodeLengthAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxRFIDCodeLengthAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinRFIDCodeLengthAttribute(IntegerAttributeCallback callback) {
      readMinRFIDCodeLengthAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinRFIDCodeLengthAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinRFIDCodeLengthAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfCredentialsSupportedPerUserAttribute(
        IntegerAttributeCallback callback) {
      readNumberOfCredentialsSupportedPerUserAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfCredentialsSupportedPerUserAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfCredentialsSupportedPerUserAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLanguageAttribute(CharStringAttributeCallback callback) {
      readLanguageAttribute(chipClusterPtr, callback);
    }

    public void writeLanguageAttribute(DefaultClusterCallback callback, String value) {
      writeLanguageAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLanguageAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLanguageAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLanguageAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLanguageAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAutoRelockTimeAttribute(LongAttributeCallback callback) {
      readAutoRelockTimeAttribute(chipClusterPtr, callback);
    }

    public void writeAutoRelockTimeAttribute(DefaultClusterCallback callback, Long value) {
      writeAutoRelockTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeAutoRelockTimeAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeAutoRelockTimeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeAutoRelockTimeAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAutoRelockTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSoundVolumeAttribute(IntegerAttributeCallback callback) {
      readSoundVolumeAttribute(chipClusterPtr, callback);
    }

    public void writeSoundVolumeAttribute(DefaultClusterCallback callback, Integer value) {
      writeSoundVolumeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSoundVolumeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeSoundVolumeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSoundVolumeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSoundVolumeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOperatingModeAttribute(IntegerAttributeCallback callback) {
      readOperatingModeAttribute(chipClusterPtr, callback);
    }

    public void writeOperatingModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOperatingModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOperatingModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOperatingModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOperatingModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOperatingModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedOperatingModesAttribute(IntegerAttributeCallback callback) {
      readSupportedOperatingModesAttribute(chipClusterPtr, callback);
    }

    public void subscribeSupportedOperatingModesAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedOperatingModesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnableOneTouchLockingAttribute(BooleanAttributeCallback callback) {
      readEnableOneTouchLockingAttribute(chipClusterPtr, callback);
    }

    public void writeEnableOneTouchLockingAttribute(
        DefaultClusterCallback callback, Boolean value) {
      writeEnableOneTouchLockingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnableOneTouchLockingAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeEnableOneTouchLockingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnableOneTouchLockingAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnableOneTouchLockingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnablePrivacyModeButtonAttribute(BooleanAttributeCallback callback) {
      readEnablePrivacyModeButtonAttribute(chipClusterPtr, callback);
    }

    public void writeEnablePrivacyModeButtonAttribute(
        DefaultClusterCallback callback, Boolean value) {
      writeEnablePrivacyModeButtonAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnablePrivacyModeButtonAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeEnablePrivacyModeButtonAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnablePrivacyModeButtonAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnablePrivacyModeButtonAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWrongCodeEntryLimitAttribute(IntegerAttributeCallback callback) {
      readWrongCodeEntryLimitAttribute(chipClusterPtr, callback);
    }

    public void writeWrongCodeEntryLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeWrongCodeEntryLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeWrongCodeEntryLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeWrongCodeEntryLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeWrongCodeEntryLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWrongCodeEntryLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUserCodeTemporaryDisableTimeAttribute(IntegerAttributeCallback callback) {
      readUserCodeTemporaryDisableTimeAttribute(chipClusterPtr, callback);
    }

    public void writeUserCodeTemporaryDisableTimeAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeUserCodeTemporaryDisableTimeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeUserCodeTemporaryDisableTimeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeUserCodeTemporaryDisableTimeAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeUserCodeTemporaryDisableTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUserCodeTemporaryDisableTimeAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRequirePINforRemoteOperationAttribute(BooleanAttributeCallback callback) {
      readRequirePINforRemoteOperationAttribute(chipClusterPtr, callback);
    }

    public void writeRequirePINforRemoteOperationAttribute(
        DefaultClusterCallback callback, Boolean value) {
      writeRequirePINforRemoteOperationAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRequirePINforRemoteOperationAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeRequirePINforRemoteOperationAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readLockStateAttribute(
        long chipClusterPtr, LockStateAttributeCallback callback);

    private native void subscribeLockStateAttribute(
        long chipClusterPtr, LockStateAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLockTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeLockTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActuatorEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void subscribeActuatorEnabledAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDoorStateAttribute(
        long chipClusterPtr, DoorStateAttributeCallback callback);

    private native void subscribeDoorStateAttribute(
        long chipClusterPtr, DoorStateAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfTotalUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfTotalUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfPINUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfPINUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfRFIDUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfRFIDUsersSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfWeekDaySchedulesSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfWeekDaySchedulesSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfYearDaySchedulesSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfYearDaySchedulesSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfHolidaySchedulesSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfHolidaySchedulesSupportedAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxPINCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxPINCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinPINCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMinPINCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxRFIDCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMaxRFIDCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinRFIDCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeMinRFIDCodeLengthAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfCredentialsSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfCredentialsSupportedPerUserAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLanguageAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLanguageAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLanguageAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAutoRelockTimeAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void writeAutoRelockTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeAutoRelockTimeAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSoundVolumeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeSoundVolumeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSoundVolumeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOperatingModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOperatingModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOperatingModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSupportedOperatingModesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSupportedOperatingModesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnableOneTouchLockingAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeEnableOneTouchLockingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnableOneTouchLockingAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnablePrivacyModeButtonAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeEnablePrivacyModeButtonAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnablePrivacyModeButtonAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWrongCodeEntryLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeWrongCodeEntryLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeWrongCodeEntryLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUserCodeTemporaryDisableTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeUserCodeTemporaryDisableTimeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeUserCodeTemporaryDisableTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRequirePINforRemoteOperationAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeRequirePINforRemoteOperationAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class WindowCoveringCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 258L;

    public WindowCoveringCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void upOrOpen(DefaultClusterCallback callback) {
      upOrOpen(chipClusterPtr, callback, null);
    }

    public void upOrOpen(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      upOrOpen(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void downOrClose(DefaultClusterCallback callback) {
      downOrClose(chipClusterPtr, callback, null);
    }

    public void downOrClose(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      downOrClose(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void stopMotion(DefaultClusterCallback callback) {
      stopMotion(chipClusterPtr, callback, null);
    }

    public void stopMotion(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      stopMotion(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void goToLiftValue(DefaultClusterCallback callback, Integer liftValue) {
      goToLiftValue(chipClusterPtr, callback, liftValue, null);
    }

    public void goToLiftValue(
        DefaultClusterCallback callback, Integer liftValue, int timedInvokeTimeoutMs) {
      goToLiftValue(chipClusterPtr, callback, liftValue, timedInvokeTimeoutMs);
    }

    public void goToLiftPercentage(
        DefaultClusterCallback callback, Integer liftPercent100thsValue) {
      goToLiftPercentage(chipClusterPtr, callback, liftPercent100thsValue, null);
    }

    public void goToLiftPercentage(
        DefaultClusterCallback callback, Integer liftPercent100thsValue, int timedInvokeTimeoutMs) {
      goToLiftPercentage(chipClusterPtr, callback, liftPercent100thsValue, timedInvokeTimeoutMs);
    }

    public void goToTiltValue(DefaultClusterCallback callback, Integer tiltValue) {
      goToTiltValue(chipClusterPtr, callback, tiltValue, null);
    }

    public void goToTiltValue(
        DefaultClusterCallback callback, Integer tiltValue, int timedInvokeTimeoutMs) {
      goToTiltValue(chipClusterPtr, callback, tiltValue, timedInvokeTimeoutMs);
    }

    public void goToTiltPercentage(
        DefaultClusterCallback callback, Integer tiltPercent100thsValue) {
      goToTiltPercentage(chipClusterPtr, callback, tiltPercent100thsValue, null);
    }

    public void goToTiltPercentage(
        DefaultClusterCallback callback, Integer tiltPercent100thsValue, int timedInvokeTimeoutMs) {
      goToTiltPercentage(chipClusterPtr, callback, tiltPercent100thsValue, timedInvokeTimeoutMs);
    }

    private native void upOrOpen(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void downOrClose(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopMotion(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void goToLiftValue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer liftValue,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void goToLiftPercentage(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer liftPercent100thsValue,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void goToTiltValue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer tiltValue,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void goToTiltPercentage(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer tiltPercent100thsValue,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface CurrentPositionLiftAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionTiltAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionLiftPercentageAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionTiltPercentageAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface TargetPositionLiftPercent100thsAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface TargetPositionTiltPercent100thsAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionLiftPercent100thsAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CurrentPositionTiltPercent100thsAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readTypeAttribute(IntegerAttributeCallback callback) {
      readTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPhysicalClosedLimitLiftAttribute(IntegerAttributeCallback callback) {
      readPhysicalClosedLimitLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribePhysicalClosedLimitLiftAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePhysicalClosedLimitLiftAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPhysicalClosedLimitTiltAttribute(IntegerAttributeCallback callback) {
      readPhysicalClosedLimitTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribePhysicalClosedLimitTiltAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePhysicalClosedLimitTiltAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionLiftAttribute(CurrentPositionLiftAttributeCallback callback) {
      readCurrentPositionLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionLiftAttribute(
        CurrentPositionLiftAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionLiftAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionTiltAttribute(CurrentPositionTiltAttributeCallback callback) {
      readCurrentPositionTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionTiltAttribute(
        CurrentPositionTiltAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionTiltAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfActuationsLiftAttribute(IntegerAttributeCallback callback) {
      readNumberOfActuationsLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfActuationsLiftAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfActuationsLiftAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfActuationsTiltAttribute(IntegerAttributeCallback callback) {
      readNumberOfActuationsTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfActuationsTiltAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfActuationsTiltAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readConfigStatusAttribute(IntegerAttributeCallback callback) {
      readConfigStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeConfigStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeConfigStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionLiftPercentageAttribute(
        CurrentPositionLiftPercentageAttributeCallback callback) {
      readCurrentPositionLiftPercentageAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionLiftPercentageAttribute(
        CurrentPositionLiftPercentageAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionLiftPercentageAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionTiltPercentageAttribute(
        CurrentPositionTiltPercentageAttributeCallback callback) {
      readCurrentPositionTiltPercentageAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionTiltPercentageAttribute(
        CurrentPositionTiltPercentageAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentPositionTiltPercentageAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOperationalStatusAttribute(IntegerAttributeCallback callback) {
      readOperationalStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeOperationalStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOperationalStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTargetPositionLiftPercent100thsAttribute(
        TargetPositionLiftPercent100thsAttributeCallback callback) {
      readTargetPositionLiftPercent100thsAttribute(chipClusterPtr, callback);
    }

    public void subscribeTargetPositionLiftPercent100thsAttribute(
        TargetPositionLiftPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeTargetPositionLiftPercent100thsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTargetPositionTiltPercent100thsAttribute(
        TargetPositionTiltPercent100thsAttributeCallback callback) {
      readTargetPositionTiltPercent100thsAttribute(chipClusterPtr, callback);
    }

    public void subscribeTargetPositionTiltPercent100thsAttribute(
        TargetPositionTiltPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeTargetPositionTiltPercent100thsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEndProductTypeAttribute(IntegerAttributeCallback callback) {
      readEndProductTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeEndProductTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEndProductTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionLiftPercent100thsAttribute(
        CurrentPositionLiftPercent100thsAttributeCallback callback) {
      readCurrentPositionLiftPercent100thsAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionLiftPercent100thsAttribute(
        CurrentPositionLiftPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeCurrentPositionLiftPercent100thsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentPositionTiltPercent100thsAttribute(
        CurrentPositionTiltPercent100thsAttributeCallback callback) {
      readCurrentPositionTiltPercent100thsAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentPositionTiltPercent100thsAttribute(
        CurrentPositionTiltPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeCurrentPositionTiltPercent100thsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInstalledOpenLimitLiftAttribute(IntegerAttributeCallback callback) {
      readInstalledOpenLimitLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribeInstalledOpenLimitLiftAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInstalledOpenLimitLiftAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInstalledClosedLimitLiftAttribute(IntegerAttributeCallback callback) {
      readInstalledClosedLimitLiftAttribute(chipClusterPtr, callback);
    }

    public void subscribeInstalledClosedLimitLiftAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInstalledClosedLimitLiftAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInstalledOpenLimitTiltAttribute(IntegerAttributeCallback callback) {
      readInstalledOpenLimitTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribeInstalledOpenLimitTiltAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInstalledOpenLimitTiltAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInstalledClosedLimitTiltAttribute(IntegerAttributeCallback callback) {
      readInstalledClosedLimitTiltAttribute(chipClusterPtr, callback);
    }

    public void subscribeInstalledClosedLimitTiltAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInstalledClosedLimitTiltAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readModeAttribute(IntegerAttributeCallback callback) {
      readModeAttribute(chipClusterPtr, callback);
    }

    public void writeModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSafetyStatusAttribute(IntegerAttributeCallback callback) {
      readSafetyStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeSafetyStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSafetyStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readTypeAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPhysicalClosedLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePhysicalClosedLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPhysicalClosedLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePhysicalClosedLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentPositionLiftAttribute(
        long chipClusterPtr, CurrentPositionLiftAttributeCallback callback);

    private native void subscribeCurrentPositionLiftAttribute(
        long chipClusterPtr,
        CurrentPositionLiftAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentPositionTiltAttribute(
        long chipClusterPtr, CurrentPositionTiltAttributeCallback callback);

    private native void subscribeCurrentPositionTiltAttribute(
        long chipClusterPtr,
        CurrentPositionTiltAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNumberOfActuationsLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfActuationsLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfActuationsTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfActuationsTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readConfigStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeConfigStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentPositionLiftPercentageAttribute(
        long chipClusterPtr, CurrentPositionLiftPercentageAttributeCallback callback);

    private native void subscribeCurrentPositionLiftPercentageAttribute(
        long chipClusterPtr,
        CurrentPositionLiftPercentageAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentPositionTiltPercentageAttribute(
        long chipClusterPtr, CurrentPositionTiltPercentageAttributeCallback callback);

    private native void subscribeCurrentPositionTiltPercentageAttribute(
        long chipClusterPtr,
        CurrentPositionTiltPercentageAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOperationalStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOperationalStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTargetPositionLiftPercent100thsAttribute(
        long chipClusterPtr, TargetPositionLiftPercent100thsAttributeCallback callback);

    private native void subscribeTargetPositionLiftPercent100thsAttribute(
        long chipClusterPtr,
        TargetPositionLiftPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readTargetPositionTiltPercent100thsAttribute(
        long chipClusterPtr, TargetPositionTiltPercent100thsAttributeCallback callback);

    private native void subscribeTargetPositionTiltPercent100thsAttribute(
        long chipClusterPtr,
        TargetPositionTiltPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEndProductTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEndProductTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentPositionLiftPercent100thsAttribute(
        long chipClusterPtr, CurrentPositionLiftPercent100thsAttributeCallback callback);

    private native void subscribeCurrentPositionLiftPercent100thsAttribute(
        long chipClusterPtr,
        CurrentPositionLiftPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentPositionTiltPercent100thsAttribute(
        long chipClusterPtr, CurrentPositionTiltPercent100thsAttributeCallback callback);

    private native void subscribeCurrentPositionTiltPercent100thsAttribute(
        long chipClusterPtr,
        CurrentPositionTiltPercent100thsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readInstalledOpenLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeInstalledOpenLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInstalledClosedLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeInstalledClosedLimitLiftAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInstalledOpenLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeInstalledOpenLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInstalledClosedLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeInstalledClosedLimitTiltAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readModeAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSafetyStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSafetyStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BarrierControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 259L;

    public BarrierControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void barrierControlGoToPercent(DefaultClusterCallback callback, Integer percentOpen) {
      barrierControlGoToPercent(chipClusterPtr, callback, percentOpen, null);
    }

    public void barrierControlGoToPercent(
        DefaultClusterCallback callback, Integer percentOpen, int timedInvokeTimeoutMs) {
      barrierControlGoToPercent(chipClusterPtr, callback, percentOpen, timedInvokeTimeoutMs);
    }

    public void barrierControlStop(DefaultClusterCallback callback) {
      barrierControlStop(chipClusterPtr, callback, null);
    }

    public void barrierControlStop(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      barrierControlStop(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void barrierControlGoToPercent(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer percentOpen,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void barrierControlStop(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBarrierMovingStateAttribute(IntegerAttributeCallback callback) {
      readBarrierMovingStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeBarrierMovingStateAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBarrierMovingStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBarrierSafetyStatusAttribute(IntegerAttributeCallback callback) {
      readBarrierSafetyStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeBarrierSafetyStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBarrierSafetyStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBarrierCapabilitiesAttribute(IntegerAttributeCallback callback) {
      readBarrierCapabilitiesAttribute(chipClusterPtr, callback);
    }

    public void subscribeBarrierCapabilitiesAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBarrierCapabilitiesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBarrierPositionAttribute(IntegerAttributeCallback callback) {
      readBarrierPositionAttribute(chipClusterPtr, callback);
    }

    public void subscribeBarrierPositionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBarrierPositionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBarrierMovingStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBarrierMovingStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBarrierSafetyStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBarrierSafetyStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBarrierCapabilitiesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBarrierCapabilitiesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBarrierPositionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBarrierPositionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class PumpConfigurationAndControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 512L;

    public PumpConfigurationAndControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MaxPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxSpeedAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxFlowAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinConstPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxConstPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinCompPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxCompPressureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinConstSpeedAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxConstSpeedAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinConstFlowAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxConstFlowAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinConstTempAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxConstTempAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface CapacityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SpeedAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LifetimeRunningHoursAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface PowerAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LifetimeEnergyConsumedAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMaxPressureAttribute(MaxPressureAttributeCallback callback) {
      readMaxPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxPressureAttribute(
        MaxPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxSpeedAttribute(MaxSpeedAttributeCallback callback) {
      readMaxSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxSpeedAttribute(
        MaxSpeedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxFlowAttribute(MaxFlowAttributeCallback callback) {
      readMaxFlowAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxFlowAttribute(
        MaxFlowAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxFlowAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinConstPressureAttribute(MinConstPressureAttributeCallback callback) {
      readMinConstPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinConstPressureAttribute(
        MinConstPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinConstPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxConstPressureAttribute(MaxConstPressureAttributeCallback callback) {
      readMaxConstPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxConstPressureAttribute(
        MaxConstPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxConstPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinCompPressureAttribute(MinCompPressureAttributeCallback callback) {
      readMinCompPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinCompPressureAttribute(
        MinCompPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinCompPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxCompPressureAttribute(MaxCompPressureAttributeCallback callback) {
      readMaxCompPressureAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxCompPressureAttribute(
        MaxCompPressureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxCompPressureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinConstSpeedAttribute(MinConstSpeedAttributeCallback callback) {
      readMinConstSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinConstSpeedAttribute(
        MinConstSpeedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinConstSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxConstSpeedAttribute(MaxConstSpeedAttributeCallback callback) {
      readMaxConstSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxConstSpeedAttribute(
        MaxConstSpeedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxConstSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinConstFlowAttribute(MinConstFlowAttributeCallback callback) {
      readMinConstFlowAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinConstFlowAttribute(
        MinConstFlowAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinConstFlowAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxConstFlowAttribute(MaxConstFlowAttributeCallback callback) {
      readMaxConstFlowAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxConstFlowAttribute(
        MaxConstFlowAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxConstFlowAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinConstTempAttribute(MinConstTempAttributeCallback callback) {
      readMinConstTempAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinConstTempAttribute(
        MinConstTempAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinConstTempAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxConstTempAttribute(MaxConstTempAttributeCallback callback) {
      readMaxConstTempAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxConstTempAttribute(
        MaxConstTempAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxConstTempAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPumpStatusAttribute(IntegerAttributeCallback callback) {
      readPumpStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribePumpStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePumpStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEffectiveOperationModeAttribute(IntegerAttributeCallback callback) {
      readEffectiveOperationModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeEffectiveOperationModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEffectiveOperationModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEffectiveControlModeAttribute(IntegerAttributeCallback callback) {
      readEffectiveControlModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeEffectiveControlModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEffectiveControlModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCapacityAttribute(CapacityAttributeCallback callback) {
      readCapacityAttribute(chipClusterPtr, callback);
    }

    public void subscribeCapacityAttribute(
        CapacityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCapacityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSpeedAttribute(SpeedAttributeCallback callback) {
      readSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribeSpeedAttribute(
        SpeedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLifetimeRunningHoursAttribute(LifetimeRunningHoursAttributeCallback callback) {
      readLifetimeRunningHoursAttribute(chipClusterPtr, callback);
    }

    public void writeLifetimeRunningHoursAttribute(DefaultClusterCallback callback, Long value) {
      writeLifetimeRunningHoursAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLifetimeRunningHoursAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLifetimeRunningHoursAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLifetimeRunningHoursAttribute(
        LifetimeRunningHoursAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLifetimeRunningHoursAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPowerAttribute(PowerAttributeCallback callback) {
      readPowerAttribute(chipClusterPtr, callback);
    }

    public void subscribePowerAttribute(
        PowerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePowerAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLifetimeEnergyConsumedAttribute(
        LifetimeEnergyConsumedAttributeCallback callback) {
      readLifetimeEnergyConsumedAttribute(chipClusterPtr, callback);
    }

    public void writeLifetimeEnergyConsumedAttribute(DefaultClusterCallback callback, Long value) {
      writeLifetimeEnergyConsumedAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLifetimeEnergyConsumedAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLifetimeEnergyConsumedAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLifetimeEnergyConsumedAttribute(
        LifetimeEnergyConsumedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLifetimeEnergyConsumedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOperationModeAttribute(IntegerAttributeCallback callback) {
      readOperationModeAttribute(chipClusterPtr, callback);
    }

    public void writeOperationModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeOperationModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOperationModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOperationModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOperationModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOperationModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readControlModeAttribute(IntegerAttributeCallback callback) {
      readControlModeAttribute(chipClusterPtr, callback);
    }

    public void writeControlModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeControlModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeControlModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeControlModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeControlModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeControlModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMaxPressureAttribute(
        long chipClusterPtr, MaxPressureAttributeCallback callback);

    private native void subscribeMaxPressureAttribute(
        long chipClusterPtr,
        MaxPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxSpeedAttribute(
        long chipClusterPtr, MaxSpeedAttributeCallback callback);

    private native void subscribeMaxSpeedAttribute(
        long chipClusterPtr, MaxSpeedAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxFlowAttribute(
        long chipClusterPtr, MaxFlowAttributeCallback callback);

    private native void subscribeMaxFlowAttribute(
        long chipClusterPtr, MaxFlowAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinConstPressureAttribute(
        long chipClusterPtr, MinConstPressureAttributeCallback callback);

    private native void subscribeMinConstPressureAttribute(
        long chipClusterPtr,
        MinConstPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxConstPressureAttribute(
        long chipClusterPtr, MaxConstPressureAttributeCallback callback);

    private native void subscribeMaxConstPressureAttribute(
        long chipClusterPtr,
        MaxConstPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinCompPressureAttribute(
        long chipClusterPtr, MinCompPressureAttributeCallback callback);

    private native void subscribeMinCompPressureAttribute(
        long chipClusterPtr,
        MinCompPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxCompPressureAttribute(
        long chipClusterPtr, MaxCompPressureAttributeCallback callback);

    private native void subscribeMaxCompPressureAttribute(
        long chipClusterPtr,
        MaxCompPressureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinConstSpeedAttribute(
        long chipClusterPtr, MinConstSpeedAttributeCallback callback);

    private native void subscribeMinConstSpeedAttribute(
        long chipClusterPtr,
        MinConstSpeedAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxConstSpeedAttribute(
        long chipClusterPtr, MaxConstSpeedAttributeCallback callback);

    private native void subscribeMaxConstSpeedAttribute(
        long chipClusterPtr,
        MaxConstSpeedAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinConstFlowAttribute(
        long chipClusterPtr, MinConstFlowAttributeCallback callback);

    private native void subscribeMinConstFlowAttribute(
        long chipClusterPtr,
        MinConstFlowAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxConstFlowAttribute(
        long chipClusterPtr, MaxConstFlowAttributeCallback callback);

    private native void subscribeMaxConstFlowAttribute(
        long chipClusterPtr,
        MaxConstFlowAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinConstTempAttribute(
        long chipClusterPtr, MinConstTempAttributeCallback callback);

    private native void subscribeMinConstTempAttribute(
        long chipClusterPtr,
        MinConstTempAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxConstTempAttribute(
        long chipClusterPtr, MaxConstTempAttributeCallback callback);

    private native void subscribeMaxConstTempAttribute(
        long chipClusterPtr,
        MaxConstTempAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPumpStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePumpStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEffectiveOperationModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEffectiveOperationModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEffectiveControlModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEffectiveControlModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCapacityAttribute(
        long chipClusterPtr, CapacityAttributeCallback callback);

    private native void subscribeCapacityAttribute(
        long chipClusterPtr, CapacityAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSpeedAttribute(long chipClusterPtr, SpeedAttributeCallback callback);

    private native void subscribeSpeedAttribute(
        long chipClusterPtr, SpeedAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLifetimeRunningHoursAttribute(
        long chipClusterPtr, LifetimeRunningHoursAttributeCallback callback);

    private native void writeLifetimeRunningHoursAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLifetimeRunningHoursAttribute(
        long chipClusterPtr,
        LifetimeRunningHoursAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPowerAttribute(long chipClusterPtr, PowerAttributeCallback callback);

    private native void subscribePowerAttribute(
        long chipClusterPtr, PowerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLifetimeEnergyConsumedAttribute(
        long chipClusterPtr, LifetimeEnergyConsumedAttributeCallback callback);

    private native void writeLifetimeEnergyConsumedAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLifetimeEnergyConsumedAttribute(
        long chipClusterPtr,
        LifetimeEnergyConsumedAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readOperationModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOperationModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOperationModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readControlModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeControlModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeControlModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ThermostatCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 513L;

    public ThermostatCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void setpointRaiseLower(DefaultClusterCallback callback, Integer mode, Integer amount) {
      setpointRaiseLower(chipClusterPtr, callback, mode, amount, null);
    }

    public void setpointRaiseLower(
        DefaultClusterCallback callback, Integer mode, Integer amount, int timedInvokeTimeoutMs) {
      setpointRaiseLower(chipClusterPtr, callback, mode, amount, timedInvokeTimeoutMs);
    }

    public void setWeeklySchedule(
        DefaultClusterCallback callback,
        Integer numberOfTransitionsForSequence,
        Integer dayOfWeekForSequence,
        Integer modeForSequence,
        ArrayList<ChipStructs.ThermostatClusterThermostatScheduleTransition> transitions) {
      setWeeklySchedule(
          chipClusterPtr,
          callback,
          numberOfTransitionsForSequence,
          dayOfWeekForSequence,
          modeForSequence,
          transitions,
          null);
    }

    public void setWeeklySchedule(
        DefaultClusterCallback callback,
        Integer numberOfTransitionsForSequence,
        Integer dayOfWeekForSequence,
        Integer modeForSequence,
        ArrayList<ChipStructs.ThermostatClusterThermostatScheduleTransition> transitions,
        int timedInvokeTimeoutMs) {
      setWeeklySchedule(
          chipClusterPtr,
          callback,
          numberOfTransitionsForSequence,
          dayOfWeekForSequence,
          modeForSequence,
          transitions,
          timedInvokeTimeoutMs);
    }

    public void getWeeklySchedule(
        GetWeeklyScheduleResponseCallback callback, Integer daysToReturn, Integer modeToReturn) {
      getWeeklySchedule(chipClusterPtr, callback, daysToReturn, modeToReturn, null);
    }

    public void getWeeklySchedule(
        GetWeeklyScheduleResponseCallback callback,
        Integer daysToReturn,
        Integer modeToReturn,
        int timedInvokeTimeoutMs) {
      getWeeklySchedule(chipClusterPtr, callback, daysToReturn, modeToReturn, timedInvokeTimeoutMs);
    }

    public void clearWeeklySchedule(DefaultClusterCallback callback) {
      clearWeeklySchedule(chipClusterPtr, callback, null);
    }

    public void clearWeeklySchedule(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      clearWeeklySchedule(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void setpointRaiseLower(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer mode,
        Integer amount,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void setWeeklySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer numberOfTransitionsForSequence,
        Integer dayOfWeekForSequence,
        Integer modeForSequence,
        ArrayList<ChipStructs.ThermostatClusterThermostatScheduleTransition> transitions,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void getWeeklySchedule(
        long chipClusterPtr,
        GetWeeklyScheduleResponseCallback Callback,
        Integer daysToReturn,
        Integer modeToReturn,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void clearWeeklySchedule(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GetWeeklyScheduleResponseCallback {
      void onSuccess(
          Integer numberOfTransitionsForSequence,
          Integer dayOfWeekForSequence,
          Integer modeForSequence,
          ArrayList<ChipStructs.ThermostatClusterThermostatScheduleTransition> transitions);

      void onError(Exception error);
    }

    public interface LocalTemperatureAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readLocalTemperatureAttribute(LocalTemperatureAttributeCallback callback) {
      readLocalTemperatureAttribute(chipClusterPtr, callback);
    }

    public void subscribeLocalTemperatureAttribute(
        LocalTemperatureAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLocalTemperatureAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAbsMinHeatSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readAbsMinHeatSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void subscribeAbsMinHeatSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAbsMinHeatSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAbsMaxHeatSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readAbsMaxHeatSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void subscribeAbsMaxHeatSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAbsMaxHeatSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAbsMinCoolSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readAbsMinCoolSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void subscribeAbsMinCoolSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAbsMinCoolSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAbsMaxCoolSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readAbsMaxCoolSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void subscribeAbsMaxCoolSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAbsMaxCoolSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOccupiedCoolingSetpointAttribute(IntegerAttributeCallback callback) {
      readOccupiedCoolingSetpointAttribute(chipClusterPtr, callback);
    }

    public void writeOccupiedCoolingSetpointAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeOccupiedCoolingSetpointAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOccupiedCoolingSetpointAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOccupiedCoolingSetpointAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOccupiedCoolingSetpointAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupiedCoolingSetpointAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOccupiedHeatingSetpointAttribute(IntegerAttributeCallback callback) {
      readOccupiedHeatingSetpointAttribute(chipClusterPtr, callback);
    }

    public void writeOccupiedHeatingSetpointAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeOccupiedHeatingSetpointAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOccupiedHeatingSetpointAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOccupiedHeatingSetpointAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOccupiedHeatingSetpointAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupiedHeatingSetpointAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinHeatSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readMinHeatSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void writeMinHeatSetpointLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeMinHeatSetpointLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMinHeatSetpointLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMinHeatSetpointLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMinHeatSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinHeatSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxHeatSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readMaxHeatSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void writeMaxHeatSetpointLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeMaxHeatSetpointLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMaxHeatSetpointLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMaxHeatSetpointLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMaxHeatSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxHeatSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinCoolSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readMinCoolSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void writeMinCoolSetpointLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeMinCoolSetpointLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMinCoolSetpointLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMinCoolSetpointLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMinCoolSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinCoolSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxCoolSetpointLimitAttribute(IntegerAttributeCallback callback) {
      readMaxCoolSetpointLimitAttribute(chipClusterPtr, callback);
    }

    public void writeMaxCoolSetpointLimitAttribute(DefaultClusterCallback callback, Integer value) {
      writeMaxCoolSetpointLimitAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMaxCoolSetpointLimitAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMaxCoolSetpointLimitAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMaxCoolSetpointLimitAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxCoolSetpointLimitAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinSetpointDeadBandAttribute(IntegerAttributeCallback callback) {
      readMinSetpointDeadBandAttribute(chipClusterPtr, callback);
    }

    public void writeMinSetpointDeadBandAttribute(DefaultClusterCallback callback, Integer value) {
      writeMinSetpointDeadBandAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMinSetpointDeadBandAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMinSetpointDeadBandAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMinSetpointDeadBandAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinSetpointDeadBandAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readControlSequenceOfOperationAttribute(IntegerAttributeCallback callback) {
      readControlSequenceOfOperationAttribute(chipClusterPtr, callback);
    }

    public void writeControlSequenceOfOperationAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeControlSequenceOfOperationAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeControlSequenceOfOperationAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeControlSequenceOfOperationAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeControlSequenceOfOperationAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeControlSequenceOfOperationAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSystemModeAttribute(IntegerAttributeCallback callback) {
      readSystemModeAttribute(chipClusterPtr, callback);
    }

    public void writeSystemModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeSystemModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSystemModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeSystemModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSystemModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSystemModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartOfWeekAttribute(IntegerAttributeCallback callback) {
      readStartOfWeekAttribute(chipClusterPtr, callback);
    }

    public void subscribeStartOfWeekAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartOfWeekAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfWeeklyTransitionsAttribute(IntegerAttributeCallback callback) {
      readNumberOfWeeklyTransitionsAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfWeeklyTransitionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfWeeklyTransitionsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfDailyTransitionsAttribute(IntegerAttributeCallback callback) {
      readNumberOfDailyTransitionsAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfDailyTransitionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfDailyTransitionsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readLocalTemperatureAttribute(
        long chipClusterPtr, LocalTemperatureAttributeCallback callback);

    private native void subscribeLocalTemperatureAttribute(
        long chipClusterPtr,
        LocalTemperatureAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAbsMinHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAbsMinHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAbsMaxHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAbsMaxHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAbsMinCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAbsMinCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAbsMaxCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeAbsMaxCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOccupiedCoolingSetpointAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOccupiedCoolingSetpointAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOccupiedCoolingSetpointAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOccupiedHeatingSetpointAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOccupiedHeatingSetpointAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOccupiedHeatingSetpointAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMinHeatSetpointLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMinHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMaxHeatSetpointLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMaxHeatSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMinCoolSetpointLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMinCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMaxCoolSetpointLimitAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMaxCoolSetpointLimitAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinSetpointDeadBandAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMinSetpointDeadBandAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMinSetpointDeadBandAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readControlSequenceOfOperationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeControlSequenceOfOperationAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeControlSequenceOfOperationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSystemModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeSystemModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSystemModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartOfWeekAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeStartOfWeekAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfWeeklyTransitionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfWeeklyTransitionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfDailyTransitionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeNumberOfDailyTransitionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class FanControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 514L;

    public FanControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface PercentSettingAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SpeedSettingAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readFanModeAttribute(IntegerAttributeCallback callback) {
      readFanModeAttribute(chipClusterPtr, callback);
    }

    public void writeFanModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeFanModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeFanModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeFanModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeFanModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFanModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFanModeSequenceAttribute(IntegerAttributeCallback callback) {
      readFanModeSequenceAttribute(chipClusterPtr, callback);
    }

    public void writeFanModeSequenceAttribute(DefaultClusterCallback callback, Integer value) {
      writeFanModeSequenceAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeFanModeSequenceAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeFanModeSequenceAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeFanModeSequenceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFanModeSequenceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPercentSettingAttribute(PercentSettingAttributeCallback callback) {
      readPercentSettingAttribute(chipClusterPtr, callback);
    }

    public void writePercentSettingAttribute(DefaultClusterCallback callback, Integer value) {
      writePercentSettingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writePercentSettingAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writePercentSettingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribePercentSettingAttribute(
        PercentSettingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePercentSettingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPercentCurrentAttribute(IntegerAttributeCallback callback) {
      readPercentCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribePercentCurrentAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePercentCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSpeedMaxAttribute(IntegerAttributeCallback callback) {
      readSpeedMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeSpeedMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSpeedMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSpeedSettingAttribute(SpeedSettingAttributeCallback callback) {
      readSpeedSettingAttribute(chipClusterPtr, callback);
    }

    public void writeSpeedSettingAttribute(DefaultClusterCallback callback, Integer value) {
      writeSpeedSettingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSpeedSettingAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeSpeedSettingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSpeedSettingAttribute(
        SpeedSettingAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSpeedSettingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSpeedCurrentAttribute(IntegerAttributeCallback callback) {
      readSpeedCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeSpeedCurrentAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSpeedCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRockSupportAttribute(IntegerAttributeCallback callback) {
      readRockSupportAttribute(chipClusterPtr, callback);
    }

    public void subscribeRockSupportAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRockSupportAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRockSettingAttribute(IntegerAttributeCallback callback) {
      readRockSettingAttribute(chipClusterPtr, callback);
    }

    public void writeRockSettingAttribute(DefaultClusterCallback callback, Integer value) {
      writeRockSettingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRockSettingAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRockSettingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRockSettingAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRockSettingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWindSupportAttribute(IntegerAttributeCallback callback) {
      readWindSupportAttribute(chipClusterPtr, callback);
    }

    public void subscribeWindSupportAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWindSupportAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWindSettingAttribute(IntegerAttributeCallback callback) {
      readWindSettingAttribute(chipClusterPtr, callback);
    }

    public void writeWindSettingAttribute(DefaultClusterCallback callback, Integer value) {
      writeWindSettingAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeWindSettingAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeWindSettingAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeWindSettingAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWindSettingAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readFanModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeFanModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeFanModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFanModeSequenceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeFanModeSequenceAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeFanModeSequenceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPercentSettingAttribute(
        long chipClusterPtr, PercentSettingAttributeCallback callback);

    private native void writePercentSettingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribePercentSettingAttribute(
        long chipClusterPtr,
        PercentSettingAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPercentCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePercentCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSpeedMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSpeedMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSpeedSettingAttribute(
        long chipClusterPtr, SpeedSettingAttributeCallback callback);

    private native void writeSpeedSettingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSpeedSettingAttribute(
        long chipClusterPtr,
        SpeedSettingAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSpeedCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeSpeedCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRockSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRockSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRockSettingAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRockSettingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRockSettingAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWindSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeWindSupportAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWindSettingAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeWindSettingAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeWindSettingAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ThermostatUserInterfaceConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 516L;

    public ThermostatUserInterfaceConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readTemperatureDisplayModeAttribute(IntegerAttributeCallback callback) {
      readTemperatureDisplayModeAttribute(chipClusterPtr, callback);
    }

    public void writeTemperatureDisplayModeAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeTemperatureDisplayModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeTemperatureDisplayModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeTemperatureDisplayModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeTemperatureDisplayModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTemperatureDisplayModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readKeypadLockoutAttribute(IntegerAttributeCallback callback) {
      readKeypadLockoutAttribute(chipClusterPtr, callback);
    }

    public void writeKeypadLockoutAttribute(DefaultClusterCallback callback, Integer value) {
      writeKeypadLockoutAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeKeypadLockoutAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeKeypadLockoutAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeKeypadLockoutAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeKeypadLockoutAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScheduleProgrammingVisibilityAttribute(IntegerAttributeCallback callback) {
      readScheduleProgrammingVisibilityAttribute(chipClusterPtr, callback);
    }

    public void writeScheduleProgrammingVisibilityAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeScheduleProgrammingVisibilityAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeScheduleProgrammingVisibilityAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeScheduleProgrammingVisibilityAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeScheduleProgrammingVisibilityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScheduleProgrammingVisibilityAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readTemperatureDisplayModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeTemperatureDisplayModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeTemperatureDisplayModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readKeypadLockoutAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeKeypadLockoutAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeKeypadLockoutAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readScheduleProgrammingVisibilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeScheduleProgrammingVisibilityAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeScheduleProgrammingVisibilityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ColorControlCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 768L;

    public ColorControlCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void moveToHue(
        DefaultClusterCallback callback,
        Integer hue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToHue(
          chipClusterPtr,
          callback,
          hue,
          direction,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveToHue(
        DefaultClusterCallback callback,
        Integer hue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToHue(
          chipClusterPtr,
          callback,
          hue,
          direction,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveHue(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      moveHue(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void moveHue(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveHue(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepHue(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      stepHue(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepHue(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepHue(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveToSaturation(
        DefaultClusterCallback callback,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToSaturation(
          chipClusterPtr, callback, saturation, transitionTime, optionsMask, optionsOverride, null);
    }

    public void moveToSaturation(
        DefaultClusterCallback callback,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToSaturation(
          chipClusterPtr,
          callback,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveSaturation(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      moveSaturation(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void moveSaturation(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveSaturation(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepSaturation(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      stepSaturation(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepSaturation(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepSaturation(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveToHueAndSaturation(
        DefaultClusterCallback callback,
        Integer hue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToHueAndSaturation(
          chipClusterPtr,
          callback,
          hue,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveToHueAndSaturation(
        DefaultClusterCallback callback,
        Integer hue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToHueAndSaturation(
          chipClusterPtr,
          callback,
          hue,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveToColor(
        DefaultClusterCallback callback,
        Integer colorX,
        Integer colorY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToColor(
          chipClusterPtr,
          callback,
          colorX,
          colorY,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveToColor(
        DefaultClusterCallback callback,
        Integer colorX,
        Integer colorY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToColor(
          chipClusterPtr,
          callback,
          colorX,
          colorY,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveColor(
        DefaultClusterCallback callback,
        Integer rateX,
        Integer rateY,
        Integer optionsMask,
        Integer optionsOverride) {
      moveColor(chipClusterPtr, callback, rateX, rateY, optionsMask, optionsOverride, null);
    }

    public void moveColor(
        DefaultClusterCallback callback,
        Integer rateX,
        Integer rateY,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveColor(
          chipClusterPtr,
          callback,
          rateX,
          rateY,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepColor(
        DefaultClusterCallback callback,
        Integer stepX,
        Integer stepY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      stepColor(
          chipClusterPtr,
          callback,
          stepX,
          stepY,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepColor(
        DefaultClusterCallback callback,
        Integer stepX,
        Integer stepY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepColor(
          chipClusterPtr,
          callback,
          stepX,
          stepY,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void moveToColorTemperature(
        DefaultClusterCallback callback,
        Integer colorTemperature,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      moveToColorTemperature(
          chipClusterPtr,
          callback,
          colorTemperature,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveToColorTemperature(
        DefaultClusterCallback callback,
        Integer colorTemperature,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveToColorTemperature(
          chipClusterPtr,
          callback,
          colorTemperature,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void enhancedMoveToHue(
        DefaultClusterCallback callback,
        Integer enhancedHue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      enhancedMoveToHue(
          chipClusterPtr,
          callback,
          enhancedHue,
          direction,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void enhancedMoveToHue(
        DefaultClusterCallback callback,
        Integer enhancedHue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      enhancedMoveToHue(
          chipClusterPtr,
          callback,
          enhancedHue,
          direction,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void enhancedMoveHue(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride) {
      enhancedMoveHue(chipClusterPtr, callback, moveMode, rate, optionsMask, optionsOverride, null);
    }

    public void enhancedMoveHue(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      enhancedMoveHue(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void enhancedStepHue(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      enhancedStepHue(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void enhancedStepHue(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      enhancedStepHue(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void enhancedMoveToHueAndSaturation(
        DefaultClusterCallback callback,
        Integer enhancedHue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride) {
      enhancedMoveToHueAndSaturation(
          chipClusterPtr,
          callback,
          enhancedHue,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          null);
    }

    public void enhancedMoveToHueAndSaturation(
        DefaultClusterCallback callback,
        Integer enhancedHue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      enhancedMoveToHueAndSaturation(
          chipClusterPtr,
          callback,
          enhancedHue,
          saturation,
          transitionTime,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void colorLoopSet(
        DefaultClusterCallback callback,
        Integer updateFlags,
        Integer action,
        Integer direction,
        Integer time,
        Integer startHue,
        Integer optionsMask,
        Integer optionsOverride) {
      colorLoopSet(
          chipClusterPtr,
          callback,
          updateFlags,
          action,
          direction,
          time,
          startHue,
          optionsMask,
          optionsOverride,
          null);
    }

    public void colorLoopSet(
        DefaultClusterCallback callback,
        Integer updateFlags,
        Integer action,
        Integer direction,
        Integer time,
        Integer startHue,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      colorLoopSet(
          chipClusterPtr,
          callback,
          updateFlags,
          action,
          direction,
          time,
          startHue,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stopMoveStep(
        DefaultClusterCallback callback, Integer optionsMask, Integer optionsOverride) {
      stopMoveStep(chipClusterPtr, callback, optionsMask, optionsOverride, null);
    }

    public void stopMoveStep(
        DefaultClusterCallback callback,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stopMoveStep(chipClusterPtr, callback, optionsMask, optionsOverride, timedInvokeTimeoutMs);
    }

    public void moveColorTemperature(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride) {
      moveColorTemperature(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          colorTemperatureMinimumMireds,
          colorTemperatureMaximumMireds,
          optionsMask,
          optionsOverride,
          null);
    }

    public void moveColorTemperature(
        DefaultClusterCallback callback,
        Integer moveMode,
        Integer rate,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      moveColorTemperature(
          chipClusterPtr,
          callback,
          moveMode,
          rate,
          colorTemperatureMinimumMireds,
          colorTemperatureMaximumMireds,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    public void stepColorTemperature(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride) {
      stepColorTemperature(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          colorTemperatureMinimumMireds,
          colorTemperatureMaximumMireds,
          optionsMask,
          optionsOverride,
          null);
    }

    public void stepColorTemperature(
        DefaultClusterCallback callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride,
        int timedInvokeTimeoutMs) {
      stepColorTemperature(
          chipClusterPtr,
          callback,
          stepMode,
          stepSize,
          transitionTime,
          colorTemperatureMinimumMireds,
          colorTemperatureMaximumMireds,
          optionsMask,
          optionsOverride,
          timedInvokeTimeoutMs);
    }

    private native void moveToHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer hue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToHueAndSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer hue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToColor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer colorX,
        Integer colorY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveColor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer rateX,
        Integer rateY,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepColor(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepX,
        Integer stepY,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveToColorTemperature(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer colorTemperature,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enhancedMoveToHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer enhancedHue,
        Integer direction,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enhancedMoveHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        Integer rate,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enhancedStepHue(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void enhancedMoveToHueAndSaturation(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer enhancedHue,
        Integer saturation,
        Integer transitionTime,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void colorLoopSet(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer updateFlags,
        Integer action,
        Integer direction,
        Integer time,
        Integer startHue,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopMoveStep(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void moveColorTemperature(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer moveMode,
        Integer rate,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stepColorTemperature(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer stepMode,
        Integer stepSize,
        Integer transitionTime,
        Integer colorTemperatureMinimumMireds,
        Integer colorTemperatureMaximumMireds,
        Integer optionsMask,
        Integer optionsOverride,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface NumberOfPrimariesAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary1IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary2IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary3IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary4IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary5IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface Primary6IntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ColorPointRIntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ColorPointGIntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ColorPointBIntensityAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface StartUpColorTemperatureMiredsAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readCurrentHueAttribute(IntegerAttributeCallback callback) {
      readCurrentHueAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentHueAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentHueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentSaturationAttribute(IntegerAttributeCallback callback) {
      readCurrentSaturationAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentSaturationAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentSaturationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRemainingTimeAttribute(IntegerAttributeCallback callback) {
      readRemainingTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeRemainingTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRemainingTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentXAttribute(IntegerAttributeCallback callback) {
      readCurrentXAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentYAttribute(IntegerAttributeCallback callback) {
      readCurrentYAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDriftCompensationAttribute(IntegerAttributeCallback callback) {
      readDriftCompensationAttribute(chipClusterPtr, callback);
    }

    public void subscribeDriftCompensationAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDriftCompensationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCompensationTextAttribute(CharStringAttributeCallback callback) {
      readCompensationTextAttribute(chipClusterPtr, callback);
    }

    public void subscribeCompensationTextAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCompensationTextAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorTemperatureMiredsAttribute(IntegerAttributeCallback callback) {
      readColorTemperatureMiredsAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorTemperatureMiredsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorTemperatureMiredsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorModeAttribute(IntegerAttributeCallback callback) {
      readColorModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOptionsAttribute(IntegerAttributeCallback callback) {
      readOptionsAttribute(chipClusterPtr, callback);
    }

    public void writeOptionsAttribute(DefaultClusterCallback callback, Integer value) {
      writeOptionsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOptionsAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeOptionsAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOptionsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOptionsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNumberOfPrimariesAttribute(NumberOfPrimariesAttributeCallback callback) {
      readNumberOfPrimariesAttribute(chipClusterPtr, callback);
    }

    public void subscribeNumberOfPrimariesAttribute(
        NumberOfPrimariesAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNumberOfPrimariesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary1XAttribute(IntegerAttributeCallback callback) {
      readPrimary1XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary1XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary1XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary1YAttribute(IntegerAttributeCallback callback) {
      readPrimary1YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary1YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary1YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary1IntensityAttribute(Primary1IntensityAttributeCallback callback) {
      readPrimary1IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary1IntensityAttribute(
        Primary1IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary1IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary2XAttribute(IntegerAttributeCallback callback) {
      readPrimary2XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary2XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary2XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary2YAttribute(IntegerAttributeCallback callback) {
      readPrimary2YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary2YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary2YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary2IntensityAttribute(Primary2IntensityAttributeCallback callback) {
      readPrimary2IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary2IntensityAttribute(
        Primary2IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary2IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary3XAttribute(IntegerAttributeCallback callback) {
      readPrimary3XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary3XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary3XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary3YAttribute(IntegerAttributeCallback callback) {
      readPrimary3YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary3YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary3YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary3IntensityAttribute(Primary3IntensityAttributeCallback callback) {
      readPrimary3IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary3IntensityAttribute(
        Primary3IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary3IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary4XAttribute(IntegerAttributeCallback callback) {
      readPrimary4XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary4XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary4XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary4YAttribute(IntegerAttributeCallback callback) {
      readPrimary4YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary4YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary4YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary4IntensityAttribute(Primary4IntensityAttributeCallback callback) {
      readPrimary4IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary4IntensityAttribute(
        Primary4IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary4IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary5XAttribute(IntegerAttributeCallback callback) {
      readPrimary5XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary5XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary5XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary5YAttribute(IntegerAttributeCallback callback) {
      readPrimary5YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary5YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary5YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary5IntensityAttribute(Primary5IntensityAttributeCallback callback) {
      readPrimary5IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary5IntensityAttribute(
        Primary5IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary5IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary6XAttribute(IntegerAttributeCallback callback) {
      readPrimary6XAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary6XAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary6XAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary6YAttribute(IntegerAttributeCallback callback) {
      readPrimary6YAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary6YAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary6YAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPrimary6IntensityAttribute(Primary6IntensityAttributeCallback callback) {
      readPrimary6IntensityAttribute(chipClusterPtr, callback);
    }

    public void subscribePrimary6IntensityAttribute(
        Primary6IntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePrimary6IntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWhitePointXAttribute(IntegerAttributeCallback callback) {
      readWhitePointXAttribute(chipClusterPtr, callback);
    }

    public void writeWhitePointXAttribute(DefaultClusterCallback callback, Integer value) {
      writeWhitePointXAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeWhitePointXAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeWhitePointXAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeWhitePointXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWhitePointXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readWhitePointYAttribute(IntegerAttributeCallback callback) {
      readWhitePointYAttribute(chipClusterPtr, callback);
    }

    public void writeWhitePointYAttribute(DefaultClusterCallback callback, Integer value) {
      writeWhitePointYAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeWhitePointYAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeWhitePointYAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeWhitePointYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeWhitePointYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointRXAttribute(IntegerAttributeCallback callback) {
      readColorPointRXAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointRXAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointRXAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointRXAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointRXAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointRXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointRXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointRYAttribute(IntegerAttributeCallback callback) {
      readColorPointRYAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointRYAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointRYAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointRYAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointRYAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointRYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointRYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointRIntensityAttribute(ColorPointRIntensityAttributeCallback callback) {
      readColorPointRIntensityAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointRIntensityAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointRIntensityAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointRIntensityAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointRIntensityAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointRIntensityAttribute(
        ColorPointRIntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointRIntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointGXAttribute(IntegerAttributeCallback callback) {
      readColorPointGXAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointGXAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointGXAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointGXAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointGXAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointGXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointGXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointGYAttribute(IntegerAttributeCallback callback) {
      readColorPointGYAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointGYAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointGYAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointGYAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointGYAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointGYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointGYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointGIntensityAttribute(ColorPointGIntensityAttributeCallback callback) {
      readColorPointGIntensityAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointGIntensityAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointGIntensityAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointGIntensityAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointGIntensityAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointGIntensityAttribute(
        ColorPointGIntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointGIntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointBXAttribute(IntegerAttributeCallback callback) {
      readColorPointBXAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointBXAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointBXAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointBXAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointBXAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointBXAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointBXAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointBYAttribute(IntegerAttributeCallback callback) {
      readColorPointBYAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointBYAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointBYAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointBYAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointBYAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointBYAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointBYAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorPointBIntensityAttribute(ColorPointBIntensityAttributeCallback callback) {
      readColorPointBIntensityAttribute(chipClusterPtr, callback);
    }

    public void writeColorPointBIntensityAttribute(DefaultClusterCallback callback, Integer value) {
      writeColorPointBIntensityAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeColorPointBIntensityAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeColorPointBIntensityAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeColorPointBIntensityAttribute(
        ColorPointBIntensityAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorPointBIntensityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnhancedCurrentHueAttribute(IntegerAttributeCallback callback) {
      readEnhancedCurrentHueAttribute(chipClusterPtr, callback);
    }

    public void subscribeEnhancedCurrentHueAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnhancedCurrentHueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnhancedColorModeAttribute(IntegerAttributeCallback callback) {
      readEnhancedColorModeAttribute(chipClusterPtr, callback);
    }

    public void subscribeEnhancedColorModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnhancedColorModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopActiveAttribute(IntegerAttributeCallback callback) {
      readColorLoopActiveAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopActiveAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopActiveAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopDirectionAttribute(IntegerAttributeCallback callback) {
      readColorLoopDirectionAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopDirectionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopDirectionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopTimeAttribute(IntegerAttributeCallback callback) {
      readColorLoopTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopTimeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopStartEnhancedHueAttribute(IntegerAttributeCallback callback) {
      readColorLoopStartEnhancedHueAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopStartEnhancedHueAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopStartEnhancedHueAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorLoopStoredEnhancedHueAttribute(IntegerAttributeCallback callback) {
      readColorLoopStoredEnhancedHueAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorLoopStoredEnhancedHueAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorLoopStoredEnhancedHueAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorCapabilitiesAttribute(IntegerAttributeCallback callback) {
      readColorCapabilitiesAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorCapabilitiesAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorCapabilitiesAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorTempPhysicalMinMiredsAttribute(IntegerAttributeCallback callback) {
      readColorTempPhysicalMinMiredsAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorTempPhysicalMinMiredsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorTempPhysicalMinMiredsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readColorTempPhysicalMaxMiredsAttribute(IntegerAttributeCallback callback) {
      readColorTempPhysicalMaxMiredsAttribute(chipClusterPtr, callback);
    }

    public void subscribeColorTempPhysicalMaxMiredsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeColorTempPhysicalMaxMiredsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCoupleColorTempToLevelMinMiredsAttribute(IntegerAttributeCallback callback) {
      readCoupleColorTempToLevelMinMiredsAttribute(chipClusterPtr, callback);
    }

    public void subscribeCoupleColorTempToLevelMinMiredsAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCoupleColorTempToLevelMinMiredsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartUpColorTemperatureMiredsAttribute(
        StartUpColorTemperatureMiredsAttributeCallback callback) {
      readStartUpColorTemperatureMiredsAttribute(chipClusterPtr, callback);
    }

    public void writeStartUpColorTemperatureMiredsAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeStartUpColorTemperatureMiredsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeStartUpColorTemperatureMiredsAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeStartUpColorTemperatureMiredsAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeStartUpColorTemperatureMiredsAttribute(
        StartUpColorTemperatureMiredsAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartUpColorTemperatureMiredsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readCurrentHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentSaturationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentSaturationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRemainingTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRemainingTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDriftCompensationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeDriftCompensationAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCompensationTextAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeCompensationTextAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readColorTemperatureMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorTemperatureMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOptionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeOptionsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOptionsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNumberOfPrimariesAttribute(
        long chipClusterPtr, NumberOfPrimariesAttributeCallback callback);

    private native void subscribeNumberOfPrimariesAttribute(
        long chipClusterPtr,
        NumberOfPrimariesAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary1XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary1XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary1YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary1YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary1IntensityAttribute(
        long chipClusterPtr, Primary1IntensityAttributeCallback callback);

    private native void subscribePrimary1IntensityAttribute(
        long chipClusterPtr,
        Primary1IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary2XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary2XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary2YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary2YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary2IntensityAttribute(
        long chipClusterPtr, Primary2IntensityAttributeCallback callback);

    private native void subscribePrimary2IntensityAttribute(
        long chipClusterPtr,
        Primary2IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary3XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary3XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary3YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary3YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary3IntensityAttribute(
        long chipClusterPtr, Primary3IntensityAttributeCallback callback);

    private native void subscribePrimary3IntensityAttribute(
        long chipClusterPtr,
        Primary3IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary4XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary4XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary4YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary4YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary4IntensityAttribute(
        long chipClusterPtr, Primary4IntensityAttributeCallback callback);

    private native void subscribePrimary4IntensityAttribute(
        long chipClusterPtr,
        Primary4IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary5XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary5XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary5YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary5YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary5IntensityAttribute(
        long chipClusterPtr, Primary5IntensityAttributeCallback callback);

    private native void subscribePrimary5IntensityAttribute(
        long chipClusterPtr,
        Primary5IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readPrimary6XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary6XAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary6YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePrimary6YAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPrimary6IntensityAttribute(
        long chipClusterPtr, Primary6IntensityAttributeCallback callback);

    private native void subscribePrimary6IntensityAttribute(
        long chipClusterPtr,
        Primary6IntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readWhitePointXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeWhitePointXAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeWhitePointXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readWhitePointYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeWhitePointYAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeWhitePointYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointRXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointRXAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointRXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointRYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointRYAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointRYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointRIntensityAttribute(
        long chipClusterPtr, ColorPointRIntensityAttributeCallback callback);

    private native void writeColorPointRIntensityAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointRIntensityAttribute(
        long chipClusterPtr,
        ColorPointRIntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readColorPointGXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointGXAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointGXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointGYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointGYAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointGYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointGIntensityAttribute(
        long chipClusterPtr, ColorPointGIntensityAttributeCallback callback);

    private native void writeColorPointGIntensityAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointGIntensityAttribute(
        long chipClusterPtr,
        ColorPointGIntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readColorPointBXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointBXAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointBXAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointBYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeColorPointBYAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointBYAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorPointBIntensityAttribute(
        long chipClusterPtr, ColorPointBIntensityAttributeCallback callback);

    private native void writeColorPointBIntensityAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeColorPointBIntensityAttribute(
        long chipClusterPtr,
        ColorPointBIntensityAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEnhancedCurrentHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEnhancedCurrentHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnhancedColorModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeEnhancedColorModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopActiveAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopActiveAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopDirectionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopDirectionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopTimeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopStartEnhancedHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopStartEnhancedHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorLoopStoredEnhancedHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorLoopStoredEnhancedHueAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorCapabilitiesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorCapabilitiesAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorTempPhysicalMinMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorTempPhysicalMinMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readColorTempPhysicalMaxMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeColorTempPhysicalMaxMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCoupleColorTempToLevelMinMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCoupleColorTempToLevelMinMiredsAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartUpColorTemperatureMiredsAttribute(
        long chipClusterPtr, StartUpColorTemperatureMiredsAttributeCallback callback);

    private native void writeStartUpColorTemperatureMiredsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeStartUpColorTemperatureMiredsAttribute(
        long chipClusterPtr,
        StartUpColorTemperatureMiredsAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class BallastConfigurationCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 769L;

    public BallastConfigurationCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface IntrinsicBalanceFactorAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface BallastFactorAdjustmentAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LampRatedHoursAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LampBurnHoursAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LampBurnHoursTripPointAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readPhysicalMinLevelAttribute(IntegerAttributeCallback callback) {
      readPhysicalMinLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribePhysicalMinLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePhysicalMinLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPhysicalMaxLevelAttribute(IntegerAttributeCallback callback) {
      readPhysicalMaxLevelAttribute(chipClusterPtr, callback);
    }

    public void subscribePhysicalMaxLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePhysicalMaxLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBallastStatusAttribute(IntegerAttributeCallback callback) {
      readBallastStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeBallastStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBallastStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinLevelAttribute(IntegerAttributeCallback callback) {
      readMinLevelAttribute(chipClusterPtr, callback);
    }

    public void writeMinLevelAttribute(DefaultClusterCallback callback, Integer value) {
      writeMinLevelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMinLevelAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMinLevelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMinLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxLevelAttribute(IntegerAttributeCallback callback) {
      readMaxLevelAttribute(chipClusterPtr, callback);
    }

    public void writeMaxLevelAttribute(DefaultClusterCallback callback, Integer value) {
      writeMaxLevelAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeMaxLevelAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeMaxLevelAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeMaxLevelAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxLevelAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readIntrinsicBalanceFactorAttribute(
        IntrinsicBalanceFactorAttributeCallback callback) {
      readIntrinsicBalanceFactorAttribute(chipClusterPtr, callback);
    }

    public void writeIntrinsicBalanceFactorAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeIntrinsicBalanceFactorAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeIntrinsicBalanceFactorAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeIntrinsicBalanceFactorAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeIntrinsicBalanceFactorAttribute(
        IntrinsicBalanceFactorAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeIntrinsicBalanceFactorAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBallastFactorAdjustmentAttribute(
        BallastFactorAdjustmentAttributeCallback callback) {
      readBallastFactorAdjustmentAttribute(chipClusterPtr, callback);
    }

    public void writeBallastFactorAdjustmentAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeBallastFactorAdjustmentAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeBallastFactorAdjustmentAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeBallastFactorAdjustmentAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBallastFactorAdjustmentAttribute(
        BallastFactorAdjustmentAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBallastFactorAdjustmentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampQuantityAttribute(IntegerAttributeCallback callback) {
      readLampQuantityAttribute(chipClusterPtr, callback);
    }

    public void subscribeLampQuantityAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampQuantityAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampTypeAttribute(CharStringAttributeCallback callback) {
      readLampTypeAttribute(chipClusterPtr, callback);
    }

    public void writeLampTypeAttribute(DefaultClusterCallback callback, String value) {
      writeLampTypeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampTypeAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLampTypeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampTypeAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampManufacturerAttribute(CharStringAttributeCallback callback) {
      readLampManufacturerAttribute(chipClusterPtr, callback);
    }

    public void writeLampManufacturerAttribute(DefaultClusterCallback callback, String value) {
      writeLampManufacturerAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampManufacturerAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLampManufacturerAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampManufacturerAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampManufacturerAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampRatedHoursAttribute(LampRatedHoursAttributeCallback callback) {
      readLampRatedHoursAttribute(chipClusterPtr, callback);
    }

    public void writeLampRatedHoursAttribute(DefaultClusterCallback callback, Long value) {
      writeLampRatedHoursAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampRatedHoursAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLampRatedHoursAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampRatedHoursAttribute(
        LampRatedHoursAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampRatedHoursAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampBurnHoursAttribute(LampBurnHoursAttributeCallback callback) {
      readLampBurnHoursAttribute(chipClusterPtr, callback);
    }

    public void writeLampBurnHoursAttribute(DefaultClusterCallback callback, Long value) {
      writeLampBurnHoursAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampBurnHoursAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLampBurnHoursAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampBurnHoursAttribute(
        LampBurnHoursAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampBurnHoursAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampAlarmModeAttribute(IntegerAttributeCallback callback) {
      readLampAlarmModeAttribute(chipClusterPtr, callback);
    }

    public void writeLampAlarmModeAttribute(DefaultClusterCallback callback, Integer value) {
      writeLampAlarmModeAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampAlarmModeAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeLampAlarmModeAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampAlarmModeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampAlarmModeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLampBurnHoursTripPointAttribute(
        LampBurnHoursTripPointAttributeCallback callback) {
      readLampBurnHoursTripPointAttribute(chipClusterPtr, callback);
    }

    public void writeLampBurnHoursTripPointAttribute(DefaultClusterCallback callback, Long value) {
      writeLampBurnHoursTripPointAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLampBurnHoursTripPointAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeLampBurnHoursTripPointAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLampBurnHoursTripPointAttribute(
        LampBurnHoursTripPointAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLampBurnHoursTripPointAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readPhysicalMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePhysicalMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPhysicalMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribePhysicalMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBallastStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeBallastStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMinLevelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMinLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeMaxLevelAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeMaxLevelAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readIntrinsicBalanceFactorAttribute(
        long chipClusterPtr, IntrinsicBalanceFactorAttributeCallback callback);

    private native void writeIntrinsicBalanceFactorAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeIntrinsicBalanceFactorAttribute(
        long chipClusterPtr,
        IntrinsicBalanceFactorAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readBallastFactorAdjustmentAttribute(
        long chipClusterPtr, BallastFactorAdjustmentAttributeCallback callback);

    private native void writeBallastFactorAdjustmentAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBallastFactorAdjustmentAttribute(
        long chipClusterPtr,
        BallastFactorAdjustmentAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampQuantityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeLampQuantityAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLampTypeAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLampTypeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampTypeAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampManufacturerAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLampManufacturerAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampManufacturerAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampRatedHoursAttribute(
        long chipClusterPtr, LampRatedHoursAttributeCallback callback);

    private native void writeLampRatedHoursAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampRatedHoursAttribute(
        long chipClusterPtr,
        LampRatedHoursAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampBurnHoursAttribute(
        long chipClusterPtr, LampBurnHoursAttributeCallback callback);

    private native void writeLampBurnHoursAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampBurnHoursAttribute(
        long chipClusterPtr,
        LampBurnHoursAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLampAlarmModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeLampAlarmModeAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampAlarmModeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLampBurnHoursTripPointAttribute(
        long chipClusterPtr, LampBurnHoursTripPointAttributeCallback callback);

    private native void writeLampBurnHoursTripPointAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLampBurnHoursTripPointAttribute(
        long chipClusterPtr,
        LampBurnHoursTripPointAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class IlluminanceMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1024L;

    public IlluminanceMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface LightSensorTypeAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLightSensorTypeAttribute(LightSensorTypeAttributeCallback callback) {
      readLightSensorTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeLightSensorTypeAttribute(
        LightSensorTypeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLightSensorTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readLightSensorTypeAttribute(
        long chipClusterPtr, LightSensorTypeAttributeCallback callback);

    private native void subscribeLightSensorTypeAttribute(
        long chipClusterPtr,
        LightSensorTypeAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class TemperatureMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1026L;

    public TemperatureMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class PressureMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1027L;

    public PressureMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ScaledValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinScaledValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxScaledValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScaledValueAttribute(ScaledValueAttributeCallback callback) {
      readScaledValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeScaledValueAttribute(
        ScaledValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScaledValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinScaledValueAttribute(MinScaledValueAttributeCallback callback) {
      readMinScaledValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinScaledValueAttribute(
        MinScaledValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinScaledValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxScaledValueAttribute(MaxScaledValueAttributeCallback callback) {
      readMaxScaledValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxScaledValueAttribute(
        MaxScaledValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxScaledValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScaledToleranceAttribute(IntegerAttributeCallback callback) {
      readScaledToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeScaledToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScaledToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readScaleAttribute(IntegerAttributeCallback callback) {
      readScaleAttribute(chipClusterPtr, callback);
    }

    public void subscribeScaleAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeScaleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readScaledValueAttribute(
        long chipClusterPtr, ScaledValueAttributeCallback callback);

    private native void subscribeScaledValueAttribute(
        long chipClusterPtr,
        ScaledValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinScaledValueAttribute(
        long chipClusterPtr, MinScaledValueAttributeCallback callback);

    private native void subscribeMinScaledValueAttribute(
        long chipClusterPtr,
        MinScaledValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxScaledValueAttribute(
        long chipClusterPtr, MaxScaledValueAttributeCallback callback);

    private native void subscribeMaxScaledValueAttribute(
        long chipClusterPtr,
        MaxScaledValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readScaledToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeScaledToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readScaleAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeScaleAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class FlowMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1028L;

    public FlowMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class RelativeHumidityMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1029L;

    public RelativeHumidityMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface MeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MinMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface MaxMeasuredValueAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasuredValueAttribute(MeasuredValueAttributeCallback callback) {
      readMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasuredValueAttribute(
        MeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMinMeasuredValueAttribute(MinMeasuredValueAttributeCallback callback) {
      readMinMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMinMeasuredValueAttribute(
        MinMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMinMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readMaxMeasuredValueAttribute(MaxMeasuredValueAttributeCallback callback) {
      readMaxMeasuredValueAttribute(chipClusterPtr, callback);
    }

    public void subscribeMaxMeasuredValueAttribute(
        MaxMeasuredValueAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMaxMeasuredValueAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readToleranceAttribute(IntegerAttributeCallback callback) {
      readToleranceAttribute(chipClusterPtr, callback);
    }

    public void subscribeToleranceAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeToleranceAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasuredValueAttribute(
        long chipClusterPtr, MeasuredValueAttributeCallback callback);

    private native void subscribeMeasuredValueAttribute(
        long chipClusterPtr,
        MeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMinMeasuredValueAttribute(
        long chipClusterPtr, MinMeasuredValueAttributeCallback callback);

    private native void subscribeMinMeasuredValueAttribute(
        long chipClusterPtr,
        MinMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readMaxMeasuredValueAttribute(
        long chipClusterPtr, MaxMeasuredValueAttributeCallback callback);

    private native void subscribeMaxMeasuredValueAttribute(
        long chipClusterPtr,
        MaxMeasuredValueAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeToleranceAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class OccupancySensingCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1030L;

    public OccupancySensingCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readOccupancyAttribute(IntegerAttributeCallback callback) {
      readOccupancyAttribute(chipClusterPtr, callback);
    }

    public void subscribeOccupancyAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupancyAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOccupancySensorTypeAttribute(IntegerAttributeCallback callback) {
      readOccupancySensorTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeOccupancySensorTypeAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupancySensorTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOccupancySensorTypeBitmapAttribute(IntegerAttributeCallback callback) {
      readOccupancySensorTypeBitmapAttribute(chipClusterPtr, callback);
    }

    public void subscribeOccupancySensorTypeBitmapAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOccupancySensorTypeBitmapAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readOccupancyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOccupancyAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOccupancySensorTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOccupancySensorTypeAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOccupancySensorTypeBitmapAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeOccupancySensorTypeBitmapAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class WakeOnLanCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1283L;

    public WakeOnLanCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMACAddressAttribute(CharStringAttributeCallback callback) {
      readMACAddressAttribute(chipClusterPtr, callback);
    }

    public void subscribeMACAddressAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMACAddressAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMACAddressAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeMACAddressAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ChannelCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1284L;

    public ChannelCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void changeChannel(ChangeChannelResponseCallback callback, String match) {
      changeChannel(chipClusterPtr, callback, match, null);
    }

    public void changeChannel(
        ChangeChannelResponseCallback callback, String match, int timedInvokeTimeoutMs) {
      changeChannel(chipClusterPtr, callback, match, timedInvokeTimeoutMs);
    }

    public void changeChannelByNumber(
        DefaultClusterCallback callback, Integer majorNumber, Integer minorNumber) {
      changeChannelByNumber(chipClusterPtr, callback, majorNumber, minorNumber, null);
    }

    public void changeChannelByNumber(
        DefaultClusterCallback callback,
        Integer majorNumber,
        Integer minorNumber,
        int timedInvokeTimeoutMs) {
      changeChannelByNumber(
          chipClusterPtr, callback, majorNumber, minorNumber, timedInvokeTimeoutMs);
    }

    public void skipChannel(DefaultClusterCallback callback, Integer count) {
      skipChannel(chipClusterPtr, callback, count, null);
    }

    public void skipChannel(
        DefaultClusterCallback callback, Integer count, int timedInvokeTimeoutMs) {
      skipChannel(chipClusterPtr, callback, count, timedInvokeTimeoutMs);
    }

    private native void changeChannel(
        long chipClusterPtr,
        ChangeChannelResponseCallback Callback,
        String match,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void changeChannelByNumber(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer majorNumber,
        Integer minorNumber,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void skipChannel(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer count,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface ChangeChannelResponseCallback {
      void onSuccess(Integer status, Optional<String> data);

      void onError(Exception error);
    }

    public interface ChannelListAttributeCallback {
      void onSuccess(List<ChipStructs.ChannelClusterChannelInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readChannelListAttribute(ChannelListAttributeCallback callback) {
      readChannelListAttribute(chipClusterPtr, callback);
    }

    public void subscribeChannelListAttribute(
        ChannelListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeChannelListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readChannelListAttribute(
        long chipClusterPtr, ChannelListAttributeCallback callback);

    private native void subscribeChannelListAttribute(
        long chipClusterPtr,
        ChannelListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class TargetNavigatorCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1285L;

    public TargetNavigatorCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void navigateTarget(
        NavigateTargetResponseCallback callback, Integer target, Optional<String> data) {
      navigateTarget(chipClusterPtr, callback, target, data, null);
    }

    public void navigateTarget(
        NavigateTargetResponseCallback callback,
        Integer target,
        Optional<String> data,
        int timedInvokeTimeoutMs) {
      navigateTarget(chipClusterPtr, callback, target, data, timedInvokeTimeoutMs);
    }

    private native void navigateTarget(
        long chipClusterPtr,
        NavigateTargetResponseCallback Callback,
        Integer target,
        Optional<String> data,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface NavigateTargetResponseCallback {
      void onSuccess(Integer status, Optional<String> data);

      void onError(Exception error);
    }

    public interface TargetListAttributeCallback {
      void onSuccess(List<ChipStructs.TargetNavigatorClusterTargetInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readTargetListAttribute(TargetListAttributeCallback callback) {
      readTargetListAttribute(chipClusterPtr, callback);
    }

    public void subscribeTargetListAttribute(
        TargetListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTargetListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentTargetAttribute(IntegerAttributeCallback callback) {
      readCurrentTargetAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentTargetAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentTargetAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readTargetListAttribute(
        long chipClusterPtr, TargetListAttributeCallback callback);

    private native void subscribeTargetListAttribute(
        long chipClusterPtr,
        TargetListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentTargetAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentTargetAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class MediaPlaybackCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1286L;

    public MediaPlaybackCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void play(PlaybackResponseCallback callback) {
      play(chipClusterPtr, callback, null);
    }

    public void play(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      play(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void pause(PlaybackResponseCallback callback) {
      pause(chipClusterPtr, callback, null);
    }

    public void pause(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      pause(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void stopPlayback(PlaybackResponseCallback callback) {
      stopPlayback(chipClusterPtr, callback, null);
    }

    public void stopPlayback(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      stopPlayback(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void startOver(PlaybackResponseCallback callback) {
      startOver(chipClusterPtr, callback, null);
    }

    public void startOver(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      startOver(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void previous(PlaybackResponseCallback callback) {
      previous(chipClusterPtr, callback, null);
    }

    public void previous(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      previous(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void next(PlaybackResponseCallback callback) {
      next(chipClusterPtr, callback, null);
    }

    public void next(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      next(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void rewind(PlaybackResponseCallback callback) {
      rewind(chipClusterPtr, callback, null);
    }

    public void rewind(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      rewind(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void fastForward(PlaybackResponseCallback callback) {
      fastForward(chipClusterPtr, callback, null);
    }

    public void fastForward(PlaybackResponseCallback callback, int timedInvokeTimeoutMs) {

      fastForward(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void skipForward(PlaybackResponseCallback callback, Long deltaPositionMilliseconds) {
      skipForward(chipClusterPtr, callback, deltaPositionMilliseconds, null);
    }

    public void skipForward(
        PlaybackResponseCallback callback,
        Long deltaPositionMilliseconds,
        int timedInvokeTimeoutMs) {
      skipForward(chipClusterPtr, callback, deltaPositionMilliseconds, timedInvokeTimeoutMs);
    }

    public void skipBackward(PlaybackResponseCallback callback, Long deltaPositionMilliseconds) {
      skipBackward(chipClusterPtr, callback, deltaPositionMilliseconds, null);
    }

    public void skipBackward(
        PlaybackResponseCallback callback,
        Long deltaPositionMilliseconds,
        int timedInvokeTimeoutMs) {
      skipBackward(chipClusterPtr, callback, deltaPositionMilliseconds, timedInvokeTimeoutMs);
    }

    public void seek(PlaybackResponseCallback callback, Long position) {
      seek(chipClusterPtr, callback, position, null);
    }

    public void seek(PlaybackResponseCallback callback, Long position, int timedInvokeTimeoutMs) {
      seek(chipClusterPtr, callback, position, timedInvokeTimeoutMs);
    }

    private native void play(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void pause(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopPlayback(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void startOver(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void previous(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void next(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void rewind(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void fastForward(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void skipForward(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        Long deltaPositionMilliseconds,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void skipBackward(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        Long deltaPositionMilliseconds,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void seek(
        long chipClusterPtr,
        PlaybackResponseCallback Callback,
        Long position,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface PlaybackResponseCallback {
      void onSuccess(Integer status, Optional<String> data);

      void onError(Exception error);
    }

    public interface StartTimeAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface DurationAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SeekRangeEndAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface SeekRangeStartAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readCurrentStateAttribute(IntegerAttributeCallback callback) {
      readCurrentStateAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentStateAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentStateAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStartTimeAttribute(StartTimeAttributeCallback callback) {
      readStartTimeAttribute(chipClusterPtr, callback);
    }

    public void subscribeStartTimeAttribute(
        StartTimeAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStartTimeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readDurationAttribute(DurationAttributeCallback callback) {
      readDurationAttribute(chipClusterPtr, callback);
    }

    public void subscribeDurationAttribute(
        DurationAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeDurationAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readPlaybackSpeedAttribute(FloatAttributeCallback callback) {
      readPlaybackSpeedAttribute(chipClusterPtr, callback);
    }

    public void subscribePlaybackSpeedAttribute(
        FloatAttributeCallback callback, int minInterval, int maxInterval) {
      subscribePlaybackSpeedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSeekRangeEndAttribute(SeekRangeEndAttributeCallback callback) {
      readSeekRangeEndAttribute(chipClusterPtr, callback);
    }

    public void subscribeSeekRangeEndAttribute(
        SeekRangeEndAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSeekRangeEndAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSeekRangeStartAttribute(SeekRangeStartAttributeCallback callback) {
      readSeekRangeStartAttribute(chipClusterPtr, callback);
    }

    public void subscribeSeekRangeStartAttribute(
        SeekRangeStartAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSeekRangeStartAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readCurrentStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentStateAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStartTimeAttribute(
        long chipClusterPtr, StartTimeAttributeCallback callback);

    private native void subscribeStartTimeAttribute(
        long chipClusterPtr, StartTimeAttributeCallback callback, int minInterval, int maxInterval);

    private native void readDurationAttribute(
        long chipClusterPtr, DurationAttributeCallback callback);

    private native void subscribeDurationAttribute(
        long chipClusterPtr, DurationAttributeCallback callback, int minInterval, int maxInterval);

    private native void readPlaybackSpeedAttribute(
        long chipClusterPtr, FloatAttributeCallback callback);

    private native void subscribePlaybackSpeedAttribute(
        long chipClusterPtr, FloatAttributeCallback callback, int minInterval, int maxInterval);

    private native void readSeekRangeEndAttribute(
        long chipClusterPtr, SeekRangeEndAttributeCallback callback);

    private native void subscribeSeekRangeEndAttribute(
        long chipClusterPtr,
        SeekRangeEndAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSeekRangeStartAttribute(
        long chipClusterPtr, SeekRangeStartAttributeCallback callback);

    private native void subscribeSeekRangeStartAttribute(
        long chipClusterPtr,
        SeekRangeStartAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class MediaInputCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1287L;

    public MediaInputCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void selectInput(DefaultClusterCallback callback, Integer index) {
      selectInput(chipClusterPtr, callback, index, null);
    }

    public void selectInput(
        DefaultClusterCallback callback, Integer index, int timedInvokeTimeoutMs) {
      selectInput(chipClusterPtr, callback, index, timedInvokeTimeoutMs);
    }

    public void showInputStatus(DefaultClusterCallback callback) {
      showInputStatus(chipClusterPtr, callback, null);
    }

    public void showInputStatus(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      showInputStatus(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void hideInputStatus(DefaultClusterCallback callback) {
      hideInputStatus(chipClusterPtr, callback, null);
    }

    public void hideInputStatus(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      hideInputStatus(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void renameInput(DefaultClusterCallback callback, Integer index, String name) {
      renameInput(chipClusterPtr, callback, index, name, null);
    }

    public void renameInput(
        DefaultClusterCallback callback, Integer index, String name, int timedInvokeTimeoutMs) {
      renameInput(chipClusterPtr, callback, index, name, timedInvokeTimeoutMs);
    }

    private native void selectInput(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer index,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void showInputStatus(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void hideInputStatus(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void renameInput(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer index,
        String name,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface InputListAttributeCallback {
      void onSuccess(List<ChipStructs.MediaInputClusterInputInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readInputListAttribute(InputListAttributeCallback callback) {
      readInputListAttribute(chipClusterPtr, callback);
    }

    public void subscribeInputListAttribute(
        InputListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInputListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentInputAttribute(IntegerAttributeCallback callback) {
      readCurrentInputAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentInputAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentInputAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readInputListAttribute(
        long chipClusterPtr, InputListAttributeCallback callback);

    private native void subscribeInputListAttribute(
        long chipClusterPtr, InputListAttributeCallback callback, int minInterval, int maxInterval);

    private native void readCurrentInputAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentInputAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class LowPowerCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1288L;

    public LowPowerCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void sleep(DefaultClusterCallback callback) {
      sleep(chipClusterPtr, callback, null);
    }

    public void sleep(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      sleep(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void sleep(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class KeypadInputCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1289L;

    public KeypadInputCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void sendKey(SendKeyResponseCallback callback, Integer keyCode) {
      sendKey(chipClusterPtr, callback, keyCode, null);
    }

    public void sendKey(
        SendKeyResponseCallback callback, Integer keyCode, int timedInvokeTimeoutMs) {
      sendKey(chipClusterPtr, callback, keyCode, timedInvokeTimeoutMs);
    }

    private native void sendKey(
        long chipClusterPtr,
        SendKeyResponseCallback Callback,
        Integer keyCode,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface SendKeyResponseCallback {
      void onSuccess(Integer status);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ContentLauncherCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1290L;

    public ContentLauncherCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void launchContent(
        LaunchResponseCallback callback,
        ChipStructs.ContentLauncherClusterContentSearch search,
        Boolean autoPlay,
        Optional<String> data) {
      launchContent(chipClusterPtr, callback, search, autoPlay, data, null);
    }

    public void launchContent(
        LaunchResponseCallback callback,
        ChipStructs.ContentLauncherClusterContentSearch search,
        Boolean autoPlay,
        Optional<String> data,
        int timedInvokeTimeoutMs) {
      launchContent(chipClusterPtr, callback, search, autoPlay, data, timedInvokeTimeoutMs);
    }

    public void launchURL(
        LaunchResponseCallback callback,
        String contentURL,
        Optional<String> displayString,
        Optional<ChipStructs.ContentLauncherClusterBrandingInformation> brandingInformation) {
      launchURL(chipClusterPtr, callback, contentURL, displayString, brandingInformation, null);
    }

    public void launchURL(
        LaunchResponseCallback callback,
        String contentURL,
        Optional<String> displayString,
        Optional<ChipStructs.ContentLauncherClusterBrandingInformation> brandingInformation,
        int timedInvokeTimeoutMs) {
      launchURL(
          chipClusterPtr,
          callback,
          contentURL,
          displayString,
          brandingInformation,
          timedInvokeTimeoutMs);
    }

    private native void launchContent(
        long chipClusterPtr,
        LaunchResponseCallback Callback,
        ChipStructs.ContentLauncherClusterContentSearch search,
        Boolean autoPlay,
        Optional<String> data,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void launchURL(
        long chipClusterPtr,
        LaunchResponseCallback Callback,
        String contentURL,
        Optional<String> displayString,
        Optional<ChipStructs.ContentLauncherClusterBrandingInformation> brandingInformation,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface LaunchResponseCallback {
      void onSuccess(Integer status, Optional<String> data);

      void onError(Exception error);
    }

    public interface AcceptHeaderAttributeCallback {
      void onSuccess(List<String> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readAcceptHeaderAttribute(AcceptHeaderAttributeCallback callback) {
      readAcceptHeaderAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptHeaderAttribute(
        AcceptHeaderAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptHeaderAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readSupportedStreamingProtocolsAttribute(LongAttributeCallback callback) {
      readSupportedStreamingProtocolsAttribute(chipClusterPtr, callback);
    }

    public void writeSupportedStreamingProtocolsAttribute(
        DefaultClusterCallback callback, Long value) {
      writeSupportedStreamingProtocolsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeSupportedStreamingProtocolsAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeSupportedStreamingProtocolsAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeSupportedStreamingProtocolsAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeSupportedStreamingProtocolsAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readAcceptHeaderAttribute(
        long chipClusterPtr, AcceptHeaderAttributeCallback callback);

    private native void subscribeAcceptHeaderAttribute(
        long chipClusterPtr,
        AcceptHeaderAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readSupportedStreamingProtocolsAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void writeSupportedStreamingProtocolsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeSupportedStreamingProtocolsAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class AudioOutputCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1291L;

    public AudioOutputCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void selectOutput(DefaultClusterCallback callback, Integer index) {
      selectOutput(chipClusterPtr, callback, index, null);
    }

    public void selectOutput(
        DefaultClusterCallback callback, Integer index, int timedInvokeTimeoutMs) {
      selectOutput(chipClusterPtr, callback, index, timedInvokeTimeoutMs);
    }

    public void renameOutput(DefaultClusterCallback callback, Integer index, String name) {
      renameOutput(chipClusterPtr, callback, index, name, null);
    }

    public void renameOutput(
        DefaultClusterCallback callback, Integer index, String name, int timedInvokeTimeoutMs) {
      renameOutput(chipClusterPtr, callback, index, name, timedInvokeTimeoutMs);
    }

    private native void selectOutput(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer index,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void renameOutput(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Integer index,
        String name,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface OutputListAttributeCallback {
      void onSuccess(List<ChipStructs.AudioOutputClusterOutputInfo> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readOutputListAttribute(OutputListAttributeCallback callback) {
      readOutputListAttribute(chipClusterPtr, callback);
    }

    public void subscribeOutputListAttribute(
        OutputListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOutputListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCurrentOutputAttribute(IntegerAttributeCallback callback) {
      readCurrentOutputAttribute(chipClusterPtr, callback);
    }

    public void subscribeCurrentOutputAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCurrentOutputAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readOutputListAttribute(
        long chipClusterPtr, OutputListAttributeCallback callback);

    private native void subscribeOutputListAttribute(
        long chipClusterPtr,
        OutputListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCurrentOutputAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeCurrentOutputAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ApplicationLauncherCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1292L;

    public ApplicationLauncherCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void launchApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        Optional<byte[]> data) {
      launchApp(chipClusterPtr, callback, application, data, null);
    }

    public void launchApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        Optional<byte[]> data,
        int timedInvokeTimeoutMs) {
      launchApp(chipClusterPtr, callback, application, data, timedInvokeTimeoutMs);
    }

    public void stopApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application) {
      stopApp(chipClusterPtr, callback, application, null);
    }

    public void stopApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        int timedInvokeTimeoutMs) {
      stopApp(chipClusterPtr, callback, application, timedInvokeTimeoutMs);
    }

    public void hideApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application) {
      hideApp(chipClusterPtr, callback, application, null);
    }

    public void hideApp(
        LauncherResponseCallback callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        int timedInvokeTimeoutMs) {
      hideApp(chipClusterPtr, callback, application, timedInvokeTimeoutMs);
    }

    private native void launchApp(
        long chipClusterPtr,
        LauncherResponseCallback Callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        Optional<byte[]> data,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void stopApp(
        long chipClusterPtr,
        LauncherResponseCallback Callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void hideApp(
        long chipClusterPtr,
        LauncherResponseCallback Callback,
        ChipStructs.ApplicationLauncherClusterApplication application,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface LauncherResponseCallback {
      void onSuccess(Integer status, byte[] data);

      void onError(Exception error);
    }

    public interface CatalogListAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readCatalogListAttribute(CatalogListAttributeCallback callback) {
      readCatalogListAttribute(chipClusterPtr, callback);
    }

    public void subscribeCatalogListAttribute(
        CatalogListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCatalogListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readCatalogListAttribute(
        long chipClusterPtr, CatalogListAttributeCallback callback);

    private native void subscribeCatalogListAttribute(
        long chipClusterPtr,
        CatalogListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ApplicationBasicCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1293L;

    public ApplicationBasicCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface VendorIDAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AllowedVendorListAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readVendorNameAttribute(CharStringAttributeCallback callback) {
      readVendorNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorIDAttribute(VendorIDAttributeCallback callback) {
      readVendorIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeVendorIDAttribute(
        VendorIDAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readApplicationNameAttribute(CharStringAttributeCallback callback) {
      readApplicationNameAttribute(chipClusterPtr, callback);
    }

    public void subscribeApplicationNameAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeApplicationNameAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readProductIDAttribute(IntegerAttributeCallback callback) {
      readProductIDAttribute(chipClusterPtr, callback);
    }

    public void subscribeProductIDAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeProductIDAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readStatusAttribute(IntegerAttributeCallback callback) {
      readStatusAttribute(chipClusterPtr, callback);
    }

    public void subscribeStatusAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeStatusAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readApplicationVersionAttribute(CharStringAttributeCallback callback) {
      readApplicationVersionAttribute(chipClusterPtr, callback);
    }

    public void subscribeApplicationVersionAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeApplicationVersionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAllowedVendorListAttribute(AllowedVendorListAttributeCallback callback) {
      readAllowedVendorListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAllowedVendorListAttribute(
        AllowedVendorListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAllowedVendorListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readVendorNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeVendorNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback);

    private native void subscribeVendorIDAttribute(
        long chipClusterPtr, VendorIDAttributeCallback callback, int minInterval, int maxInterval);

    private native void readApplicationNameAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeApplicationNameAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readProductIDAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeProductIDAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readStatusAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeStatusAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readApplicationVersionAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void subscribeApplicationVersionAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAllowedVendorListAttribute(
        long chipClusterPtr, AllowedVendorListAttributeCallback callback);

    private native void subscribeAllowedVendorListAttribute(
        long chipClusterPtr,
        AllowedVendorListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class AccountLoginCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 1294L;

    public AccountLoginCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void getSetupPIN(
        GetSetupPINResponseCallback callback,
        String tempAccountIdentifier,
        int timedInvokeTimeoutMs) {
      getSetupPIN(chipClusterPtr, callback, tempAccountIdentifier, timedInvokeTimeoutMs);
    }

    public void login(
        DefaultClusterCallback callback,
        String tempAccountIdentifier,
        String setupPIN,
        int timedInvokeTimeoutMs) {
      login(chipClusterPtr, callback, tempAccountIdentifier, setupPIN, timedInvokeTimeoutMs);
    }

    public void logout(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      logout(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    private native void getSetupPIN(
        long chipClusterPtr,
        GetSetupPINResponseCallback Callback,
        String tempAccountIdentifier,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void login(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        String tempAccountIdentifier,
        String setupPIN,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void logout(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface GetSetupPINResponseCallback {
      void onSuccess(String setupPIN);

      void onError(Exception error);
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class ElectricalMeasurementCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 2820L;

    public ElectricalMeasurementCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readMeasurementTypeAttribute(LongAttributeCallback callback) {
      readMeasurementTypeAttribute(chipClusterPtr, callback);
    }

    public void subscribeMeasurementTypeAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeMeasurementTypeAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTotalActivePowerAttribute(LongAttributeCallback callback) {
      readTotalActivePowerAttribute(chipClusterPtr, callback);
    }

    public void subscribeTotalActivePowerAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTotalActivePowerAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsVoltageAttribute(IntegerAttributeCallback callback) {
      readRmsVoltageAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsVoltageAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsVoltageAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsVoltageMinAttribute(IntegerAttributeCallback callback) {
      readRmsVoltageMinAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsVoltageMinAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsVoltageMinAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsVoltageMaxAttribute(IntegerAttributeCallback callback) {
      readRmsVoltageMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsVoltageMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsVoltageMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsCurrentAttribute(IntegerAttributeCallback callback) {
      readRmsCurrentAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsCurrentAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsCurrentAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsCurrentMinAttribute(IntegerAttributeCallback callback) {
      readRmsCurrentMinAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsCurrentMinAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsCurrentMinAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRmsCurrentMaxAttribute(IntegerAttributeCallback callback) {
      readRmsCurrentMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeRmsCurrentMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRmsCurrentMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActivePowerAttribute(IntegerAttributeCallback callback) {
      readActivePowerAttribute(chipClusterPtr, callback);
    }

    public void subscribeActivePowerAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActivePowerAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActivePowerMinAttribute(IntegerAttributeCallback callback) {
      readActivePowerMinAttribute(chipClusterPtr, callback);
    }

    public void subscribeActivePowerMinAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActivePowerMinAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readActivePowerMaxAttribute(IntegerAttributeCallback callback) {
      readActivePowerMaxAttribute(chipClusterPtr, callback);
    }

    public void subscribeActivePowerMaxAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeActivePowerMaxAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readMeasurementTypeAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeMeasurementTypeAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readTotalActivePowerAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeTotalActivePowerAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsVoltageAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsVoltageAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsVoltageMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsVoltageMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsVoltageMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsVoltageMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsCurrentAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsCurrentMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsCurrentMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRmsCurrentMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeRmsCurrentMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActivePowerAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeActivePowerAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActivePowerMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeActivePowerMinAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readActivePowerMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeActivePowerMaxAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }

  public static class UnitTestingCluster extends BaseChipCluster {
    public static final long CLUSTER_ID = 4294048773L;

    public UnitTestingCluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);

    public void test(DefaultClusterCallback callback) {
      test(chipClusterPtr, callback, null);
    }

    public void test(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      test(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testNotHandled(DefaultClusterCallback callback) {
      testNotHandled(chipClusterPtr, callback, null);
    }

    public void testNotHandled(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      testNotHandled(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testSpecific(TestSpecificResponseCallback callback) {
      testSpecific(chipClusterPtr, callback, null);
    }

    public void testSpecific(TestSpecificResponseCallback callback, int timedInvokeTimeoutMs) {

      testSpecific(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testUnknownCommand(DefaultClusterCallback callback) {
      testUnknownCommand(chipClusterPtr, callback, null);
    }

    public void testUnknownCommand(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      testUnknownCommand(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testAddArguments(
        TestAddArgumentsResponseCallback callback, Integer arg1, Integer arg2) {
      testAddArguments(chipClusterPtr, callback, arg1, arg2, null);
    }

    public void testAddArguments(
        TestAddArgumentsResponseCallback callback,
        Integer arg1,
        Integer arg2,
        int timedInvokeTimeoutMs) {
      testAddArguments(chipClusterPtr, callback, arg1, arg2, timedInvokeTimeoutMs);
    }

    public void testStructArgumentRequest(
        BooleanResponseCallback callback, ChipStructs.UnitTestingClusterSimpleStruct arg1) {
      testStructArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testStructArgumentRequest(
        BooleanResponseCallback callback,
        ChipStructs.UnitTestingClusterSimpleStruct arg1,
        int timedInvokeTimeoutMs) {
      testStructArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testNestedStructArgumentRequest(
        BooleanResponseCallback callback, ChipStructs.UnitTestingClusterNestedStruct arg1) {
      testNestedStructArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testNestedStructArgumentRequest(
        BooleanResponseCallback callback,
        ChipStructs.UnitTestingClusterNestedStruct arg1,
        int timedInvokeTimeoutMs) {
      testNestedStructArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testListStructArgumentRequest(
        BooleanResponseCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterSimpleStruct> arg1) {
      testListStructArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testListStructArgumentRequest(
        BooleanResponseCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterSimpleStruct> arg1,
        int timedInvokeTimeoutMs) {
      testListStructArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testListInt8UArgumentRequest(
        BooleanResponseCallback callback, ArrayList<Integer> arg1) {
      testListInt8UArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testListInt8UArgumentRequest(
        BooleanResponseCallback callback, ArrayList<Integer> arg1, int timedInvokeTimeoutMs) {
      testListInt8UArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testNestedStructListArgumentRequest(
        BooleanResponseCallback callback, ChipStructs.UnitTestingClusterNestedStructList arg1) {
      testNestedStructListArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testNestedStructListArgumentRequest(
        BooleanResponseCallback callback,
        ChipStructs.UnitTestingClusterNestedStructList arg1,
        int timedInvokeTimeoutMs) {
      testNestedStructListArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testListNestedStructListArgumentRequest(
        BooleanResponseCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterNestedStructList> arg1) {
      testListNestedStructListArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testListNestedStructListArgumentRequest(
        BooleanResponseCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterNestedStructList> arg1,
        int timedInvokeTimeoutMs) {
      testListNestedStructListArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testListInt8UReverseRequest(
        TestListInt8UReverseResponseCallback callback, ArrayList<Integer> arg1) {
      testListInt8UReverseRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testListInt8UReverseRequest(
        TestListInt8UReverseResponseCallback callback,
        ArrayList<Integer> arg1,
        int timedInvokeTimeoutMs) {
      testListInt8UReverseRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testEnumsRequest(TestEnumsResponseCallback callback, Integer arg1, Integer arg2) {
      testEnumsRequest(chipClusterPtr, callback, arg1, arg2, null);
    }

    public void testEnumsRequest(
        TestEnumsResponseCallback callback, Integer arg1, Integer arg2, int timedInvokeTimeoutMs) {
      testEnumsRequest(chipClusterPtr, callback, arg1, arg2, timedInvokeTimeoutMs);
    }

    public void testNullableOptionalRequest(
        TestNullableOptionalResponseCallback callback, @Nullable Optional<Integer> arg1) {
      testNullableOptionalRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testNullableOptionalRequest(
        TestNullableOptionalResponseCallback callback,
        @Nullable Optional<Integer> arg1,
        int timedInvokeTimeoutMs) {
      testNullableOptionalRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void simpleStructEchoRequest(
        SimpleStructResponseCallback callback, ChipStructs.UnitTestingClusterSimpleStruct arg1) {
      simpleStructEchoRequest(chipClusterPtr, callback, arg1, null);
    }

    public void simpleStructEchoRequest(
        SimpleStructResponseCallback callback,
        ChipStructs.UnitTestingClusterSimpleStruct arg1,
        int timedInvokeTimeoutMs) {
      simpleStructEchoRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void timedInvokeRequest(DefaultClusterCallback callback, int timedInvokeTimeoutMs) {

      timedInvokeRequest(chipClusterPtr, callback, timedInvokeTimeoutMs);
    }

    public void testSimpleOptionalArgumentRequest(
        DefaultClusterCallback callback, Optional<Boolean> arg1) {
      testSimpleOptionalArgumentRequest(chipClusterPtr, callback, arg1, null);
    }

    public void testSimpleOptionalArgumentRequest(
        DefaultClusterCallback callback, Optional<Boolean> arg1, int timedInvokeTimeoutMs) {
      testSimpleOptionalArgumentRequest(chipClusterPtr, callback, arg1, timedInvokeTimeoutMs);
    }

    public void testEmitTestEventRequest(
        TestEmitTestEventResponseCallback callback, Integer arg1, Integer arg2, Boolean arg3) {
      testEmitTestEventRequest(chipClusterPtr, callback, arg1, arg2, arg3, null);
    }

    public void testEmitTestEventRequest(
        TestEmitTestEventResponseCallback callback,
        Integer arg1,
        Integer arg2,
        Boolean arg3,
        int timedInvokeTimeoutMs) {
      testEmitTestEventRequest(chipClusterPtr, callback, arg1, arg2, arg3, timedInvokeTimeoutMs);
    }

    private native void test(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testNotHandled(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testSpecific(
        long chipClusterPtr,
        TestSpecificResponseCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testUnknownCommand(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testAddArguments(
        long chipClusterPtr,
        TestAddArgumentsResponseCallback Callback,
        Integer arg1,
        Integer arg2,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testStructArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ChipStructs.UnitTestingClusterSimpleStruct arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testNestedStructArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ChipStructs.UnitTestingClusterNestedStruct arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testListStructArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ArrayList<ChipStructs.UnitTestingClusterSimpleStruct> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testListInt8UArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ArrayList<Integer> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testNestedStructListArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ChipStructs.UnitTestingClusterNestedStructList arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testListNestedStructListArgumentRequest(
        long chipClusterPtr,
        BooleanResponseCallback Callback,
        ArrayList<ChipStructs.UnitTestingClusterNestedStructList> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testListInt8UReverseRequest(
        long chipClusterPtr,
        TestListInt8UReverseResponseCallback Callback,
        ArrayList<Integer> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testEnumsRequest(
        long chipClusterPtr,
        TestEnumsResponseCallback Callback,
        Integer arg1,
        Integer arg2,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testNullableOptionalRequest(
        long chipClusterPtr,
        TestNullableOptionalResponseCallback Callback,
        @Nullable Optional<Integer> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void simpleStructEchoRequest(
        long chipClusterPtr,
        SimpleStructResponseCallback Callback,
        ChipStructs.UnitTestingClusterSimpleStruct arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void timedInvokeRequest(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testSimpleOptionalArgumentRequest(
        long chipClusterPtr,
        DefaultClusterCallback Callback,
        Optional<Boolean> arg1,
        @Nullable Integer timedInvokeTimeoutMs);

    private native void testEmitTestEventRequest(
        long chipClusterPtr,
        TestEmitTestEventResponseCallback Callback,
        Integer arg1,
        Integer arg2,
        Boolean arg3,
        @Nullable Integer timedInvokeTimeoutMs);

    public interface TestSpecificResponseCallback {
      void onSuccess(Integer returnValue);

      void onError(Exception error);
    }

    public interface TestAddArgumentsResponseCallback {
      void onSuccess(Integer returnValue);

      void onError(Exception error);
    }

    public interface TestListInt8UReverseResponseCallback {
      void onSuccess(ArrayList<Integer> arg1);

      void onError(Exception error);
    }

    public interface TestEnumsResponseCallback {
      void onSuccess(Integer arg1, Integer arg2);

      void onError(Exception error);
    }

    public interface TestNullableOptionalResponseCallback {
      void onSuccess(
          Boolean wasPresent,
          Optional<Boolean> wasNull,
          Optional<Integer> value,
          @Nullable Optional<Integer> originalValue);

      void onError(Exception error);
    }

    public interface BooleanResponseCallback {
      void onSuccess(Boolean value);

      void onError(Exception error);
    }

    public interface SimpleStructResponseCallback {
      void onSuccess(ChipStructs.UnitTestingClusterSimpleStruct arg1);

      void onError(Exception error);
    }

    public interface TestEmitTestEventResponseCallback {
      void onSuccess(Long value);

      void onError(Exception error);
    }

    public interface ListInt8uAttributeCallback {
      void onSuccess(List<Integer> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListOctetStringAttributeCallback {
      void onSuccess(List<byte[]> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListStructOctetStringAttributeCallback {
      void onSuccess(List<ChipStructs.UnitTestingClusterTestListStructOctet> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface VendorIdAttributeCallback {
      void onSuccess(Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListNullablesAndOptionalsStructAttributeCallback {
      void onSuccess(List<ChipStructs.UnitTestingClusterNullablesAndOptionalsStruct> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListLongOctetStringAttributeCallback {
      void onSuccess(List<byte[]> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface ListFabricScopedAttributeCallback {
      void onSuccess(List<ChipStructs.UnitTestingClusterTestFabricScoped> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBooleanAttributeCallback {
      void onSuccess(@Nullable Boolean value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBitmap8AttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBitmap16AttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBitmap32AttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableBitmap64AttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt8uAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt16uAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt24uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt32uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt40uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt48uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt56uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt64uAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt8sAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt16sAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt24sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt32sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt40sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt48sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt56sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableInt64sAttributeCallback {
      void onSuccess(@Nullable Long value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableEnum8AttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableEnum16AttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableFloatSingleAttributeCallback {
      void onSuccess(@Nullable Float value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableFloatDoubleAttributeCallback {
      void onSuccess(@Nullable Double value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableOctetStringAttributeCallback {
      void onSuccess(@Nullable byte[] value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableCharStringAttributeCallback {
      void onSuccess(@Nullable String value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableEnumAttrAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableRangeRestrictedInt8uAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableRangeRestrictedInt8sAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableRangeRestrictedInt16uAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface NullableRangeRestrictedInt16sAttributeCallback {
      void onSuccess(@Nullable Integer value);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface GeneratedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AcceptedCommandListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public interface AttributeListAttributeCallback {
      void onSuccess(List<Long> valueList);

      void onError(Exception ex);

      default void onSubscriptionEstablished() {}
    }

    public void readBooleanAttribute(BooleanAttributeCallback callback) {
      readBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeBooleanAttribute(DefaultClusterCallback callback, Boolean value) {
      writeBooleanAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBooleanAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBitmap8Attribute(IntegerAttributeCallback callback) {
      readBitmap8Attribute(chipClusterPtr, callback);
    }

    public void writeBitmap8Attribute(DefaultClusterCallback callback, Integer value) {
      writeBitmap8Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeBitmap8Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeBitmap8Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBitmap8Attribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBitmap8Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBitmap16Attribute(IntegerAttributeCallback callback) {
      readBitmap16Attribute(chipClusterPtr, callback);
    }

    public void writeBitmap16Attribute(DefaultClusterCallback callback, Integer value) {
      writeBitmap16Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeBitmap16Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeBitmap16Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBitmap16Attribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBitmap16Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBitmap32Attribute(LongAttributeCallback callback) {
      readBitmap32Attribute(chipClusterPtr, callback);
    }

    public void writeBitmap32Attribute(DefaultClusterCallback callback, Long value) {
      writeBitmap32Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeBitmap32Attribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeBitmap32Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBitmap32Attribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBitmap32Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readBitmap64Attribute(LongAttributeCallback callback) {
      readBitmap64Attribute(chipClusterPtr, callback);
    }

    public void writeBitmap64Attribute(DefaultClusterCallback callback, Long value) {
      writeBitmap64Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeBitmap64Attribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeBitmap64Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeBitmap64Attribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeBitmap64Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt8uAttribute(IntegerAttributeCallback callback) {
      readInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeInt8uAttribute(DefaultClusterCallback callback, Integer value) {
      writeInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt8uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeInt8uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt8uAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt8uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt16uAttribute(IntegerAttributeCallback callback) {
      readInt16uAttribute(chipClusterPtr, callback);
    }

    public void writeInt16uAttribute(DefaultClusterCallback callback, Integer value) {
      writeInt16uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt16uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeInt16uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt16uAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt16uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt24uAttribute(LongAttributeCallback callback) {
      readInt24uAttribute(chipClusterPtr, callback);
    }

    public void writeInt24uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt24uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt24uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt24uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt24uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt24uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt32uAttribute(LongAttributeCallback callback) {
      readInt32uAttribute(chipClusterPtr, callback);
    }

    public void writeInt32uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt32uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt32uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt32uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt32uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt32uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt40uAttribute(LongAttributeCallback callback) {
      readInt40uAttribute(chipClusterPtr, callback);
    }

    public void writeInt40uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt40uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt40uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt40uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt40uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt40uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt48uAttribute(LongAttributeCallback callback) {
      readInt48uAttribute(chipClusterPtr, callback);
    }

    public void writeInt48uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt48uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt48uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt48uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt48uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt48uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt56uAttribute(LongAttributeCallback callback) {
      readInt56uAttribute(chipClusterPtr, callback);
    }

    public void writeInt56uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt56uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt56uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt56uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt56uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt56uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt64uAttribute(LongAttributeCallback callback) {
      readInt64uAttribute(chipClusterPtr, callback);
    }

    public void writeInt64uAttribute(DefaultClusterCallback callback, Long value) {
      writeInt64uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt64uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt64uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt64uAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt64uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt8sAttribute(IntegerAttributeCallback callback) {
      readInt8sAttribute(chipClusterPtr, callback);
    }

    public void writeInt8sAttribute(DefaultClusterCallback callback, Integer value) {
      writeInt8sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt8sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeInt8sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt8sAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt8sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt16sAttribute(IntegerAttributeCallback callback) {
      readInt16sAttribute(chipClusterPtr, callback);
    }

    public void writeInt16sAttribute(DefaultClusterCallback callback, Integer value) {
      writeInt16sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt16sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeInt16sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt16sAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt16sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt24sAttribute(LongAttributeCallback callback) {
      readInt24sAttribute(chipClusterPtr, callback);
    }

    public void writeInt24sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt24sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt24sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt24sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt24sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt24sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt32sAttribute(LongAttributeCallback callback) {
      readInt32sAttribute(chipClusterPtr, callback);
    }

    public void writeInt32sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt32sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt32sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt32sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt32sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt32sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt40sAttribute(LongAttributeCallback callback) {
      readInt40sAttribute(chipClusterPtr, callback);
    }

    public void writeInt40sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt40sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt40sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt40sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt40sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt40sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt48sAttribute(LongAttributeCallback callback) {
      readInt48sAttribute(chipClusterPtr, callback);
    }

    public void writeInt48sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt48sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt48sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt48sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt48sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt48sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt56sAttribute(LongAttributeCallback callback) {
      readInt56sAttribute(chipClusterPtr, callback);
    }

    public void writeInt56sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt56sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt56sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt56sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt56sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt56sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readInt64sAttribute(LongAttributeCallback callback) {
      readInt64sAttribute(chipClusterPtr, callback);
    }

    public void writeInt64sAttribute(DefaultClusterCallback callback, Long value) {
      writeInt64sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeInt64sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeInt64sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeInt64sAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeInt64sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnum8Attribute(IntegerAttributeCallback callback) {
      readEnum8Attribute(chipClusterPtr, callback);
    }

    public void writeEnum8Attribute(DefaultClusterCallback callback, Integer value) {
      writeEnum8Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnum8Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeEnum8Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnum8Attribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnum8Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnum16Attribute(IntegerAttributeCallback callback) {
      readEnum16Attribute(chipClusterPtr, callback);
    }

    public void writeEnum16Attribute(DefaultClusterCallback callback, Integer value) {
      writeEnum16Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnum16Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeEnum16Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnum16Attribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnum16Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFloatSingleAttribute(FloatAttributeCallback callback) {
      readFloatSingleAttribute(chipClusterPtr, callback);
    }

    public void writeFloatSingleAttribute(DefaultClusterCallback callback, Float value) {
      writeFloatSingleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeFloatSingleAttribute(
        DefaultClusterCallback callback, Float value, int timedWriteTimeoutMs) {
      writeFloatSingleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeFloatSingleAttribute(
        FloatAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFloatSingleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFloatDoubleAttribute(DoubleAttributeCallback callback) {
      readFloatDoubleAttribute(chipClusterPtr, callback);
    }

    public void writeFloatDoubleAttribute(DefaultClusterCallback callback, Double value) {
      writeFloatDoubleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeFloatDoubleAttribute(
        DefaultClusterCallback callback, Double value, int timedWriteTimeoutMs) {
      writeFloatDoubleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeFloatDoubleAttribute(
        DoubleAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFloatDoubleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readOctetStringAttribute(OctetStringAttributeCallback callback) {
      readOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeOctetStringAttribute(DefaultClusterCallback callback, byte[] value) {
      writeOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeOctetStringAttribute(
        DefaultClusterCallback callback, byte[] value, int timedWriteTimeoutMs) {
      writeOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeOctetStringAttribute(
        OctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListInt8uAttribute(ListInt8uAttributeCallback callback) {
      readListInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeListInt8uAttribute(DefaultClusterCallback callback, ArrayList<Integer> value) {
      writeListInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListInt8uAttribute(
        DefaultClusterCallback callback, ArrayList<Integer> value, int timedWriteTimeoutMs) {
      writeListInt8uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListInt8uAttribute(
        ListInt8uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListInt8uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListOctetStringAttribute(ListOctetStringAttributeCallback callback) {
      readListOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeListOctetStringAttribute(
        DefaultClusterCallback callback, ArrayList<byte[]> value) {
      writeListOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListOctetStringAttribute(
        DefaultClusterCallback callback, ArrayList<byte[]> value, int timedWriteTimeoutMs) {
      writeListOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListOctetStringAttribute(
        ListOctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListStructOctetStringAttribute(
        ListStructOctetStringAttributeCallback callback) {
      readListStructOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeListStructOctetStringAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterTestListStructOctet> value) {
      writeListStructOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListStructOctetStringAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterTestListStructOctet> value,
        int timedWriteTimeoutMs) {
      writeListStructOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListStructOctetStringAttribute(
        ListStructOctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListStructOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLongOctetStringAttribute(OctetStringAttributeCallback callback) {
      readLongOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeLongOctetStringAttribute(DefaultClusterCallback callback, byte[] value) {
      writeLongOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLongOctetStringAttribute(
        DefaultClusterCallback callback, byte[] value, int timedWriteTimeoutMs) {
      writeLongOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLongOctetStringAttribute(
        OctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLongOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readCharStringAttribute(CharStringAttributeCallback callback) {
      readCharStringAttribute(chipClusterPtr, callback);
    }

    public void writeCharStringAttribute(DefaultClusterCallback callback, String value) {
      writeCharStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeCharStringAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeCharStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeCharStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeCharStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readLongCharStringAttribute(CharStringAttributeCallback callback) {
      readLongCharStringAttribute(chipClusterPtr, callback);
    }

    public void writeLongCharStringAttribute(DefaultClusterCallback callback, String value) {
      writeLongCharStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeLongCharStringAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeLongCharStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeLongCharStringAttribute(
        CharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeLongCharStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEpochUsAttribute(LongAttributeCallback callback) {
      readEpochUsAttribute(chipClusterPtr, callback);
    }

    public void writeEpochUsAttribute(DefaultClusterCallback callback, Long value) {
      writeEpochUsAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEpochUsAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeEpochUsAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEpochUsAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEpochUsAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEpochSAttribute(LongAttributeCallback callback) {
      readEpochSAttribute(chipClusterPtr, callback);
    }

    public void writeEpochSAttribute(DefaultClusterCallback callback, Long value) {
      writeEpochSAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEpochSAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeEpochSAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEpochSAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEpochSAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readVendorIdAttribute(VendorIdAttributeCallback callback) {
      readVendorIdAttribute(chipClusterPtr, callback);
    }

    public void writeVendorIdAttribute(DefaultClusterCallback callback, Integer value) {
      writeVendorIdAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeVendorIdAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeVendorIdAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeVendorIdAttribute(
        VendorIdAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeVendorIdAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListNullablesAndOptionalsStructAttribute(
        ListNullablesAndOptionalsStructAttributeCallback callback) {
      readListNullablesAndOptionalsStructAttribute(chipClusterPtr, callback);
    }

    public void writeListNullablesAndOptionalsStructAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterNullablesAndOptionalsStruct> value) {
      writeListNullablesAndOptionalsStructAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListNullablesAndOptionalsStructAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterNullablesAndOptionalsStruct> value,
        int timedWriteTimeoutMs) {
      writeListNullablesAndOptionalsStructAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListNullablesAndOptionalsStructAttribute(
        ListNullablesAndOptionalsStructAttributeCallback callback,
        int minInterval,
        int maxInterval) {
      subscribeListNullablesAndOptionalsStructAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readEnumAttrAttribute(IntegerAttributeCallback callback) {
      readEnumAttrAttribute(chipClusterPtr, callback);
    }

    public void writeEnumAttrAttribute(DefaultClusterCallback callback, Integer value) {
      writeEnumAttrAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeEnumAttrAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeEnumAttrAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeEnumAttrAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeEnumAttrAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRangeRestrictedInt8uAttribute(IntegerAttributeCallback callback) {
      readRangeRestrictedInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeRangeRestrictedInt8uAttribute(DefaultClusterCallback callback, Integer value) {
      writeRangeRestrictedInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRangeRestrictedInt8uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRangeRestrictedInt8uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRangeRestrictedInt8uAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRangeRestrictedInt8uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRangeRestrictedInt8sAttribute(IntegerAttributeCallback callback) {
      readRangeRestrictedInt8sAttribute(chipClusterPtr, callback);
    }

    public void writeRangeRestrictedInt8sAttribute(DefaultClusterCallback callback, Integer value) {
      writeRangeRestrictedInt8sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRangeRestrictedInt8sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRangeRestrictedInt8sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRangeRestrictedInt8sAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRangeRestrictedInt8sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRangeRestrictedInt16uAttribute(IntegerAttributeCallback callback) {
      readRangeRestrictedInt16uAttribute(chipClusterPtr, callback);
    }

    public void writeRangeRestrictedInt16uAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeRangeRestrictedInt16uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRangeRestrictedInt16uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRangeRestrictedInt16uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRangeRestrictedInt16uAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRangeRestrictedInt16uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readRangeRestrictedInt16sAttribute(IntegerAttributeCallback callback) {
      readRangeRestrictedInt16sAttribute(chipClusterPtr, callback);
    }

    public void writeRangeRestrictedInt16sAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeRangeRestrictedInt16sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeRangeRestrictedInt16sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeRangeRestrictedInt16sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeRangeRestrictedInt16sAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeRangeRestrictedInt16sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListLongOctetStringAttribute(ListLongOctetStringAttributeCallback callback) {
      readListLongOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeListLongOctetStringAttribute(
        DefaultClusterCallback callback, ArrayList<byte[]> value) {
      writeListLongOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListLongOctetStringAttribute(
        DefaultClusterCallback callback, ArrayList<byte[]> value, int timedWriteTimeoutMs) {
      writeListLongOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListLongOctetStringAttribute(
        ListLongOctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListLongOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readListFabricScopedAttribute(ListFabricScopedAttributeCallback callback) {
      readListFabricScopedAttribute(chipClusterPtr, callback);
    }

    public void writeListFabricScopedAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterTestFabricScoped> value) {
      writeListFabricScopedAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeListFabricScopedAttribute(
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterTestFabricScoped> value,
        int timedWriteTimeoutMs) {
      writeListFabricScopedAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeListFabricScopedAttribute(
        ListFabricScopedAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeListFabricScopedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readTimedWriteBooleanAttribute(BooleanAttributeCallback callback) {
      readTimedWriteBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeTimedWriteBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeTimedWriteBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeTimedWriteBooleanAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeTimedWriteBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneralErrorBooleanAttribute(BooleanAttributeCallback callback) {
      readGeneralErrorBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeGeneralErrorBooleanAttribute(DefaultClusterCallback callback, Boolean value) {
      writeGeneralErrorBooleanAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeGeneralErrorBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeGeneralErrorBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeGeneralErrorBooleanAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneralErrorBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterErrorBooleanAttribute(BooleanAttributeCallback callback) {
      readClusterErrorBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeClusterErrorBooleanAttribute(DefaultClusterCallback callback, Boolean value) {
      writeClusterErrorBooleanAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeClusterErrorBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeClusterErrorBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeClusterErrorBooleanAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterErrorBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readUnsupportedAttribute(BooleanAttributeCallback callback) {
      readUnsupportedAttribute(chipClusterPtr, callback);
    }

    public void writeUnsupportedAttribute(DefaultClusterCallback callback, Boolean value) {
      writeUnsupportedAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeUnsupportedAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeUnsupportedAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeUnsupportedAttribute(
        BooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeUnsupportedAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBooleanAttribute(NullableBooleanAttributeCallback callback) {
      readNullableBooleanAttribute(chipClusterPtr, callback);
    }

    public void writeNullableBooleanAttribute(DefaultClusterCallback callback, Boolean value) {
      writeNullableBooleanAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBooleanAttribute(
        DefaultClusterCallback callback, Boolean value, int timedWriteTimeoutMs) {
      writeNullableBooleanAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBooleanAttribute(
        NullableBooleanAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBooleanAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBitmap8Attribute(NullableBitmap8AttributeCallback callback) {
      readNullableBitmap8Attribute(chipClusterPtr, callback);
    }

    public void writeNullableBitmap8Attribute(DefaultClusterCallback callback, Integer value) {
      writeNullableBitmap8Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBitmap8Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableBitmap8Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBitmap8Attribute(
        NullableBitmap8AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBitmap8Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBitmap16Attribute(NullableBitmap16AttributeCallback callback) {
      readNullableBitmap16Attribute(chipClusterPtr, callback);
    }

    public void writeNullableBitmap16Attribute(DefaultClusterCallback callback, Integer value) {
      writeNullableBitmap16Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBitmap16Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableBitmap16Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBitmap16Attribute(
        NullableBitmap16AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBitmap16Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBitmap32Attribute(NullableBitmap32AttributeCallback callback) {
      readNullableBitmap32Attribute(chipClusterPtr, callback);
    }

    public void writeNullableBitmap32Attribute(DefaultClusterCallback callback, Long value) {
      writeNullableBitmap32Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBitmap32Attribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableBitmap32Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBitmap32Attribute(
        NullableBitmap32AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBitmap32Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableBitmap64Attribute(NullableBitmap64AttributeCallback callback) {
      readNullableBitmap64Attribute(chipClusterPtr, callback);
    }

    public void writeNullableBitmap64Attribute(DefaultClusterCallback callback, Long value) {
      writeNullableBitmap64Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableBitmap64Attribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableBitmap64Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableBitmap64Attribute(
        NullableBitmap64AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableBitmap64Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt8uAttribute(NullableInt8uAttributeCallback callback) {
      readNullableInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt8uAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt8uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableInt8uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt8uAttribute(
        NullableInt8uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt8uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt16uAttribute(NullableInt16uAttributeCallback callback) {
      readNullableInt16uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt16uAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableInt16uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt16uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableInt16uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt16uAttribute(
        NullableInt16uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt16uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt24uAttribute(NullableInt24uAttributeCallback callback) {
      readNullableInt24uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt24uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt24uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt24uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt24uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt24uAttribute(
        NullableInt24uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt24uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt32uAttribute(NullableInt32uAttributeCallback callback) {
      readNullableInt32uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt32uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt32uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt32uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt32uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt32uAttribute(
        NullableInt32uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt32uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt40uAttribute(NullableInt40uAttributeCallback callback) {
      readNullableInt40uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt40uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt40uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt40uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt40uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt40uAttribute(
        NullableInt40uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt40uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt48uAttribute(NullableInt48uAttributeCallback callback) {
      readNullableInt48uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt48uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt48uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt48uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt48uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt48uAttribute(
        NullableInt48uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt48uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt56uAttribute(NullableInt56uAttributeCallback callback) {
      readNullableInt56uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt56uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt56uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt56uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt56uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt56uAttribute(
        NullableInt56uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt56uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt64uAttribute(NullableInt64uAttributeCallback callback) {
      readNullableInt64uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt64uAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt64uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt64uAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt64uAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt64uAttribute(
        NullableInt64uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt64uAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt8sAttribute(NullableInt8sAttributeCallback callback) {
      readNullableInt8sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt8sAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableInt8sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt8sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableInt8sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt8sAttribute(
        NullableInt8sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt8sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt16sAttribute(NullableInt16sAttributeCallback callback) {
      readNullableInt16sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt16sAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableInt16sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt16sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableInt16sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt16sAttribute(
        NullableInt16sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt16sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt24sAttribute(NullableInt24sAttributeCallback callback) {
      readNullableInt24sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt24sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt24sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt24sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt24sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt24sAttribute(
        NullableInt24sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt24sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt32sAttribute(NullableInt32sAttributeCallback callback) {
      readNullableInt32sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt32sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt32sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt32sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt32sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt32sAttribute(
        NullableInt32sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt32sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt40sAttribute(NullableInt40sAttributeCallback callback) {
      readNullableInt40sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt40sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt40sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt40sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt40sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt40sAttribute(
        NullableInt40sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt40sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt48sAttribute(NullableInt48sAttributeCallback callback) {
      readNullableInt48sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt48sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt48sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt48sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt48sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt48sAttribute(
        NullableInt48sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt48sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt56sAttribute(NullableInt56sAttributeCallback callback) {
      readNullableInt56sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt56sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt56sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt56sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt56sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt56sAttribute(
        NullableInt56sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt56sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableInt64sAttribute(NullableInt64sAttributeCallback callback) {
      readNullableInt64sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableInt64sAttribute(DefaultClusterCallback callback, Long value) {
      writeNullableInt64sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableInt64sAttribute(
        DefaultClusterCallback callback, Long value, int timedWriteTimeoutMs) {
      writeNullableInt64sAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableInt64sAttribute(
        NullableInt64sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableInt64sAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableEnum8Attribute(NullableEnum8AttributeCallback callback) {
      readNullableEnum8Attribute(chipClusterPtr, callback);
    }

    public void writeNullableEnum8Attribute(DefaultClusterCallback callback, Integer value) {
      writeNullableEnum8Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableEnum8Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableEnum8Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableEnum8Attribute(
        NullableEnum8AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableEnum8Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableEnum16Attribute(NullableEnum16AttributeCallback callback) {
      readNullableEnum16Attribute(chipClusterPtr, callback);
    }

    public void writeNullableEnum16Attribute(DefaultClusterCallback callback, Integer value) {
      writeNullableEnum16Attribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableEnum16Attribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableEnum16Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableEnum16Attribute(
        NullableEnum16AttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableEnum16Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableFloatSingleAttribute(NullableFloatSingleAttributeCallback callback) {
      readNullableFloatSingleAttribute(chipClusterPtr, callback);
    }

    public void writeNullableFloatSingleAttribute(DefaultClusterCallback callback, Float value) {
      writeNullableFloatSingleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableFloatSingleAttribute(
        DefaultClusterCallback callback, Float value, int timedWriteTimeoutMs) {
      writeNullableFloatSingleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableFloatSingleAttribute(
        NullableFloatSingleAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableFloatSingleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableFloatDoubleAttribute(NullableFloatDoubleAttributeCallback callback) {
      readNullableFloatDoubleAttribute(chipClusterPtr, callback);
    }

    public void writeNullableFloatDoubleAttribute(DefaultClusterCallback callback, Double value) {
      writeNullableFloatDoubleAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableFloatDoubleAttribute(
        DefaultClusterCallback callback, Double value, int timedWriteTimeoutMs) {
      writeNullableFloatDoubleAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableFloatDoubleAttribute(
        NullableFloatDoubleAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableFloatDoubleAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableOctetStringAttribute(NullableOctetStringAttributeCallback callback) {
      readNullableOctetStringAttribute(chipClusterPtr, callback);
    }

    public void writeNullableOctetStringAttribute(DefaultClusterCallback callback, byte[] value) {
      writeNullableOctetStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableOctetStringAttribute(
        DefaultClusterCallback callback, byte[] value, int timedWriteTimeoutMs) {
      writeNullableOctetStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableOctetStringAttribute(
        NullableOctetStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableOctetStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableCharStringAttribute(NullableCharStringAttributeCallback callback) {
      readNullableCharStringAttribute(chipClusterPtr, callback);
    }

    public void writeNullableCharStringAttribute(DefaultClusterCallback callback, String value) {
      writeNullableCharStringAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableCharStringAttribute(
        DefaultClusterCallback callback, String value, int timedWriteTimeoutMs) {
      writeNullableCharStringAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableCharStringAttribute(
        NullableCharStringAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableCharStringAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableEnumAttrAttribute(NullableEnumAttrAttributeCallback callback) {
      readNullableEnumAttrAttribute(chipClusterPtr, callback);
    }

    public void writeNullableEnumAttrAttribute(DefaultClusterCallback callback, Integer value) {
      writeNullableEnumAttrAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableEnumAttrAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableEnumAttrAttribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableEnumAttrAttribute(
        NullableEnumAttrAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableEnumAttrAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableRangeRestrictedInt8uAttribute(
        NullableRangeRestrictedInt8uAttributeCallback callback) {
      readNullableRangeRestrictedInt8uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableRangeRestrictedInt8uAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeNullableRangeRestrictedInt8uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableRangeRestrictedInt8uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableRangeRestrictedInt8uAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableRangeRestrictedInt8uAttribute(
        NullableRangeRestrictedInt8uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableRangeRestrictedInt8uAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableRangeRestrictedInt8sAttribute(
        NullableRangeRestrictedInt8sAttributeCallback callback) {
      readNullableRangeRestrictedInt8sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableRangeRestrictedInt8sAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeNullableRangeRestrictedInt8sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableRangeRestrictedInt8sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableRangeRestrictedInt8sAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableRangeRestrictedInt8sAttribute(
        NullableRangeRestrictedInt8sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableRangeRestrictedInt8sAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableRangeRestrictedInt16uAttribute(
        NullableRangeRestrictedInt16uAttributeCallback callback) {
      readNullableRangeRestrictedInt16uAttribute(chipClusterPtr, callback);
    }

    public void writeNullableRangeRestrictedInt16uAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeNullableRangeRestrictedInt16uAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableRangeRestrictedInt16uAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableRangeRestrictedInt16uAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableRangeRestrictedInt16uAttribute(
        NullableRangeRestrictedInt16uAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableRangeRestrictedInt16uAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readNullableRangeRestrictedInt16sAttribute(
        NullableRangeRestrictedInt16sAttributeCallback callback) {
      readNullableRangeRestrictedInt16sAttribute(chipClusterPtr, callback);
    }

    public void writeNullableRangeRestrictedInt16sAttribute(
        DefaultClusterCallback callback, Integer value) {
      writeNullableRangeRestrictedInt16sAttribute(chipClusterPtr, callback, value, null);
    }

    public void writeNullableRangeRestrictedInt16sAttribute(
        DefaultClusterCallback callback, Integer value, int timedWriteTimeoutMs) {
      writeNullableRangeRestrictedInt16sAttribute(
          chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }

    public void subscribeNullableRangeRestrictedInt16sAttribute(
        NullableRangeRestrictedInt16sAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeNullableRangeRestrictedInt16sAttribute(
          chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readGeneratedCommandListAttribute(GeneratedCommandListAttributeCallback callback) {
      readGeneratedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeGeneratedCommandListAttribute(
        GeneratedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeGeneratedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAcceptedCommandListAttribute(AcceptedCommandListAttributeCallback callback) {
      readAcceptedCommandListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAcceptedCommandListAttribute(
        AcceptedCommandListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAcceptedCommandListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readAttributeListAttribute(AttributeListAttributeCallback callback) {
      readAttributeListAttribute(chipClusterPtr, callback);
    }

    public void subscribeAttributeListAttribute(
        AttributeListAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeAttributeListAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readFeatureMapAttribute(LongAttributeCallback callback) {
      readFeatureMapAttribute(chipClusterPtr, callback);
    }

    public void subscribeFeatureMapAttribute(
        LongAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeFeatureMapAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    public void readClusterRevisionAttribute(IntegerAttributeCallback callback) {
      readClusterRevisionAttribute(chipClusterPtr, callback);
    }

    public void subscribeClusterRevisionAttribute(
        IntegerAttributeCallback callback, int minInterval, int maxInterval) {
      subscribeClusterRevisionAttribute(chipClusterPtr, callback, minInterval, maxInterval);
    }

    private native void readBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBitmap8Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeBitmap8Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBitmap8Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBitmap16Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeBitmap16Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBitmap16Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBitmap32Attribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeBitmap32Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBitmap32Attribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readBitmap64Attribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeBitmap64Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeBitmap64Attribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt8uAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt8uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt16uAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeInt16uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt16uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt24uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt24uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt24uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt32uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt32uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt32uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt40uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt40uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt40uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt48uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt48uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt48uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt56uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt56uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt56uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt64uAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt64uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt64uAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt8sAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeInt8sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt8sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt16sAttribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeInt16sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt16sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt24sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt24sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt24sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt32sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt32sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt32sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt40sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt40sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt40sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt48sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt48sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt48sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt56sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt56sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt56sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readInt64sAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeInt64sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeInt64sAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnum8Attribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeEnum8Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnum8Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEnum16Attribute(long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeEnum16Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnum16Attribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFloatSingleAttribute(
        long chipClusterPtr, FloatAttributeCallback callback);

    private native void writeFloatSingleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Float value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeFloatSingleAttribute(
        long chipClusterPtr, FloatAttributeCallback callback, int minInterval, int maxInterval);

    private native void readFloatDoubleAttribute(
        long chipClusterPtr, DoubleAttributeCallback callback);

    private native void writeFloatDoubleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Double value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeFloatDoubleAttribute(
        long chipClusterPtr, DoubleAttributeCallback callback, int minInterval, int maxInterval);

    private native void readOctetStringAttribute(
        long chipClusterPtr, OctetStringAttributeCallback callback);

    private native void writeOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        byte[] value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeOctetStringAttribute(
        long chipClusterPtr,
        OctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readListInt8uAttribute(
        long chipClusterPtr, ListInt8uAttributeCallback callback);

    private native void writeListInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<Integer> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListInt8uAttribute(
        long chipClusterPtr, ListInt8uAttributeCallback callback, int minInterval, int maxInterval);

    private native void readListOctetStringAttribute(
        long chipClusterPtr, ListOctetStringAttributeCallback callback);

    private native void writeListOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<byte[]> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListOctetStringAttribute(
        long chipClusterPtr,
        ListOctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readListStructOctetStringAttribute(
        long chipClusterPtr, ListStructOctetStringAttributeCallback callback);

    private native void writeListStructOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterTestListStructOctet> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListStructOctetStringAttribute(
        long chipClusterPtr,
        ListStructOctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLongOctetStringAttribute(
        long chipClusterPtr, OctetStringAttributeCallback callback);

    private native void writeLongOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        byte[] value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLongOctetStringAttribute(
        long chipClusterPtr,
        OctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readCharStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeCharStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeCharStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readLongCharStringAttribute(
        long chipClusterPtr, CharStringAttributeCallback callback);

    private native void writeLongCharStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeLongCharStringAttribute(
        long chipClusterPtr,
        CharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEpochUsAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeEpochUsAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEpochUsAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readEpochSAttribute(long chipClusterPtr, LongAttributeCallback callback);

    private native void writeEpochSAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEpochSAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readVendorIdAttribute(
        long chipClusterPtr, VendorIdAttributeCallback callback);

    private native void writeVendorIdAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeVendorIdAttribute(
        long chipClusterPtr, VendorIdAttributeCallback callback, int minInterval, int maxInterval);

    private native void readListNullablesAndOptionalsStructAttribute(
        long chipClusterPtr, ListNullablesAndOptionalsStructAttributeCallback callback);

    private native void writeListNullablesAndOptionalsStructAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterNullablesAndOptionalsStruct> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListNullablesAndOptionalsStructAttribute(
        long chipClusterPtr,
        ListNullablesAndOptionalsStructAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readEnumAttrAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeEnumAttrAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeEnumAttrAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRangeRestrictedInt8uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRangeRestrictedInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRangeRestrictedInt8uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRangeRestrictedInt8sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRangeRestrictedInt8sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRangeRestrictedInt8sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRangeRestrictedInt16uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRangeRestrictedInt16uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRangeRestrictedInt16uAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readRangeRestrictedInt16sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void writeRangeRestrictedInt16sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeRangeRestrictedInt16sAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);

    private native void readListLongOctetStringAttribute(
        long chipClusterPtr, ListLongOctetStringAttributeCallback callback);

    private native void writeListLongOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<byte[]> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListLongOctetStringAttribute(
        long chipClusterPtr,
        ListLongOctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readListFabricScopedAttribute(
        long chipClusterPtr, ListFabricScopedAttributeCallback callback);

    private native void writeListFabricScopedAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        ArrayList<ChipStructs.UnitTestingClusterTestFabricScoped> value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeListFabricScopedAttribute(
        long chipClusterPtr,
        ListFabricScopedAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readTimedWriteBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeTimedWriteBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeTimedWriteBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readGeneralErrorBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeGeneralErrorBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeGeneralErrorBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterErrorBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeClusterErrorBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeClusterErrorBooleanAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readUnsupportedAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback);

    private native void writeUnsupportedAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeUnsupportedAttribute(
        long chipClusterPtr, BooleanAttributeCallback callback, int minInterval, int maxInterval);

    private native void readNullableBooleanAttribute(
        long chipClusterPtr, NullableBooleanAttributeCallback callback);

    private native void writeNullableBooleanAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Boolean value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBooleanAttribute(
        long chipClusterPtr,
        NullableBooleanAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableBitmap8Attribute(
        long chipClusterPtr, NullableBitmap8AttributeCallback callback);

    private native void writeNullableBitmap8Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBitmap8Attribute(
        long chipClusterPtr,
        NullableBitmap8AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableBitmap16Attribute(
        long chipClusterPtr, NullableBitmap16AttributeCallback callback);

    private native void writeNullableBitmap16Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBitmap16Attribute(
        long chipClusterPtr,
        NullableBitmap16AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableBitmap32Attribute(
        long chipClusterPtr, NullableBitmap32AttributeCallback callback);

    private native void writeNullableBitmap32Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBitmap32Attribute(
        long chipClusterPtr,
        NullableBitmap32AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableBitmap64Attribute(
        long chipClusterPtr, NullableBitmap64AttributeCallback callback);

    private native void writeNullableBitmap64Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableBitmap64Attribute(
        long chipClusterPtr,
        NullableBitmap64AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt8uAttribute(
        long chipClusterPtr, NullableInt8uAttributeCallback callback);

    private native void writeNullableInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt8uAttribute(
        long chipClusterPtr,
        NullableInt8uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt16uAttribute(
        long chipClusterPtr, NullableInt16uAttributeCallback callback);

    private native void writeNullableInt16uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt16uAttribute(
        long chipClusterPtr,
        NullableInt16uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt24uAttribute(
        long chipClusterPtr, NullableInt24uAttributeCallback callback);

    private native void writeNullableInt24uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt24uAttribute(
        long chipClusterPtr,
        NullableInt24uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt32uAttribute(
        long chipClusterPtr, NullableInt32uAttributeCallback callback);

    private native void writeNullableInt32uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt32uAttribute(
        long chipClusterPtr,
        NullableInt32uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt40uAttribute(
        long chipClusterPtr, NullableInt40uAttributeCallback callback);

    private native void writeNullableInt40uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt40uAttribute(
        long chipClusterPtr,
        NullableInt40uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt48uAttribute(
        long chipClusterPtr, NullableInt48uAttributeCallback callback);

    private native void writeNullableInt48uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt48uAttribute(
        long chipClusterPtr,
        NullableInt48uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt56uAttribute(
        long chipClusterPtr, NullableInt56uAttributeCallback callback);

    private native void writeNullableInt56uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt56uAttribute(
        long chipClusterPtr,
        NullableInt56uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt64uAttribute(
        long chipClusterPtr, NullableInt64uAttributeCallback callback);

    private native void writeNullableInt64uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt64uAttribute(
        long chipClusterPtr,
        NullableInt64uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt8sAttribute(
        long chipClusterPtr, NullableInt8sAttributeCallback callback);

    private native void writeNullableInt8sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt8sAttribute(
        long chipClusterPtr,
        NullableInt8sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt16sAttribute(
        long chipClusterPtr, NullableInt16sAttributeCallback callback);

    private native void writeNullableInt16sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt16sAttribute(
        long chipClusterPtr,
        NullableInt16sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt24sAttribute(
        long chipClusterPtr, NullableInt24sAttributeCallback callback);

    private native void writeNullableInt24sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt24sAttribute(
        long chipClusterPtr,
        NullableInt24sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt32sAttribute(
        long chipClusterPtr, NullableInt32sAttributeCallback callback);

    private native void writeNullableInt32sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt32sAttribute(
        long chipClusterPtr,
        NullableInt32sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt40sAttribute(
        long chipClusterPtr, NullableInt40sAttributeCallback callback);

    private native void writeNullableInt40sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt40sAttribute(
        long chipClusterPtr,
        NullableInt40sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt48sAttribute(
        long chipClusterPtr, NullableInt48sAttributeCallback callback);

    private native void writeNullableInt48sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt48sAttribute(
        long chipClusterPtr,
        NullableInt48sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt56sAttribute(
        long chipClusterPtr, NullableInt56sAttributeCallback callback);

    private native void writeNullableInt56sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt56sAttribute(
        long chipClusterPtr,
        NullableInt56sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableInt64sAttribute(
        long chipClusterPtr, NullableInt64sAttributeCallback callback);

    private native void writeNullableInt64sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Long value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableInt64sAttribute(
        long chipClusterPtr,
        NullableInt64sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableEnum8Attribute(
        long chipClusterPtr, NullableEnum8AttributeCallback callback);

    private native void writeNullableEnum8Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableEnum8Attribute(
        long chipClusterPtr,
        NullableEnum8AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableEnum16Attribute(
        long chipClusterPtr, NullableEnum16AttributeCallback callback);

    private native void writeNullableEnum16Attribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableEnum16Attribute(
        long chipClusterPtr,
        NullableEnum16AttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableFloatSingleAttribute(
        long chipClusterPtr, NullableFloatSingleAttributeCallback callback);

    private native void writeNullableFloatSingleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Float value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableFloatSingleAttribute(
        long chipClusterPtr,
        NullableFloatSingleAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableFloatDoubleAttribute(
        long chipClusterPtr, NullableFloatDoubleAttributeCallback callback);

    private native void writeNullableFloatDoubleAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Double value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableFloatDoubleAttribute(
        long chipClusterPtr,
        NullableFloatDoubleAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableOctetStringAttribute(
        long chipClusterPtr, NullableOctetStringAttributeCallback callback);

    private native void writeNullableOctetStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        byte[] value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableOctetStringAttribute(
        long chipClusterPtr,
        NullableOctetStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableCharStringAttribute(
        long chipClusterPtr, NullableCharStringAttributeCallback callback);

    private native void writeNullableCharStringAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        String value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableCharStringAttribute(
        long chipClusterPtr,
        NullableCharStringAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableEnumAttrAttribute(
        long chipClusterPtr, NullableEnumAttrAttributeCallback callback);

    private native void writeNullableEnumAttrAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableEnumAttrAttribute(
        long chipClusterPtr,
        NullableEnumAttrAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableRangeRestrictedInt8uAttribute(
        long chipClusterPtr, NullableRangeRestrictedInt8uAttributeCallback callback);

    private native void writeNullableRangeRestrictedInt8uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableRangeRestrictedInt8uAttribute(
        long chipClusterPtr,
        NullableRangeRestrictedInt8uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableRangeRestrictedInt8sAttribute(
        long chipClusterPtr, NullableRangeRestrictedInt8sAttributeCallback callback);

    private native void writeNullableRangeRestrictedInt8sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableRangeRestrictedInt8sAttribute(
        long chipClusterPtr,
        NullableRangeRestrictedInt8sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableRangeRestrictedInt16uAttribute(
        long chipClusterPtr, NullableRangeRestrictedInt16uAttributeCallback callback);

    private native void writeNullableRangeRestrictedInt16uAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableRangeRestrictedInt16uAttribute(
        long chipClusterPtr,
        NullableRangeRestrictedInt16uAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readNullableRangeRestrictedInt16sAttribute(
        long chipClusterPtr, NullableRangeRestrictedInt16sAttributeCallback callback);

    private native void writeNullableRangeRestrictedInt16sAttribute(
        long chipClusterPtr,
        DefaultClusterCallback callback,
        Integer value,
        @Nullable Integer timedWriteTimeoutMs);

    private native void subscribeNullableRangeRestrictedInt16sAttribute(
        long chipClusterPtr,
        NullableRangeRestrictedInt16sAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readGeneratedCommandListAttribute(
        long chipClusterPtr, GeneratedCommandListAttributeCallback callback);

    private native void subscribeGeneratedCommandListAttribute(
        long chipClusterPtr,
        GeneratedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAcceptedCommandListAttribute(
        long chipClusterPtr, AcceptedCommandListAttributeCallback callback);

    private native void subscribeAcceptedCommandListAttribute(
        long chipClusterPtr,
        AcceptedCommandListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readAttributeListAttribute(
        long chipClusterPtr, AttributeListAttributeCallback callback);

    private native void subscribeAttributeListAttribute(
        long chipClusterPtr,
        AttributeListAttributeCallback callback,
        int minInterval,
        int maxInterval);

    private native void readFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback);

    private native void subscribeFeatureMapAttribute(
        long chipClusterPtr, LongAttributeCallback callback, int minInterval, int maxInterval);

    private native void readClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback);

    private native void subscribeClusterRevisionAttribute(
        long chipClusterPtr, IntegerAttributeCallback callback, int minInterval, int maxInterval);
  }
}
