/*
 *
 *    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.Arrays;
import java.util.Optional;
import javax.annotation.Nullable;

public class ChipStructs {
  public static class ScenesClusterAttributeValuePair {
    public Optional<Long> attributeId;
    public ArrayList<Object> attributeValue;

    public ScenesClusterAttributeValuePair(
        Optional<Long> attributeId, ArrayList<Object> attributeValue) {
      this.attributeId = attributeId;
      this.attributeValue = attributeValue;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ScenesClusterAttributeValuePair {\n");
      output.append("\tattributeId: ");
      output.append(attributeId);
      output.append("\n");
      output.append("\tattributeValue: ");
      output.append(attributeValue);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ScenesClusterExtensionFieldSet {
    public Long clusterId;
    public ArrayList<ChipStructs.ScenesClusterAttributeValuePair> attributeValueList;

    public ScenesClusterExtensionFieldSet(
        Long clusterId, ArrayList<ChipStructs.ScenesClusterAttributeValuePair> attributeValueList) {
      this.clusterId = clusterId;
      this.attributeValueList = attributeValueList;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ScenesClusterExtensionFieldSet {\n");
      output.append("\tclusterId: ");
      output.append(clusterId);
      output.append("\n");
      output.append("\tattributeValueList: ");
      output.append(attributeValueList);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class DescriptorClusterDeviceTypeStruct {
    public Long type;
    public Integer revision;

    public DescriptorClusterDeviceTypeStruct(Long type, Integer revision) {
      this.type = type;
      this.revision = revision;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("DescriptorClusterDeviceTypeStruct {\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("\trevision: ");
      output.append(revision);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class BindingClusterTargetStruct {
    public Optional<Long> node;
    public Optional<Integer> group;
    public Optional<Integer> endpoint;
    public Optional<Long> cluster;
    public Integer fabricIndex;

    public BindingClusterTargetStruct(
        Optional<Long> node,
        Optional<Integer> group,
        Optional<Integer> endpoint,
        Optional<Long> cluster,
        Integer fabricIndex) {
      this.node = node;
      this.group = group;
      this.endpoint = endpoint;
      this.cluster = cluster;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("BindingClusterTargetStruct {\n");
      output.append("\tnode: ");
      output.append(node);
      output.append("\n");
      output.append("\tgroup: ");
      output.append(group);
      output.append("\n");
      output.append("\tendpoint: ");
      output.append(endpoint);
      output.append("\n");
      output.append("\tcluster: ");
      output.append(cluster);
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class AccessControlClusterTarget {
    public @Nullable Long cluster;
    public @Nullable Integer endpoint;
    public @Nullable Long deviceType;

    public AccessControlClusterTarget(
        @Nullable Long cluster, @Nullable Integer endpoint, @Nullable Long deviceType) {
      this.cluster = cluster;
      this.endpoint = endpoint;
      this.deviceType = deviceType;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("AccessControlClusterTarget {\n");
      output.append("\tcluster: ");
      output.append(cluster);
      output.append("\n");
      output.append("\tendpoint: ");
      output.append(endpoint);
      output.append("\n");
      output.append("\tdeviceType: ");
      output.append(deviceType);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class AccessControlClusterAccessControlEntry {
    public Integer privilege;
    public Integer authMode;
    public @Nullable ArrayList<Object> subjects;
    public @Nullable ArrayList<ChipStructs.AccessControlClusterTarget> targets;
    public Integer fabricIndex;

    public AccessControlClusterAccessControlEntry(
        Integer privilege,
        Integer authMode,
        @Nullable ArrayList<Object> subjects,
        @Nullable ArrayList<ChipStructs.AccessControlClusterTarget> targets,
        Integer fabricIndex) {
      this.privilege = privilege;
      this.authMode = authMode;
      this.subjects = subjects;
      this.targets = targets;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("AccessControlClusterAccessControlEntry {\n");
      output.append("\tprivilege: ");
      output.append(privilege);
      output.append("\n");
      output.append("\tauthMode: ");
      output.append(authMode);
      output.append("\n");
      output.append("\tsubjects: ");
      output.append(subjects);
      output.append("\n");
      output.append("\ttargets: ");
      output.append(targets);
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class AccessControlClusterExtensionEntry {
    public byte[] data;
    public Integer fabricIndex;

    public AccessControlClusterExtensionEntry(byte[] data, Integer fabricIndex) {
      this.data = data;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("AccessControlClusterExtensionEntry {\n");
      output.append("\tdata: ");
      output.append(Arrays.toString(data));
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ActionsClusterActionStruct {
    public Integer actionID;
    public String name;
    public Integer type;
    public Integer endpointListID;
    public Integer supportedCommands;
    public Integer state;

    public ActionsClusterActionStruct(
        Integer actionID,
        String name,
        Integer type,
        Integer endpointListID,
        Integer supportedCommands,
        Integer state) {
      this.actionID = actionID;
      this.name = name;
      this.type = type;
      this.endpointListID = endpointListID;
      this.supportedCommands = supportedCommands;
      this.state = state;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ActionsClusterActionStruct {\n");
      output.append("\tactionID: ");
      output.append(actionID);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("\tendpointListID: ");
      output.append(endpointListID);
      output.append("\n");
      output.append("\tsupportedCommands: ");
      output.append(supportedCommands);
      output.append("\n");
      output.append("\tstate: ");
      output.append(state);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ActionsClusterEndpointListStruct {
    public Integer endpointListID;
    public String name;
    public Integer type;
    public ArrayList<Object> endpoints;

    public ActionsClusterEndpointListStruct(
        Integer endpointListID, String name, Integer type, ArrayList<Object> endpoints) {
      this.endpointListID = endpointListID;
      this.name = name;
      this.type = type;
      this.endpoints = endpoints;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ActionsClusterEndpointListStruct {\n");
      output.append("\tendpointListID: ");
      output.append(endpointListID);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("\tendpoints: ");
      output.append(endpoints);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class BasicClusterCapabilityMinimaStruct {
    public Integer caseSessionsPerFabric;
    public Integer subscriptionsPerFabric;

    public BasicClusterCapabilityMinimaStruct(
        Integer caseSessionsPerFabric, Integer subscriptionsPerFabric) {
      this.caseSessionsPerFabric = caseSessionsPerFabric;
      this.subscriptionsPerFabric = subscriptionsPerFabric;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("BasicClusterCapabilityMinimaStruct {\n");
      output.append("\tcaseSessionsPerFabric: ");
      output.append(caseSessionsPerFabric);
      output.append("\n");
      output.append("\tsubscriptionsPerFabric: ");
      output.append(subscriptionsPerFabric);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class OtaSoftwareUpdateRequestorClusterProviderLocation {
    public Long providerNodeID;
    public Integer endpoint;
    public Integer fabricIndex;

    public OtaSoftwareUpdateRequestorClusterProviderLocation(
        Long providerNodeID, Integer endpoint, Integer fabricIndex) {
      this.providerNodeID = providerNodeID;
      this.endpoint = endpoint;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("OtaSoftwareUpdateRequestorClusterProviderLocation {\n");
      output.append("\tproviderNodeID: ");
      output.append(providerNodeID);
      output.append("\n");
      output.append("\tendpoint: ");
      output.append(endpoint);
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class PowerSourceClusterBatChargeFaultChangeType {
    public ArrayList<Object> current;
    public ArrayList<Object> previous;

    public PowerSourceClusterBatChargeFaultChangeType(
        ArrayList<Object> current, ArrayList<Object> previous) {
      this.current = current;
      this.previous = previous;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("PowerSourceClusterBatChargeFaultChangeType {\n");
      output.append("\tcurrent: ");
      output.append(current);
      output.append("\n");
      output.append("\tprevious: ");
      output.append(previous);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class PowerSourceClusterBatFaultChangeType {
    public ArrayList<Object> current;
    public ArrayList<Object> previous;

    public PowerSourceClusterBatFaultChangeType(
        ArrayList<Object> current, ArrayList<Object> previous) {
      this.current = current;
      this.previous = previous;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("PowerSourceClusterBatFaultChangeType {\n");
      output.append("\tcurrent: ");
      output.append(current);
      output.append("\n");
      output.append("\tprevious: ");
      output.append(previous);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class PowerSourceClusterWiredFaultChangeType {
    public ArrayList<Object> current;
    public ArrayList<Object> previous;

    public PowerSourceClusterWiredFaultChangeType(
        ArrayList<Object> current, ArrayList<Object> previous) {
      this.current = current;
      this.previous = previous;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("PowerSourceClusterWiredFaultChangeType {\n");
      output.append("\tcurrent: ");
      output.append(current);
      output.append("\n");
      output.append("\tprevious: ");
      output.append(previous);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GeneralCommissioningClusterBasicCommissioningInfo {
    public Integer failSafeExpiryLengthSeconds;
    public Integer maxCumulativeFailsafeSeconds;

    public GeneralCommissioningClusterBasicCommissioningInfo(
        Integer failSafeExpiryLengthSeconds, Integer maxCumulativeFailsafeSeconds) {
      this.failSafeExpiryLengthSeconds = failSafeExpiryLengthSeconds;
      this.maxCumulativeFailsafeSeconds = maxCumulativeFailsafeSeconds;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GeneralCommissioningClusterBasicCommissioningInfo {\n");
      output.append("\tfailSafeExpiryLengthSeconds: ");
      output.append(failSafeExpiryLengthSeconds);
      output.append("\n");
      output.append("\tmaxCumulativeFailsafeSeconds: ");
      output.append(maxCumulativeFailsafeSeconds);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class NetworkCommissioningClusterNetworkInfo {
    public byte[] networkID;
    public Boolean connected;

    public NetworkCommissioningClusterNetworkInfo(byte[] networkID, Boolean connected) {
      this.networkID = networkID;
      this.connected = connected;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("NetworkCommissioningClusterNetworkInfo {\n");
      output.append("\tnetworkID: ");
      output.append(Arrays.toString(networkID));
      output.append("\n");
      output.append("\tconnected: ");
      output.append(connected);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class NetworkCommissioningClusterThreadInterfaceScanResult {
    public Integer panId;
    public Long extendedPanId;
    public String networkName;
    public Integer channel;
    public Integer version;
    public byte[] extendedAddress;
    public Integer rssi;
    public Integer lqi;

    public NetworkCommissioningClusterThreadInterfaceScanResult(
        Integer panId,
        Long extendedPanId,
        String networkName,
        Integer channel,
        Integer version,
        byte[] extendedAddress,
        Integer rssi,
        Integer lqi) {
      this.panId = panId;
      this.extendedPanId = extendedPanId;
      this.networkName = networkName;
      this.channel = channel;
      this.version = version;
      this.extendedAddress = extendedAddress;
      this.rssi = rssi;
      this.lqi = lqi;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("NetworkCommissioningClusterThreadInterfaceScanResult {\n");
      output.append("\tpanId: ");
      output.append(panId);
      output.append("\n");
      output.append("\textendedPanId: ");
      output.append(extendedPanId);
      output.append("\n");
      output.append("\tnetworkName: ");
      output.append(networkName);
      output.append("\n");
      output.append("\tchannel: ");
      output.append(channel);
      output.append("\n");
      output.append("\tversion: ");
      output.append(version);
      output.append("\n");
      output.append("\textendedAddress: ");
      output.append(Arrays.toString(extendedAddress));
      output.append("\n");
      output.append("\trssi: ");
      output.append(rssi);
      output.append("\n");
      output.append("\tlqi: ");
      output.append(lqi);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class NetworkCommissioningClusterWiFiInterfaceScanResult {
    public Integer security;
    public byte[] ssid;
    public byte[] bssid;
    public Integer channel;
    public Integer wiFiBand;
    public Integer rssi;

    public NetworkCommissioningClusterWiFiInterfaceScanResult(
        Integer security,
        byte[] ssid,
        byte[] bssid,
        Integer channel,
        Integer wiFiBand,
        Integer rssi) {
      this.security = security;
      this.ssid = ssid;
      this.bssid = bssid;
      this.channel = channel;
      this.wiFiBand = wiFiBand;
      this.rssi = rssi;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("NetworkCommissioningClusterWiFiInterfaceScanResult {\n");
      output.append("\tsecurity: ");
      output.append(security);
      output.append("\n");
      output.append("\tssid: ");
      output.append(Arrays.toString(ssid));
      output.append("\n");
      output.append("\tbssid: ");
      output.append(Arrays.toString(bssid));
      output.append("\n");
      output.append("\tchannel: ");
      output.append(channel);
      output.append("\n");
      output.append("\twiFiBand: ");
      output.append(wiFiBand);
      output.append("\n");
      output.append("\trssi: ");
      output.append(rssi);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GeneralDiagnosticsClusterNetworkInterfaceType {
    public String name;
    public Boolean isOperational;
    public @Nullable Boolean offPremiseServicesReachableIPv4;
    public @Nullable Boolean offPremiseServicesReachableIPv6;
    public byte[] hardwareAddress;
    public ArrayList<byte[]> IPv4Addresses;
    public ArrayList<byte[]> IPv6Addresses;
    public Integer type;

    public GeneralDiagnosticsClusterNetworkInterfaceType(
        String name,
        Boolean isOperational,
        @Nullable Boolean offPremiseServicesReachableIPv4,
        @Nullable Boolean offPremiseServicesReachableIPv6,
        byte[] hardwareAddress,
        ArrayList<byte[]> IPv4Addresses,
        ArrayList<byte[]> IPv6Addresses,
        Integer type) {
      this.name = name;
      this.isOperational = isOperational;
      this.offPremiseServicesReachableIPv4 = offPremiseServicesReachableIPv4;
      this.offPremiseServicesReachableIPv6 = offPremiseServicesReachableIPv6;
      this.hardwareAddress = hardwareAddress;
      this.IPv4Addresses = IPv4Addresses;
      this.IPv6Addresses = IPv6Addresses;
      this.type = type;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GeneralDiagnosticsClusterNetworkInterfaceType {\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tisOperational: ");
      output.append(isOperational);
      output.append("\n");
      output.append("\toffPremiseServicesReachableIPv4: ");
      output.append(offPremiseServicesReachableIPv4);
      output.append("\n");
      output.append("\toffPremiseServicesReachableIPv6: ");
      output.append(offPremiseServicesReachableIPv6);
      output.append("\n");
      output.append("\thardwareAddress: ");
      output.append(Arrays.toString(hardwareAddress));
      output.append("\n");
      output.append("\tIPv4Addresses: ");
      output.append(IPv4Addresses);
      output.append("\n");
      output.append("\tIPv6Addresses: ");
      output.append(IPv6Addresses);
      output.append("\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class SoftwareDiagnosticsClusterThreadMetrics {
    public Long id;
    public Optional<String> name;
    public Optional<Long> stackFreeCurrent;
    public Optional<Long> stackFreeMinimum;
    public Optional<Long> stackSize;

    public SoftwareDiagnosticsClusterThreadMetrics(
        Long id,
        Optional<String> name,
        Optional<Long> stackFreeCurrent,
        Optional<Long> stackFreeMinimum,
        Optional<Long> stackSize) {
      this.id = id;
      this.name = name;
      this.stackFreeCurrent = stackFreeCurrent;
      this.stackFreeMinimum = stackFreeMinimum;
      this.stackSize = stackSize;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("SoftwareDiagnosticsClusterThreadMetrics {\n");
      output.append("\tid: ");
      output.append(id);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tstackFreeCurrent: ");
      output.append(stackFreeCurrent);
      output.append("\n");
      output.append("\tstackFreeMinimum: ");
      output.append(stackFreeMinimum);
      output.append("\n");
      output.append("\tstackSize: ");
      output.append(stackSize);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ThreadNetworkDiagnosticsClusterNeighborTable {
    public Long extAddress;
    public Long age;
    public Integer rloc16;
    public Long linkFrameCounter;
    public Long mleFrameCounter;
    public Integer lqi;
    public @Nullable Integer averageRssi;
    public @Nullable Integer lastRssi;
    public Integer frameErrorRate;
    public Integer messageErrorRate;
    public Boolean rxOnWhenIdle;
    public Boolean fullThreadDevice;
    public Boolean fullNetworkData;
    public Boolean isChild;

    public ThreadNetworkDiagnosticsClusterNeighborTable(
        Long extAddress,
        Long age,
        Integer rloc16,
        Long linkFrameCounter,
        Long mleFrameCounter,
        Integer lqi,
        @Nullable Integer averageRssi,
        @Nullable Integer lastRssi,
        Integer frameErrorRate,
        Integer messageErrorRate,
        Boolean rxOnWhenIdle,
        Boolean fullThreadDevice,
        Boolean fullNetworkData,
        Boolean isChild) {
      this.extAddress = extAddress;
      this.age = age;
      this.rloc16 = rloc16;
      this.linkFrameCounter = linkFrameCounter;
      this.mleFrameCounter = mleFrameCounter;
      this.lqi = lqi;
      this.averageRssi = averageRssi;
      this.lastRssi = lastRssi;
      this.frameErrorRate = frameErrorRate;
      this.messageErrorRate = messageErrorRate;
      this.rxOnWhenIdle = rxOnWhenIdle;
      this.fullThreadDevice = fullThreadDevice;
      this.fullNetworkData = fullNetworkData;
      this.isChild = isChild;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ThreadNetworkDiagnosticsClusterNeighborTable {\n");
      output.append("\textAddress: ");
      output.append(extAddress);
      output.append("\n");
      output.append("\tage: ");
      output.append(age);
      output.append("\n");
      output.append("\trloc16: ");
      output.append(rloc16);
      output.append("\n");
      output.append("\tlinkFrameCounter: ");
      output.append(linkFrameCounter);
      output.append("\n");
      output.append("\tmleFrameCounter: ");
      output.append(mleFrameCounter);
      output.append("\n");
      output.append("\tlqi: ");
      output.append(lqi);
      output.append("\n");
      output.append("\taverageRssi: ");
      output.append(averageRssi);
      output.append("\n");
      output.append("\tlastRssi: ");
      output.append(lastRssi);
      output.append("\n");
      output.append("\tframeErrorRate: ");
      output.append(frameErrorRate);
      output.append("\n");
      output.append("\tmessageErrorRate: ");
      output.append(messageErrorRate);
      output.append("\n");
      output.append("\trxOnWhenIdle: ");
      output.append(rxOnWhenIdle);
      output.append("\n");
      output.append("\tfullThreadDevice: ");
      output.append(fullThreadDevice);
      output.append("\n");
      output.append("\tfullNetworkData: ");
      output.append(fullNetworkData);
      output.append("\n");
      output.append("\tisChild: ");
      output.append(isChild);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ThreadNetworkDiagnosticsClusterOperationalDatasetComponents {
    public Boolean activeTimestampPresent;
    public Boolean pendingTimestampPresent;
    public Boolean masterKeyPresent;
    public Boolean networkNamePresent;
    public Boolean extendedPanIdPresent;
    public Boolean meshLocalPrefixPresent;
    public Boolean delayPresent;
    public Boolean panIdPresent;
    public Boolean channelPresent;
    public Boolean pskcPresent;
    public Boolean securityPolicyPresent;
    public Boolean channelMaskPresent;

    public ThreadNetworkDiagnosticsClusterOperationalDatasetComponents(
        Boolean activeTimestampPresent,
        Boolean pendingTimestampPresent,
        Boolean masterKeyPresent,
        Boolean networkNamePresent,
        Boolean extendedPanIdPresent,
        Boolean meshLocalPrefixPresent,
        Boolean delayPresent,
        Boolean panIdPresent,
        Boolean channelPresent,
        Boolean pskcPresent,
        Boolean securityPolicyPresent,
        Boolean channelMaskPresent) {
      this.activeTimestampPresent = activeTimestampPresent;
      this.pendingTimestampPresent = pendingTimestampPresent;
      this.masterKeyPresent = masterKeyPresent;
      this.networkNamePresent = networkNamePresent;
      this.extendedPanIdPresent = extendedPanIdPresent;
      this.meshLocalPrefixPresent = meshLocalPrefixPresent;
      this.delayPresent = delayPresent;
      this.panIdPresent = panIdPresent;
      this.channelPresent = channelPresent;
      this.pskcPresent = pskcPresent;
      this.securityPolicyPresent = securityPolicyPresent;
      this.channelMaskPresent = channelMaskPresent;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ThreadNetworkDiagnosticsClusterOperationalDatasetComponents {\n");
      output.append("\tactiveTimestampPresent: ");
      output.append(activeTimestampPresent);
      output.append("\n");
      output.append("\tpendingTimestampPresent: ");
      output.append(pendingTimestampPresent);
      output.append("\n");
      output.append("\tmasterKeyPresent: ");
      output.append(masterKeyPresent);
      output.append("\n");
      output.append("\tnetworkNamePresent: ");
      output.append(networkNamePresent);
      output.append("\n");
      output.append("\textendedPanIdPresent: ");
      output.append(extendedPanIdPresent);
      output.append("\n");
      output.append("\tmeshLocalPrefixPresent: ");
      output.append(meshLocalPrefixPresent);
      output.append("\n");
      output.append("\tdelayPresent: ");
      output.append(delayPresent);
      output.append("\n");
      output.append("\tpanIdPresent: ");
      output.append(panIdPresent);
      output.append("\n");
      output.append("\tchannelPresent: ");
      output.append(channelPresent);
      output.append("\n");
      output.append("\tpskcPresent: ");
      output.append(pskcPresent);
      output.append("\n");
      output.append("\tsecurityPolicyPresent: ");
      output.append(securityPolicyPresent);
      output.append("\n");
      output.append("\tchannelMaskPresent: ");
      output.append(channelMaskPresent);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ThreadNetworkDiagnosticsClusterRouteTable {
    public Long extAddress;
    public Integer rloc16;
    public Integer routerId;
    public Integer nextHop;
    public Integer pathCost;
    public Integer LQIIn;
    public Integer LQIOut;
    public Integer age;
    public Boolean allocated;
    public Boolean linkEstablished;

    public ThreadNetworkDiagnosticsClusterRouteTable(
        Long extAddress,
        Integer rloc16,
        Integer routerId,
        Integer nextHop,
        Integer pathCost,
        Integer LQIIn,
        Integer LQIOut,
        Integer age,
        Boolean allocated,
        Boolean linkEstablished) {
      this.extAddress = extAddress;
      this.rloc16 = rloc16;
      this.routerId = routerId;
      this.nextHop = nextHop;
      this.pathCost = pathCost;
      this.LQIIn = LQIIn;
      this.LQIOut = LQIOut;
      this.age = age;
      this.allocated = allocated;
      this.linkEstablished = linkEstablished;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ThreadNetworkDiagnosticsClusterRouteTable {\n");
      output.append("\textAddress: ");
      output.append(extAddress);
      output.append("\n");
      output.append("\trloc16: ");
      output.append(rloc16);
      output.append("\n");
      output.append("\trouterId: ");
      output.append(routerId);
      output.append("\n");
      output.append("\tnextHop: ");
      output.append(nextHop);
      output.append("\n");
      output.append("\tpathCost: ");
      output.append(pathCost);
      output.append("\n");
      output.append("\tLQIIn: ");
      output.append(LQIIn);
      output.append("\n");
      output.append("\tLQIOut: ");
      output.append(LQIOut);
      output.append("\n");
      output.append("\tage: ");
      output.append(age);
      output.append("\n");
      output.append("\tallocated: ");
      output.append(allocated);
      output.append("\n");
      output.append("\tlinkEstablished: ");
      output.append(linkEstablished);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ThreadNetworkDiagnosticsClusterSecurityPolicy {
    public Integer rotationTime;
    public Integer flags;

    public ThreadNetworkDiagnosticsClusterSecurityPolicy(Integer rotationTime, Integer flags) {
      this.rotationTime = rotationTime;
      this.flags = flags;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ThreadNetworkDiagnosticsClusterSecurityPolicy {\n");
      output.append("\trotationTime: ");
      output.append(rotationTime);
      output.append("\n");
      output.append("\tflags: ");
      output.append(flags);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class OperationalCredentialsClusterFabricDescriptor {
    public byte[] rootPublicKey;
    public Integer vendorId;
    public Long fabricId;
    public Long nodeId;
    public String label;
    public Integer fabricIndex;

    public OperationalCredentialsClusterFabricDescriptor(
        byte[] rootPublicKey,
        Integer vendorId,
        Long fabricId,
        Long nodeId,
        String label,
        Integer fabricIndex) {
      this.rootPublicKey = rootPublicKey;
      this.vendorId = vendorId;
      this.fabricId = fabricId;
      this.nodeId = nodeId;
      this.label = label;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("OperationalCredentialsClusterFabricDescriptor {\n");
      output.append("\trootPublicKey: ");
      output.append(Arrays.toString(rootPublicKey));
      output.append("\n");
      output.append("\tvendorId: ");
      output.append(vendorId);
      output.append("\n");
      output.append("\tfabricId: ");
      output.append(fabricId);
      output.append("\n");
      output.append("\tnodeId: ");
      output.append(nodeId);
      output.append("\n");
      output.append("\tlabel: ");
      output.append(label);
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class OperationalCredentialsClusterNOCStruct {
    public byte[] noc;
    public @Nullable byte[] icac;
    public Integer fabricIndex;

    public OperationalCredentialsClusterNOCStruct(
        byte[] noc, @Nullable byte[] icac, Integer fabricIndex) {
      this.noc = noc;
      this.icac = icac;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("OperationalCredentialsClusterNOCStruct {\n");
      output.append("\tnoc: ");
      output.append(Arrays.toString(noc));
      output.append("\n");
      output.append("\ticac: ");
      output.append(Arrays.toString(icac));
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GroupKeyManagementClusterGroupInfoMapStruct {
    public Integer groupId;
    public ArrayList<Object> endpoints;
    public Optional<String> groupName;
    public Integer fabricIndex;

    public GroupKeyManagementClusterGroupInfoMapStruct(
        Integer groupId,
        ArrayList<Object> endpoints,
        Optional<String> groupName,
        Integer fabricIndex) {
      this.groupId = groupId;
      this.endpoints = endpoints;
      this.groupName = groupName;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GroupKeyManagementClusterGroupInfoMapStruct {\n");
      output.append("\tgroupId: ");
      output.append(groupId);
      output.append("\n");
      output.append("\tendpoints: ");
      output.append(endpoints);
      output.append("\n");
      output.append("\tgroupName: ");
      output.append(groupName);
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GroupKeyManagementClusterGroupKeyMapStruct {
    public Integer groupId;
    public Integer groupKeySetID;
    public Integer fabricIndex;

    public GroupKeyManagementClusterGroupKeyMapStruct(
        Integer groupId, Integer groupKeySetID, Integer fabricIndex) {
      this.groupId = groupId;
      this.groupKeySetID = groupKeySetID;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GroupKeyManagementClusterGroupKeyMapStruct {\n");
      output.append("\tgroupId: ");
      output.append(groupId);
      output.append("\n");
      output.append("\tgroupKeySetID: ");
      output.append(groupKeySetID);
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class GroupKeyManagementClusterGroupKeySetStruct {
    public Integer groupKeySetID;
    public Integer groupKeySecurityPolicy;
    public @Nullable byte[] epochKey0;
    public @Nullable Long epochStartTime0;
    public @Nullable byte[] epochKey1;
    public @Nullable Long epochStartTime1;
    public @Nullable byte[] epochKey2;
    public @Nullable Long epochStartTime2;

    public GroupKeyManagementClusterGroupKeySetStruct(
        Integer groupKeySetID,
        Integer groupKeySecurityPolicy,
        @Nullable byte[] epochKey0,
        @Nullable Long epochStartTime0,
        @Nullable byte[] epochKey1,
        @Nullable Long epochStartTime1,
        @Nullable byte[] epochKey2,
        @Nullable Long epochStartTime2) {
      this.groupKeySetID = groupKeySetID;
      this.groupKeySecurityPolicy = groupKeySecurityPolicy;
      this.epochKey0 = epochKey0;
      this.epochStartTime0 = epochStartTime0;
      this.epochKey1 = epochKey1;
      this.epochStartTime1 = epochStartTime1;
      this.epochKey2 = epochKey2;
      this.epochStartTime2 = epochStartTime2;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("GroupKeyManagementClusterGroupKeySetStruct {\n");
      output.append("\tgroupKeySetID: ");
      output.append(groupKeySetID);
      output.append("\n");
      output.append("\tgroupKeySecurityPolicy: ");
      output.append(groupKeySecurityPolicy);
      output.append("\n");
      output.append("\tepochKey0: ");
      output.append(Arrays.toString(epochKey0));
      output.append("\n");
      output.append("\tepochStartTime0: ");
      output.append(epochStartTime0);
      output.append("\n");
      output.append("\tepochKey1: ");
      output.append(Arrays.toString(epochKey1));
      output.append("\n");
      output.append("\tepochStartTime1: ");
      output.append(epochStartTime1);
      output.append("\n");
      output.append("\tepochKey2: ");
      output.append(Arrays.toString(epochKey2));
      output.append("\n");
      output.append("\tepochStartTime2: ");
      output.append(epochStartTime2);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class FixedLabelClusterLabelStruct {
    public String label;
    public String value;

    public FixedLabelClusterLabelStruct(String label, String value) {
      this.label = label;
      this.value = value;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("FixedLabelClusterLabelStruct {\n");
      output.append("\tlabel: ");
      output.append(label);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class UserLabelClusterLabelStruct {
    public String label;
    public String value;

    public UserLabelClusterLabelStruct(String label, String value) {
      this.label = label;
      this.value = value;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("UserLabelClusterLabelStruct {\n");
      output.append("\tlabel: ");
      output.append(label);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ModeSelectClusterSemanticTag {
    public Integer mfgCode;
    public Integer value;

    public ModeSelectClusterSemanticTag(Integer mfgCode, Integer value) {
      this.mfgCode = mfgCode;
      this.value = value;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ModeSelectClusterSemanticTag {\n");
      output.append("\tmfgCode: ");
      output.append(mfgCode);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ModeSelectClusterModeOptionStruct {
    public String label;
    public Integer mode;
    public ArrayList<ChipStructs.ModeSelectClusterSemanticTag> semanticTags;

    public ModeSelectClusterModeOptionStruct(
        String label,
        Integer mode,
        ArrayList<ChipStructs.ModeSelectClusterSemanticTag> semanticTags) {
      this.label = label;
      this.mode = mode;
      this.semanticTags = semanticTags;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ModeSelectClusterModeOptionStruct {\n");
      output.append("\tlabel: ");
      output.append(label);
      output.append("\n");
      output.append("\tmode: ");
      output.append(mode);
      output.append("\n");
      output.append("\tsemanticTags: ");
      output.append(semanticTags);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class DoorLockClusterDlCredential {
    public Integer credentialType;
    public Integer credentialIndex;

    public DoorLockClusterDlCredential(Integer credentialType, Integer credentialIndex) {
      this.credentialType = credentialType;
      this.credentialIndex = credentialIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("DoorLockClusterDlCredential {\n");
      output.append("\tcredentialType: ");
      output.append(credentialType);
      output.append("\n");
      output.append("\tcredentialIndex: ");
      output.append(credentialIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ThermostatClusterThermostatScheduleTransition {
    public Integer transitionTime;
    public @Nullable Integer heatSetpoint;
    public @Nullable Integer coolSetpoint;

    public ThermostatClusterThermostatScheduleTransition(
        Integer transitionTime, @Nullable Integer heatSetpoint, @Nullable Integer coolSetpoint) {
      this.transitionTime = transitionTime;
      this.heatSetpoint = heatSetpoint;
      this.coolSetpoint = coolSetpoint;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ThermostatClusterThermostatScheduleTransition {\n");
      output.append("\ttransitionTime: ");
      output.append(transitionTime);
      output.append("\n");
      output.append("\theatSetpoint: ");
      output.append(heatSetpoint);
      output.append("\n");
      output.append("\tcoolSetpoint: ");
      output.append(coolSetpoint);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ChannelClusterChannelInfo {
    public Integer majorNumber;
    public Integer minorNumber;
    public Optional<String> name;
    public Optional<String> callSign;
    public Optional<String> affiliateCallSign;

    public ChannelClusterChannelInfo(
        Integer majorNumber,
        Integer minorNumber,
        Optional<String> name,
        Optional<String> callSign,
        Optional<String> affiliateCallSign) {
      this.majorNumber = majorNumber;
      this.minorNumber = minorNumber;
      this.name = name;
      this.callSign = callSign;
      this.affiliateCallSign = affiliateCallSign;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ChannelClusterChannelInfo {\n");
      output.append("\tmajorNumber: ");
      output.append(majorNumber);
      output.append("\n");
      output.append("\tminorNumber: ");
      output.append(minorNumber);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tcallSign: ");
      output.append(callSign);
      output.append("\n");
      output.append("\taffiliateCallSign: ");
      output.append(affiliateCallSign);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ChannelClusterLineupInfo {
    public String operatorName;
    public Optional<String> lineupName;
    public Optional<String> postalCode;
    public Integer lineupInfoType;

    public ChannelClusterLineupInfo(
        String operatorName,
        Optional<String> lineupName,
        Optional<String> postalCode,
        Integer lineupInfoType) {
      this.operatorName = operatorName;
      this.lineupName = lineupName;
      this.postalCode = postalCode;
      this.lineupInfoType = lineupInfoType;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ChannelClusterLineupInfo {\n");
      output.append("\toperatorName: ");
      output.append(operatorName);
      output.append("\n");
      output.append("\tlineupName: ");
      output.append(lineupName);
      output.append("\n");
      output.append("\tpostalCode: ");
      output.append(postalCode);
      output.append("\n");
      output.append("\tlineupInfoType: ");
      output.append(lineupInfoType);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TargetNavigatorClusterTargetInfo {
    public Integer identifier;
    public String name;

    public TargetNavigatorClusterTargetInfo(Integer identifier, String name) {
      this.identifier = identifier;
      this.name = name;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TargetNavigatorClusterTargetInfo {\n");
      output.append("\tidentifier: ");
      output.append(identifier);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class MediaPlaybackClusterPlaybackPosition {
    public Long updatedAt;
    public @Nullable Long position;

    public MediaPlaybackClusterPlaybackPosition(Long updatedAt, @Nullable Long position) {
      this.updatedAt = updatedAt;
      this.position = position;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("MediaPlaybackClusterPlaybackPosition {\n");
      output.append("\tupdatedAt: ");
      output.append(updatedAt);
      output.append("\n");
      output.append("\tposition: ");
      output.append(position);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class MediaInputClusterInputInfo {
    public Integer index;
    public Integer inputType;
    public String name;
    public String description;

    public MediaInputClusterInputInfo(
        Integer index, Integer inputType, String name, String description) {
      this.index = index;
      this.inputType = inputType;
      this.name = name;
      this.description = description;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("MediaInputClusterInputInfo {\n");
      output.append("\tindex: ");
      output.append(index);
      output.append("\n");
      output.append("\tinputType: ");
      output.append(inputType);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tdescription: ");
      output.append(description);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterDimension {
    public Double width;
    public Double height;
    public Integer metric;

    public ContentLauncherClusterDimension(Double width, Double height, Integer metric) {
      this.width = width;
      this.height = height;
      this.metric = metric;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterDimension {\n");
      output.append("\twidth: ");
      output.append(width);
      output.append("\n");
      output.append("\theight: ");
      output.append(height);
      output.append("\n");
      output.append("\tmetric: ");
      output.append(metric);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterAdditionalInfo {
    public String name;
    public String value;

    public ContentLauncherClusterAdditionalInfo(String name, String value) {
      this.name = name;
      this.value = value;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterAdditionalInfo {\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterParameter {
    public Integer type;
    public String value;
    public Optional<ArrayList<ChipStructs.ContentLauncherClusterAdditionalInfo>> externalIDList;

    public ContentLauncherClusterParameter(
        Integer type,
        String value,
        Optional<ArrayList<ChipStructs.ContentLauncherClusterAdditionalInfo>> externalIDList) {
      this.type = type;
      this.value = value;
      this.externalIDList = externalIDList;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterParameter {\n");
      output.append("\ttype: ");
      output.append(type);
      output.append("\n");
      output.append("\tvalue: ");
      output.append(value);
      output.append("\n");
      output.append("\texternalIDList: ");
      output.append(externalIDList);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterContentSearch {
    public ArrayList<ChipStructs.ContentLauncherClusterParameter> parameterList;

    public ContentLauncherClusterContentSearch(
        ArrayList<ChipStructs.ContentLauncherClusterParameter> parameterList) {
      this.parameterList = parameterList;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterContentSearch {\n");
      output.append("\tparameterList: ");
      output.append(parameterList);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterStyleInformation {
    public Optional<String> imageUrl;
    public Optional<String> color;
    public Optional<ChipStructs.ContentLauncherClusterDimension> size;

    public ContentLauncherClusterStyleInformation(
        Optional<String> imageUrl,
        Optional<String> color,
        Optional<ChipStructs.ContentLauncherClusterDimension> size) {
      this.imageUrl = imageUrl;
      this.color = color;
      this.size = size;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterStyleInformation {\n");
      output.append("\timageUrl: ");
      output.append(imageUrl);
      output.append("\n");
      output.append("\tcolor: ");
      output.append(color);
      output.append("\n");
      output.append("\tsize: ");
      output.append(size);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ContentLauncherClusterBrandingInformation {
    public String providerName;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> background;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> logo;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> progressBar;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> splash;
    public Optional<ChipStructs.ContentLauncherClusterStyleInformation> waterMark;

    public ContentLauncherClusterBrandingInformation(
        String providerName,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> background,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> logo,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> progressBar,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> splash,
        Optional<ChipStructs.ContentLauncherClusterStyleInformation> waterMark) {
      this.providerName = providerName;
      this.background = background;
      this.logo = logo;
      this.progressBar = progressBar;
      this.splash = splash;
      this.waterMark = waterMark;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ContentLauncherClusterBrandingInformation {\n");
      output.append("\tproviderName: ");
      output.append(providerName);
      output.append("\n");
      output.append("\tbackground: ");
      output.append(background);
      output.append("\n");
      output.append("\tlogo: ");
      output.append(logo);
      output.append("\n");
      output.append("\tprogressBar: ");
      output.append(progressBar);
      output.append("\n");
      output.append("\tsplash: ");
      output.append(splash);
      output.append("\n");
      output.append("\twaterMark: ");
      output.append(waterMark);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class AudioOutputClusterOutputInfo {
    public Integer index;
    public Integer outputType;
    public String name;

    public AudioOutputClusterOutputInfo(Integer index, Integer outputType, String name) {
      this.index = index;
      this.outputType = outputType;
      this.name = name;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("AudioOutputClusterOutputInfo {\n");
      output.append("\tindex: ");
      output.append(index);
      output.append("\n");
      output.append("\toutputType: ");
      output.append(outputType);
      output.append("\n");
      output.append("\tname: ");
      output.append(name);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ApplicationLauncherClusterApplication {
    public Integer catalogVendorId;
    public String applicationId;

    public ApplicationLauncherClusterApplication(Integer catalogVendorId, String applicationId) {
      this.catalogVendorId = catalogVendorId;
      this.applicationId = applicationId;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ApplicationLauncherClusterApplication {\n");
      output.append("\tcatalogVendorId: ");
      output.append(catalogVendorId);
      output.append("\n");
      output.append("\tapplicationId: ");
      output.append(applicationId);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ApplicationLauncherClusterApplicationEP {
    public ChipStructs.ApplicationLauncherClusterApplication application;
    public Optional<Integer> endpoint;

    public ApplicationLauncherClusterApplicationEP(
        ChipStructs.ApplicationLauncherClusterApplication application, Optional<Integer> endpoint) {
      this.application = application;
      this.endpoint = endpoint;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ApplicationLauncherClusterApplicationEP {\n");
      output.append("\tapplication: ");
      output.append(application);
      output.append("\n");
      output.append("\tendpoint: ");
      output.append(endpoint);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class ApplicationBasicClusterApplicationBasicApplication {
    public Integer catalogVendorId;
    public String applicationId;

    public ApplicationBasicClusterApplicationBasicApplication(
        Integer catalogVendorId, String applicationId) {
      this.catalogVendorId = catalogVendorId;
      this.applicationId = applicationId;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("ApplicationBasicClusterApplicationBasicApplication {\n");
      output.append("\tcatalogVendorId: ");
      output.append(catalogVendorId);
      output.append("\n");
      output.append("\tapplicationId: ");
      output.append(applicationId);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterSimpleStruct {
    public Integer a;
    public Boolean b;
    public Integer c;
    public byte[] d;
    public String e;
    public Integer f;
    public Float g;
    public Double h;

    public TestClusterClusterSimpleStruct(
        Integer a, Boolean b, Integer c, byte[] d, String e, Integer f, Float g, Double h) {
      this.a = a;
      this.b = b;
      this.c = c;
      this.d = d;
      this.e = e;
      this.f = f;
      this.g = g;
      this.h = h;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterSimpleStruct {\n");
      output.append("\ta: ");
      output.append(a);
      output.append("\n");
      output.append("\tb: ");
      output.append(b);
      output.append("\n");
      output.append("\tc: ");
      output.append(c);
      output.append("\n");
      output.append("\td: ");
      output.append(Arrays.toString(d));
      output.append("\n");
      output.append("\te: ");
      output.append(e);
      output.append("\n");
      output.append("\tf: ");
      output.append(f);
      output.append("\n");
      output.append("\tg: ");
      output.append(g);
      output.append("\n");
      output.append("\th: ");
      output.append(h);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterTestFabricScoped {
    public Integer fabricSensitiveInt8u;
    public Optional<Integer> optionalFabricSensitiveInt8u;
    public @Nullable Integer nullableFabricSensitiveInt8u;
    public @Nullable Optional<Integer> nullableOptionalFabricSensitiveInt8u;
    public String fabricSensitiveCharString;
    public ChipStructs.TestClusterClusterSimpleStruct fabricSensitiveStruct;
    public ArrayList<Object> fabricSensitiveInt8uList;
    public Integer fabricIndex;

    public TestClusterClusterTestFabricScoped(
        Integer fabricSensitiveInt8u,
        Optional<Integer> optionalFabricSensitiveInt8u,
        @Nullable Integer nullableFabricSensitiveInt8u,
        @Nullable Optional<Integer> nullableOptionalFabricSensitiveInt8u,
        String fabricSensitiveCharString,
        ChipStructs.TestClusterClusterSimpleStruct fabricSensitiveStruct,
        ArrayList<Object> fabricSensitiveInt8uList,
        Integer fabricIndex) {
      this.fabricSensitiveInt8u = fabricSensitiveInt8u;
      this.optionalFabricSensitiveInt8u = optionalFabricSensitiveInt8u;
      this.nullableFabricSensitiveInt8u = nullableFabricSensitiveInt8u;
      this.nullableOptionalFabricSensitiveInt8u = nullableOptionalFabricSensitiveInt8u;
      this.fabricSensitiveCharString = fabricSensitiveCharString;
      this.fabricSensitiveStruct = fabricSensitiveStruct;
      this.fabricSensitiveInt8uList = fabricSensitiveInt8uList;
      this.fabricIndex = fabricIndex;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterTestFabricScoped {\n");
      output.append("\tfabricSensitiveInt8u: ");
      output.append(fabricSensitiveInt8u);
      output.append("\n");
      output.append("\toptionalFabricSensitiveInt8u: ");
      output.append(optionalFabricSensitiveInt8u);
      output.append("\n");
      output.append("\tnullableFabricSensitiveInt8u: ");
      output.append(nullableFabricSensitiveInt8u);
      output.append("\n");
      output.append("\tnullableOptionalFabricSensitiveInt8u: ");
      output.append(nullableOptionalFabricSensitiveInt8u);
      output.append("\n");
      output.append("\tfabricSensitiveCharString: ");
      output.append(fabricSensitiveCharString);
      output.append("\n");
      output.append("\tfabricSensitiveStruct: ");
      output.append(fabricSensitiveStruct);
      output.append("\n");
      output.append("\tfabricSensitiveInt8uList: ");
      output.append(fabricSensitiveInt8uList);
      output.append("\n");
      output.append("\tfabricIndex: ");
      output.append(fabricIndex);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterNullablesAndOptionalsStruct {
    public @Nullable Integer nullableInt;
    public Optional<Integer> optionalInt;
    public @Nullable Optional<Integer> nullableOptionalInt;
    public @Nullable String nullableString;
    public Optional<String> optionalString;
    public @Nullable Optional<String> nullableOptionalString;
    public @Nullable ChipStructs.TestClusterClusterSimpleStruct nullableStruct;
    public Optional<ChipStructs.TestClusterClusterSimpleStruct> optionalStruct;
    public @Nullable Optional<ChipStructs.TestClusterClusterSimpleStruct> nullableOptionalStruct;
    public @Nullable ArrayList<Object> nullableList;
    public Optional<ArrayList<Object>> optionalList;
    public @Nullable Optional<ArrayList<Object>> nullableOptionalList;

    public TestClusterClusterNullablesAndOptionalsStruct(
        @Nullable Integer nullableInt,
        Optional<Integer> optionalInt,
        @Nullable Optional<Integer> nullableOptionalInt,
        @Nullable String nullableString,
        Optional<String> optionalString,
        @Nullable Optional<String> nullableOptionalString,
        @Nullable ChipStructs.TestClusterClusterSimpleStruct nullableStruct,
        Optional<ChipStructs.TestClusterClusterSimpleStruct> optionalStruct,
        @Nullable Optional<ChipStructs.TestClusterClusterSimpleStruct> nullableOptionalStruct,
        @Nullable ArrayList<Object> nullableList,
        Optional<ArrayList<Object>> optionalList,
        @Nullable Optional<ArrayList<Object>> nullableOptionalList) {
      this.nullableInt = nullableInt;
      this.optionalInt = optionalInt;
      this.nullableOptionalInt = nullableOptionalInt;
      this.nullableString = nullableString;
      this.optionalString = optionalString;
      this.nullableOptionalString = nullableOptionalString;
      this.nullableStruct = nullableStruct;
      this.optionalStruct = optionalStruct;
      this.nullableOptionalStruct = nullableOptionalStruct;
      this.nullableList = nullableList;
      this.optionalList = optionalList;
      this.nullableOptionalList = nullableOptionalList;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterNullablesAndOptionalsStruct {\n");
      output.append("\tnullableInt: ");
      output.append(nullableInt);
      output.append("\n");
      output.append("\toptionalInt: ");
      output.append(optionalInt);
      output.append("\n");
      output.append("\tnullableOptionalInt: ");
      output.append(nullableOptionalInt);
      output.append("\n");
      output.append("\tnullableString: ");
      output.append(nullableString);
      output.append("\n");
      output.append("\toptionalString: ");
      output.append(optionalString);
      output.append("\n");
      output.append("\tnullableOptionalString: ");
      output.append(nullableOptionalString);
      output.append("\n");
      output.append("\tnullableStruct: ");
      output.append(nullableStruct);
      output.append("\n");
      output.append("\toptionalStruct: ");
      output.append(optionalStruct);
      output.append("\n");
      output.append("\tnullableOptionalStruct: ");
      output.append(nullableOptionalStruct);
      output.append("\n");
      output.append("\tnullableList: ");
      output.append(nullableList);
      output.append("\n");
      output.append("\toptionalList: ");
      output.append(optionalList);
      output.append("\n");
      output.append("\tnullableOptionalList: ");
      output.append(nullableOptionalList);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterNestedStruct {
    public Integer a;
    public Boolean b;
    public ChipStructs.TestClusterClusterSimpleStruct c;

    public TestClusterClusterNestedStruct(
        Integer a, Boolean b, ChipStructs.TestClusterClusterSimpleStruct c) {
      this.a = a;
      this.b = b;
      this.c = c;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterNestedStruct {\n");
      output.append("\ta: ");
      output.append(a);
      output.append("\n");
      output.append("\tb: ");
      output.append(b);
      output.append("\n");
      output.append("\tc: ");
      output.append(c);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterNestedStructList {
    public Integer a;
    public Boolean b;
    public ChipStructs.TestClusterClusterSimpleStruct c;
    public ArrayList<ChipStructs.TestClusterClusterSimpleStruct> d;
    public ArrayList<Object> e;
    public ArrayList<byte[]> f;
    public ArrayList<Object> g;

    public TestClusterClusterNestedStructList(
        Integer a,
        Boolean b,
        ChipStructs.TestClusterClusterSimpleStruct c,
        ArrayList<ChipStructs.TestClusterClusterSimpleStruct> d,
        ArrayList<Object> e,
        ArrayList<byte[]> f,
        ArrayList<Object> g) {
      this.a = a;
      this.b = b;
      this.c = c;
      this.d = d;
      this.e = e;
      this.f = f;
      this.g = g;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterNestedStructList {\n");
      output.append("\ta: ");
      output.append(a);
      output.append("\n");
      output.append("\tb: ");
      output.append(b);
      output.append("\n");
      output.append("\tc: ");
      output.append(c);
      output.append("\n");
      output.append("\td: ");
      output.append(d);
      output.append("\n");
      output.append("\te: ");
      output.append(e);
      output.append("\n");
      output.append("\tf: ");
      output.append(f);
      output.append("\n");
      output.append("\tg: ");
      output.append(g);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterDoubleNestedStructList {
    public ArrayList<ChipStructs.TestClusterClusterNestedStructList> a;

    public TestClusterClusterDoubleNestedStructList(
        ArrayList<ChipStructs.TestClusterClusterNestedStructList> a) {
      this.a = a;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterDoubleNestedStructList {\n");
      output.append("\ta: ");
      output.append(a);
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }

  public static class TestClusterClusterTestListStructOctet {
    public Long member1;
    public byte[] member2;

    public TestClusterClusterTestListStructOctet(Long member1, byte[] member2) {
      this.member1 = member1;
      this.member2 = member2;
    }

    @Override
    public String toString() {
      StringBuilder output = new StringBuilder();
      output.append("TestClusterClusterTestListStructOctet {\n");
      output.append("\tmember1: ");
      output.append(member1);
      output.append("\n");
      output.append("\tmember2: ");
      output.append(Arrays.toString(member2));
      output.append("\n");
      output.append("}\n");
      return output.toString();
    }
  }
}
