diff --git a/.github/workflows/zap_regeneration.yaml b/.github/workflows/zap_regeneration.yaml
index 11f9492..de120fd 100644
--- a/.github/workflows/zap_regeneration.yaml
+++ b/.github/workflows/zap_regeneration.yaml
@@ -28,7 +28,7 @@
 
         runs-on: ubuntu-20.04
         container:
-            image: connectedhomeip/chip-build:0.6.11
+            image: connectedhomeip/chip-build:0.6.15
         defaults:
             run:
                 shell: sh
diff --git a/.github/workflows/zap_templates.yaml b/.github/workflows/zap_templates.yaml
index ba21cfc..1e7713b 100644
--- a/.github/workflows/zap_templates.yaml
+++ b/.github/workflows/zap_templates.yaml
@@ -29,7 +29,7 @@
 
         runs-on: ubuntu-20.04
         container:
-            image: connectedhomeip/chip-build:0.6.11
+            image: connectedhomeip/chip-build:0.6.15
         defaults:
             run:
                 shell: sh
diff --git a/examples/darwin-framework-tool/commands/provider/OTAProviderDelegate.h b/examples/darwin-framework-tool/commands/provider/OTAProviderDelegate.h
index f213e06..40c02ec 100644
--- a/examples/darwin-framework-tool/commands/provider/OTAProviderDelegate.h
+++ b/examples/darwin-framework-tool/commands/provider/OTAProviderDelegate.h
@@ -24,7 +24,7 @@
     OTAProviderUserUnknown = 0x03,
 };
 
-@interface DeviceSoftwareVersionModelData : MTROtaSoftwareUpdateProviderClusterQueryImageParams
+@interface DeviceSoftwareVersionModelData : MTROTASoftwareUpdateProviderClusterQueryImageParams
 @property BOOL softwareVersionValid;
 @property (strong, nonatomic, nullable) NSNumber * cDVersionNumber;
 @property (strong, nonatomic, nullable) NSNumber * minApplicableSoftwareVersion;
@@ -32,7 +32,7 @@
 @property (strong, nonatomic, nullable) NSString * otaURL;
 @end
 
-@interface DeviceSoftwareVersionModel : MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams
+@interface DeviceSoftwareVersionModel : MTROTASoftwareUpdateProviderClusterQueryImageResponseParams
 @property (strong, nonatomic, nullable) DeviceSoftwareVersionModelData * deviceModelData;
 - (NSComparisonResult)CompareSoftwareVersions:(DeviceSoftwareVersionModel * _Nullable)otherObject;
 @end
@@ -40,28 +40,28 @@
 @interface OTAProviderDelegate : NSObject <MTROTAProviderDelegate>
 - (void)handleQueryImageForNodeID:(NSNumber * _Nonnull)nodeID
                        controller:(MTRDeviceController * _Nonnull)controller
-                           params:(MTROtaSoftwareUpdateProviderClusterQueryImageParams * _Nonnull)params
-                       completion:(void (^_Nonnull)(MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
+                           params:(MTROTASoftwareUpdateProviderClusterQueryImageParams * _Nonnull)params
+                       completion:(void (^_Nonnull)(MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
                                       NSError * _Nullable error))completion;
 
 - (void)handleApplyUpdateRequestForNodeID:(NSNumber * _Nonnull)nodeID
                                controller:(MTRDeviceController * _Nonnull)controller
-                                   params:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams * _Nonnull)params
+                                   params:(MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams * _Nonnull)params
                                completion:
-                                   (void (^_Nonnull)(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
+                                   (void (^_Nonnull)(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                        NSError * _Nullable error))completion;
 
 - (void)handleNotifyUpdateAppliedForNodeID:(NSNumber * _Nonnull)nodeID
                                 controller:(MTRDeviceController * _Nonnull)controller
-                                    params:(MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams * _Nonnull)params
+                                    params:(MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams * _Nonnull)params
                                 completion:(MTRStatusCompletion _Nonnull)completion;
 
 @property (strong, nonatomic, nullable) NSArray<DeviceSoftwareVersionModel *> * candidates;
 @property (strong, nonatomic, nullable) DeviceSoftwareVersionModel * selectedCandidate;
 @property (strong, nonatomic, nullable) NSNumber * nodeID;
-@property (nonatomic, readwrite) MTROtaSoftwareUpdateProviderOTAQueryStatus queryImageStatus;
+@property (nonatomic, readwrite) MTROTASoftwareUpdateProviderOTAQueryStatus queryImageStatus;
 @property (nonatomic, readwrite) UserConsentState userConsentState;
-@property (nonatomic, readwrite) MTROtaSoftwareUpdateProviderOTAApplyUpdateAction action;
+@property (nonatomic, readwrite) MTROTASoftwareUpdateProviderOTAApplyUpdateAction action;
 @property (nonatomic, readwrite, nullable) NSNumber * delayedActionTime;
 @property (nonatomic, readwrite, nullable) NSNumber * timedInvokeTimeoutMs;
 @property (nonatomic, readwrite, nullable) NSNumber * userConsentNeeded;
diff --git a/examples/darwin-framework-tool/commands/provider/OTAProviderDelegate.mm b/examples/darwin-framework-tool/commands/provider/OTAProviderDelegate.mm
index 50bb908..68eef16 100644
--- a/examples/darwin-framework-tool/commands/provider/OTAProviderDelegate.mm
+++ b/examples/darwin-framework-tool/commands/provider/OTAProviderDelegate.mm
@@ -35,26 +35,26 @@
 {
     if (self = [super init]) {
         _selectedCandidate = [[DeviceSoftwareVersionModel alloc] init];
-        _action = MTROtaSoftwareUpdateProviderOTAApplyUpdateActionProceed;
+        _action = MTROTASoftwareUpdateProviderOTAApplyUpdateActionProceed;
         _userConsentState = OTAProviderUserUnknown;
         _delayedActionTime = nil;
         _timedInvokeTimeoutMs = nil;
         _userConsentNeeded = nil;
-        _queryImageStatus = MTROtaSoftwareUpdateProviderOTAQueryStatusNotAvailable;
+        _queryImageStatus = MTROTASoftwareUpdateProviderOTAQueryStatusNotAvailable;
     }
     return self;
 }
 
 - (void)handleQueryImageForNodeID:(NSNumber * _Nonnull)nodeID
                        controller:(MTRDeviceController * _Nonnull)controller
-                           params:(MTROtaSoftwareUpdateProviderClusterQueryImageParams * _Nonnull)params
-                       completion:(void (^_Nonnull)(MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
+                           params:(MTROTASoftwareUpdateProviderClusterQueryImageParams * _Nonnull)params
+                       completion:(void (^_Nonnull)(MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
                                       NSError * _Nullable error))completion
 {
     auto isBDXProtocolSupported =
-        [params.protocolsSupported containsObject:@(MTROtaSoftwareUpdateProviderOTADownloadProtocolBDXSynchronous)];
+        [params.protocolsSupported containsObject:@(MTROTASoftwareUpdateProviderOTADownloadProtocolBDXSynchronous)];
     if (!isBDXProtocolSupported) {
-        _selectedCandidate.status = @(MTROtaSoftwareUpdateProviderOTAQueryStatusDownloadProtocolNotSupported);
+        _selectedCandidate.status = @(MTROTASoftwareUpdateProviderOTAQueryStatusDownloadProtocolNotSupported);
         completion(_selectedCandidate, nil);
         return;
     }
@@ -62,7 +62,7 @@
     auto hasCandidate = [self SelectOTACandidate:params.vendorId rPID:params.productId rSV:params.softwareVersion];
     if (!hasCandidate) {
         NSLog(@"Unable to select OTA Image.");
-        _selectedCandidate.status = @(MTROtaSoftwareUpdateProviderOTAQueryStatusNotAvailable);
+        _selectedCandidate.status = @(MTROTASoftwareUpdateProviderOTAQueryStatusNotAvailable);
         completion(_selectedCandidate, nil);
         return;
     }
@@ -80,13 +80,13 @@
 
 - (void)handleApplyUpdateRequestForNodeID:(NSNumber * _Nonnull)nodeID
                                controller:(MTRDeviceController * _Nonnull)controller
-                                   params:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams * _Nonnull)params
+                                   params:(MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams * _Nonnull)params
                                completion:
-                                   (void (^_Nonnull)(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
+                                   (void (^_Nonnull)(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                        NSError * _Nullable error))completion
 {
-    MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * applyUpdateResponseParams =
-        [[MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams alloc] init];
+    MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * applyUpdateResponseParams =
+        [[MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams alloc] init];
     applyUpdateResponseParams.action = @(_action);
     if (_delayedActionTime) {
         applyUpdateResponseParams.delayedActionTime = _delayedActionTime;
@@ -100,7 +100,7 @@
 
 - (void)handleNotifyUpdateAppliedForNodeID:(NSNumber * _Nonnull)nodeID
                                 controller:(MTRDeviceController * _Nonnull)controller
-                                    params:(MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams * _Nonnull)params
+                                    params:(MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams * _Nonnull)params
                                 completion:(MTRStatusCompletion _Nonnull)completion
 {
     completion(nil);
diff --git a/examples/darwin-framework-tool/commands/provider/OTASoftwareUpdateInteractive.mm b/examples/darwin-framework-tool/commands/provider/OTASoftwareUpdateInteractive.mm
index ad3966a..2e6734b 100644
--- a/examples/darwin-framework-tool/commands/provider/OTASoftwareUpdateInteractive.mm
+++ b/examples/darwin-framework-tool/commands/provider/OTASoftwareUpdateInteractive.mm
@@ -161,14 +161,14 @@
 {
     CHIP_ERROR error = CHIP_NO_ERROR;
     if (action == 0) {
-        mOTADelegate.action = MTROtaSoftwareUpdateProviderOTAApplyUpdateActionProceed;
-        ChipLogDetail(chipTool, "Successfully set action to: MTROtaSoftwareUpdateProviderOTAApplyUpdateActionProceed");
+        mOTADelegate.action = MTROTASoftwareUpdateProviderOTAApplyUpdateActionProceed;
+        ChipLogDetail(chipTool, "Successfully set action to: MTROTASoftwareUpdateProviderOTAApplyUpdateActionProceed");
     } else if (action == 1) {
-        mOTADelegate.action = MTROtaSoftwareUpdateProviderOTAApplyUpdateActionAwaitNextAction;
-        ChipLogDetail(chipTool, "Successfully set action to: MTROtaSoftwareUpdateProviderOTAApplyUpdateActionAwaitNextAction");
+        mOTADelegate.action = MTROTASoftwareUpdateProviderOTAApplyUpdateActionAwaitNextAction;
+        ChipLogDetail(chipTool, "Successfully set action to: MTROTASoftwareUpdateProviderOTAApplyUpdateActionAwaitNextAction");
     } else if (action == 2) {
-        mOTADelegate.action = MTROtaSoftwareUpdateProviderOTAApplyUpdateActionDiscontinue;
-        ChipLogDetail(chipTool, "Successfully set action to: MTROtaSoftwareUpdateProviderOTAApplyUpdateActionDiscontinue");
+        mOTADelegate.action = MTROTASoftwareUpdateProviderOTAApplyUpdateActionDiscontinue;
+        ChipLogDetail(chipTool, "Successfully set action to: MTROTASoftwareUpdateProviderOTAApplyUpdateActionDiscontinue");
     } else {
         ChipLogError(chipTool, "Only accepts the following: 0 (Proceed), 1 (Await Next Action), 2 (Discontinue)");
         error = CHIP_ERROR_INTERNAL;
@@ -179,18 +179,18 @@
 {
     CHIP_ERROR error = CHIP_NO_ERROR;
     if (status == 0) {
-        mOTADelegate.queryImageStatus = MTROtaSoftwareUpdateProviderOTAQueryStatusUpdateAvailable;
-        ChipLogDetail(chipTool, "Successfully set status to: MTROtaSoftwareUpdateProviderOTAQueryStatusUpdateAvailable");
+        mOTADelegate.queryImageStatus = MTROTASoftwareUpdateProviderOTAQueryStatusUpdateAvailable;
+        ChipLogDetail(chipTool, "Successfully set status to: MTROTASoftwareUpdateProviderOTAQueryStatusUpdateAvailable");
     } else if (status == 1) {
-        mOTADelegate.queryImageStatus = MTROtaSoftwareUpdateProviderOTAQueryStatusBusy;
-        ChipLogDetail(chipTool, "Successfully set status to: MTROtaSoftwareUpdateProviderOTAQueryStatusBusy");
+        mOTADelegate.queryImageStatus = MTROTASoftwareUpdateProviderOTAQueryStatusBusy;
+        ChipLogDetail(chipTool, "Successfully set status to: MTROTASoftwareUpdateProviderOTAQueryStatusBusy");
     } else if (status == 2) {
-        mOTADelegate.queryImageStatus = MTROtaSoftwareUpdateProviderOTAQueryStatusNotAvailable;
-        ChipLogDetail(chipTool, "Successfully set status to: MTROtaSoftwareUpdateProviderOTAQueryStatusNotAvailable");
+        mOTADelegate.queryImageStatus = MTROTASoftwareUpdateProviderOTAQueryStatusNotAvailable;
+        ChipLogDetail(chipTool, "Successfully set status to: MTROTASoftwareUpdateProviderOTAQueryStatusNotAvailable");
     } else if (status == 4) {
-        mOTADelegate.queryImageStatus = MTROtaSoftwareUpdateProviderOTAQueryStatusDownloadProtocolNotSupported;
+        mOTADelegate.queryImageStatus = MTROTASoftwareUpdateProviderOTAQueryStatusDownloadProtocolNotSupported;
         ChipLogDetail(
-            chipTool, "Successfully set status to: MTROtaSoftwareUpdateProviderOTAQueryStatusDownloadProtocolNotSupported");
+            chipTool, "Successfully set status to: MTROTASoftwareUpdateProviderOTAQueryStatusDownloadProtocolNotSupported");
     } else {
         ChipLogError(chipTool, "Only accepts the following: 0 (Available), 1 (Busy), 2 (Not Available), 3 (Not Supported)");
         error = CHIP_ERROR_INTERNAL;
diff --git a/examples/darwin-framework-tool/templates/commands.zapt b/examples/darwin-framework-tool/templates/commands.zapt
index be91419..2d39ca2 100644
--- a/examples/darwin-framework-tool/templates/commands.zapt
+++ b/examples/darwin-framework-tool/templates/commands.zapt
@@ -46,8 +46,8 @@
         ChipLogProgress(chipTool, "Sending cluster ({{asHex parent.code 8}}) command ({{asHex code 8}}) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseCluster{{asUpperCamelCase clusterName}} * cluster = [[MTRBaseCluster{{asUpperCamelCase clusterName}} alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        __auto_type * params = [[MTR{{asUpperCamelCase clusterName}}Cluster{{asUpperCamelCase name}}Params alloc] init];
+        __auto_type * cluster = [[MTRBaseCluster{{asUpperCamelCase clusterName preserveAcronyms=true}} alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTR{{asUpperCamelCase clusterName preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Params alloc] init];
         params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         {{#chip_cluster_command_arguments}}
         {{>decodable_value target=(concat "params." (asStructPropertyName label)) source=(concat "mRequest." (asLowerCamelCase label)) cluster=parent.clusterName type=type depth=0}}
@@ -58,7 +58,7 @@
         {
             [cluster {{asLowerCamelCase name}}WithParams:params completion:
             {{#if hasSpecificResponse}}
-                ^(MTR{{asUpperCamelCase clusterName}}Cluster{{asUpperCamelCase responseName}}Params * _Nullable values, NSError * _Nullable error) {
+                ^(MTR{{asUpperCamelCase clusterName preserveAcronyms=true}}Cluster{{asUpperCamelCase responseName}}Params * _Nullable values, NSError * _Nullable error) {
                     NSLog(@"Values: %@", values);
             {{else}}
                 ^(NSError * _Nullable error) {
@@ -90,7 +90,8 @@
 {{/chip_cluster_commands}}
 
 {{#chip_server_cluster_attributes}}
-{{#*inline "attribute"}}Attribute{{asUpperCamelCase name}}{{/inline}}
+{{#*inline "cluster"}}Cluster{{asUpperCamelCase parent.name preserveAcronyms=true}}{{/inline}}
+{{#*inline "attribute"}}Attribute{{asUpperCamelCase name preserveAcronyms=true}}{{/inline}}
 
 /*
  * Attribute {{asUpperCamelCase name}}
@@ -111,23 +112,23 @@
         ChipLogProgress(chipTool, "Sending cluster ({{asHex parent.code 8}}) ReadAttribute ({{asHex code 8}}) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseCluster{{asUpperCamelCase parent.name}} * cluster = [[MTRBaseCluster{{asUpperCamelCase parent.name}} alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBase{{>cluster}} alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         {{#if_is_fabric_scoped_struct type}}
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
           params.filterByFabric = mFabricFiltered.Value();
         }
         {{/if_is_fabric_scoped_struct}}
-        [cluster readAttribute{{asUpperCamelCase name}}With
+        [cluster read{{>attribute}}With
         {{~#if_is_fabric_scoped_struct type~}}
         Params:params completion:
         {{~else~}}
         Completion:
         {{~/if_is_fabric_scoped_struct~}}
         ^({{asObjectiveCClass type parent.name}} * _Nullable value, NSError * _Nullable error) {
-        NSLog(@"{{asUpperCamelCase parent.name}}.{{asUpperCamelCase name}} response %@", [value description]);
+        NSLog(@"{{asUpperCamelCase parent.name preserveAcronyms=true}}.{{asUpperCamelCase name preserveAcronyms=true}} response %@", [value description]);
         if (error != nil) {
-          LogNSError("{{asUpperCamelCase parent.name}} {{asUpperCamelCase name}} read Error", error);
+          LogNSError("{{asUpperCamelCase parent.name preserveAcronyms=true}} {{asUpperCamelCase name preserveAcronyms=true}} read Error", error);
         }
         SetCommandExitStatus(error);
          }];
@@ -163,8 +164,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster ({{asHex parent.code 8}}) WriteAttribute ({{asHex code 8}}) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseCluster{{asUpperCamelCase parent.name}} * cluster = [[MTRBaseCluster{{asUpperCamelCase parent.name}} alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBase{{>cluster}} alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
         {{#if_chip_complex}}
@@ -178,9 +179,9 @@
         {{asObjectiveCType type parent.name}} value = [NSNumber numberWith{{asObjectiveCNumberType "" type false}}:mValue];
         {{/if_chip_complex}}
 
-        [cluster writeAttribute{{asUpperCamelCase name}}WithValue:value params:params completion:^(NSError * _Nullable error) {
+        [cluster write{{>attribute}}WithValue:value params:params completion:^(NSError * _Nullable error) {
             if (error != nil) {
-              LogNSError("{{asUpperCamelCase parent.name}} {{asUpperCamelCase name}} write Error", error);
+              LogNSError("{{asUpperCamelCase parent.name preserveAcronyms=true}} {{asUpperCamelCase name preserveAcronyms=true}} write Error", error);
             }
             SetCommandExitStatus(error);
             }];
@@ -217,8 +218,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster ({{asHex parent.code 8}}) ReportAttribute ({{asHex code 8}}) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseCluster{{asUpperCamelCase parent.name}} * cluster = [[MTRBaseCluster{{asUpperCamelCase parent.name}} alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBase{{>cluster}} alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
           params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -231,7 +232,7 @@
         [cluster subscribe{{>attribute}}WithParams:params
                                 subscriptionEstablished:^(){ mSubscriptionEstablished=YES; }
                                 reportHandler:^({{asObjectiveCClass type parent.name}} * _Nullable value, NSError * _Nullable error) {
-        NSLog(@"{{asUpperCamelCase parent.name}}.{{asUpperCamelCase name}} response %@", [value description]);
+        NSLog(@"{{asUpperCamelCase parent.name preserveAcronyms=true}}.{{asUpperCamelCase name preserveAcronyms=true}} response %@", [value description]);
         SetCommandExitStatus(error);
          }];
 
diff --git a/examples/darwin-framework-tool/templates/tests/partials/test_cluster.zapt b/examples/darwin-framework-tool/templates/tests/partials/test_cluster.zapt
index b364cc9..64536ad 100644
--- a/examples/darwin-framework-tool/templates/tests/partials/test_cluster.zapt
+++ b/examples/darwin-framework-tool/templates/tests/partials/test_cluster.zapt
@@ -126,6 +126,8 @@
     {{#*inline "testCommand"}}Test{{asUpperCamelCase label}}_{{index}}{{/inline}}
     CHIP_ERROR {{>testCommand}}()
     {
+        {{#*inline "cluster"}}{{asUpperCamelCase cluster preserveAcronyms=true}}{{/inline}}
+        {{#*inline "attribute"}}{{asUpperCamelCase attribute preserveAcronyms=true}}{{/inline}}
         {{#if (isTestOnlyCluster cluster)}}
         {{asEncodableType}} value;
         {{#chip_tests_item_parameters}}
@@ -134,19 +136,19 @@
         return {{command}}("{{identity}}", value);
         {{else}}
         MTRBaseDevice * device = GetDevice("{{identity}}");
-        MTRBaseCluster{{asUpperCamelCase cluster}} * cluster = [[MTRBaseCluster{{asUpperCamelCase cluster}} alloc] initWithDevice:device endpointID:@({{endpoint}}) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseCluster{{>cluster}} alloc] initWithDevice:device endpointID:@({{endpoint}}) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         {{#if isCommand}}
           {{#if commandObject.arguments.length}}
-            __auto_type * params = [[MTR{{asUpperCamelCase cluster}}Cluster{{asUpperCamelCase command}}Params alloc] init];
+            __auto_type * params = [[MTR{{>cluster}}Cluster{{asUpperCamelCase command preserveAcronyms=true}}Params alloc] init];
           {{/if}}
           {{#chip_tests_item_parameters}}
             {{>test_value target=(concat "params." (asStructPropertyName label)) definedValue=definedValue cluster=parent.cluster depth=0}}
           {{/chip_tests_item_parameters}}
           [cluster {{asLowerCamelCase command}}With{{#if commandObject.arguments.length}}Params:params completion{{else}}Completion{{/if}}:
           {{#if commandObject.hasSpecificResponse}}
-            ^(MTR{{asUpperCamelCase cluster}}Cluster{{asUpperCamelCase commandObject.responseName}}Params * _Nullable values, NSError * _Nullable err) {
+            ^(MTR{{>cluster}}Cluster{{asUpperCamelCase commandObject.responseName}}Params * _Nullable values, NSError * _Nullable err) {
           {{else}}
             ^(NSError * _Nullable err) {
           {{/if}}
@@ -154,11 +156,11 @@
           {{#chip_tests_item_parameters}}
             {{asObjectiveCBasicType type}} {{asLowerCamelCase name}}Argument = {{asTypedLiteral definedValue type}};
           {{/chip_tests_item_parameters}}
-          MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument) maxInterval:@(maxIntervalArgument)];
+          __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument) maxInterval:@(maxIntervalArgument)];
           params.filterByFabric = {{#if fabricFiltered}}true{{else}}false{{/if}};
           params.replaceExistingSubscriptions = {{#if keepSubscriptions}}false{{else}}true{{/if}};
-          [cluster subscribeAttribute{{asUpperCamelCase attribute}}WithParams:params
-                                                                   subscriptionEstablished:^{
+          [cluster subscribeAttribute{{>attribute}}WithParams:params
+                                      subscriptionEstablished:^{
               VerifyOrReturn(testSendCluster{{parent.filename}}_{{waitForReport.index}}_{{asUpperCamelCase waitForReport.command}}_Fulfilled, SetCommandExitStatus(CHIP_ERROR_INCORRECT_STATE));
               NextTest();
           }
@@ -167,10 +169,10 @@
           {{> subscribeDataCallback }} = ^({{asObjectiveCClass attributeObject.type cluster forceList=attributeObject.isArray}} * _Nullable value, NSError * _Nullable err) {
         {{else if isReadAttribute}}
         {{#if_is_fabric_scoped_struct attributeObject.type}}
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = {{fabricFiltered}};
         {{/if_is_fabric_scoped_struct}}
-        [cluster readAttribute{{asUpperCamelCase attribute}}With
+        [cluster readAttribute{{>attribute}}With
         {{~#if_is_fabric_scoped_struct attributeObject.type~}}
         Params:params completion:
         {{~else~}}
@@ -182,7 +184,7 @@
             id {{asLowerCamelCase name}}Argument;
             {{>test_value target=(concat (asLowerCamelCase name) "Argument") definedValue=definedValue cluster=parent.cluster depth=0}}
           {{/chip_tests_item_parameters}}
-          [cluster writeAttribute{{asUpperCamelCase attribute}}WithValue:{{#chip_tests_item_parameters}}{{asLowerCamelCase name}}Argument{{/chip_tests_item_parameters}} completion:^(NSError * _Nullable err) {
+          [cluster writeAttribute{{>attribute}}WithValue:{{#chip_tests_item_parameters}}{{asLowerCamelCase name}}Argument{{/chip_tests_item_parameters}} completion:^(NSError * _Nullable err) {
         {{/if}}
             NSLog(@"{{label}} Error: %@", err);
 
diff --git a/src/darwin/Framework/CHIP/MTROTAProviderDelegate.h b/src/darwin/Framework/CHIP/MTROTAProviderDelegate.h
index 6952bfe..7b81b72 100644
--- a/src/darwin/Framework/CHIP/MTROTAProviderDelegate.h
+++ b/src/darwin/Framework/CHIP/MTROTAProviderDelegate.h
@@ -21,13 +21,21 @@
 NS_ASSUME_NONNULL_BEGIN
 
 typedef void (^MTRQueryImageCompletionHandler)(
-    MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error);
+    MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error);
 
 typedef void (^MTRApplyUpdateRequestCompletionHandler)(
-    MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data, NSError * _Nullable error);
+    MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data, NSError * _Nullable error);
 
 typedef void (^MTRBDXQueryCompletionHandler)(NSData * _Nullable data, BOOL isEOF);
 
+MTR_NEWLY_DEPRECATED("Please use MTRQueryImageCompletionHandler")
+typedef void (^MTRQueryImageCompletionHandlerDeprecated)(
+    MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error);
+
+MTR_NEWLY_DEPRECATED("Plase Use MTRApplyUpdateRequestCompletionHandler")
+typedef void (^MTRApplyUpdateRequestCompletionHandlerDeprecated)(
+    MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data, NSError * _Nullable error);
+
 /**
  * The protocol definition for the MTROTAProviderDelegate
  *
@@ -52,12 +60,12 @@
  */
 - (void)handleQueryImageForNodeID:(NSNumber *)nodeID
                        controller:(MTRDeviceController *)controller
-                           params:(MTROtaSoftwareUpdateProviderClusterQueryImageParams *)params
+                           params:(MTROTASoftwareUpdateProviderClusterQueryImageParams *)params
                        completion:(MTRQueryImageCompletionHandler)completion MTR_NEWLY_AVAILABLE;
 - (void)handleQueryImageForNodeID:(NSNumber *)nodeID
                        controller:(MTRDeviceController *)controller
                            params:(MTROtaSoftwareUpdateProviderClusterQueryImageParams *)params
-                completionHandler:(MTRQueryImageCompletionHandler)completionHandler
+                completionHandler:(MTRQueryImageCompletionHandlerDeprecated)completionHandler
     MTR_NEWLY_DEPRECATED("Please use the selector ending in completion:");
 
 /**
@@ -71,12 +79,12 @@
  */
 - (void)handleApplyUpdateRequestForNodeID:(NSNumber *)nodeID
                                controller:(MTRDeviceController *)controller
-                                   params:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
+                                   params:(MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
                                completion:(MTRApplyUpdateRequestCompletionHandler)completion MTR_NEWLY_AVAILABLE;
 - (void)handleApplyUpdateRequestForNodeID:(NSNumber *)nodeID
                                controller:(MTRDeviceController *)controller
                                    params:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
-                        completionHandler:(MTRApplyUpdateRequestCompletionHandler)completionHandler
+                        completionHandler:(MTRApplyUpdateRequestCompletionHandlerDeprecated)completionHandler
     MTR_NEWLY_DEPRECATED("Please use the selector ending in completion:");
 
 /**
@@ -89,7 +97,7 @@
  */
 - (void)handleNotifyUpdateAppliedForNodeID:(NSNumber *)nodeID
                                 controller:(MTRDeviceController *)controller
-                                    params:(MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
+                                    params:(MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
                                 completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
 - (void)handleNotifyUpdateAppliedForNodeID:(NSNumber *)nodeID
                                 controller:(MTRDeviceController *)controller
diff --git a/src/darwin/Framework/CHIP/MTROTAProviderDelegateBridge.h b/src/darwin/Framework/CHIP/MTROTAProviderDelegateBridge.h
index 97aa258..3c69407 100644
--- a/src/darwin/Framework/CHIP/MTROTAProviderDelegateBridge.h
+++ b/src/darwin/Framework/CHIP/MTROTAProviderDelegateBridge.h
@@ -45,19 +45,19 @@
 private:
     static CHIP_ERROR ConvertToQueryImageParams(
         const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::QueryImage::DecodableType & commandData,
-        MTROtaSoftwareUpdateProviderClusterQueryImageParams * commandParams);
+        MTROTASoftwareUpdateProviderClusterQueryImageParams * commandParams);
     static void ConvertFromQueryImageResponseParms(
-        const MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * responseParams,
+        const MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * responseParams,
         chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::QueryImageResponse::Type & response);
     static void ConvertToApplyUpdateRequestParams(
         const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::ApplyUpdateRequest::DecodableType & commandData,
-        MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams * commandParams);
+        MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams * commandParams);
     static void ConvertFromApplyUpdateRequestResponseParms(
-        const MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * responseParams,
+        const MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * responseParams,
         chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::ApplyUpdateResponse::Type & response);
     static void ConvertToNotifyUpdateAppliedParams(
         const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::NotifyUpdateApplied::DecodableType & commandData,
-        MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams * commandParams);
+        MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams * commandParams);
 
     _Nullable id<MTROTAProviderDelegate> mDelegate;
     dispatch_queue_t mWorkQueue;
diff --git a/src/darwin/Framework/CHIP/MTROTAProviderDelegateBridge.mm b/src/darwin/Framework/CHIP/MTROTAProviderDelegateBridge.mm
index c2ce1b3..5de6041 100644
--- a/src/darwin/Framework/CHIP/MTROTAProviderDelegateBridge.mm
+++ b/src/darwin/Framework/CHIP/MTROTAProviderDelegateBridge.mm
@@ -462,7 +462,7 @@
         return;
     }
 
-    auto * commandParams = [[MTROtaSoftwareUpdateProviderClusterQueryImageParams alloc] init];
+    auto * commandParams = [[MTROTASoftwareUpdateProviderClusterQueryImageParams alloc] init];
     CHIP_ERROR err = ConvertToQueryImageParams(commandData, commandParams);
     if (err != CHIP_NO_ERROR) {
         commandObj->AddStatus(commandPath, Protocols::InteractionModel::Status::InvalidCommand);
@@ -474,7 +474,7 @@
     __block ConcreteCommandPath cachedCommandPath(commandPath.mEndpointId, commandPath.mClusterId, commandPath.mCommandId);
 
     auto completionHandler = ^(
-        MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error) {
+        MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error) {
         dispatch_async(mWorkQueue, ^{
             CommandHandler * handler = EnsureValidState(handle, cachedCommandPath, "QueryImage", data, error);
             VerifyOrReturn(handler != nullptr);
@@ -485,9 +485,9 @@
             Commands::QueryImageResponse::Type response;
             ConvertFromQueryImageResponseParms(data, response);
 
-            auto hasUpdate = [data.status isEqual:@(MTROtaSoftwareUpdateProviderOTAQueryStatusUpdateAvailable)];
+            auto hasUpdate = [data.status isEqual:@(MTROTASoftwareUpdateProviderOTAQueryStatusUpdateAvailable)];
             auto isBDXProtocolSupported =
-                [commandParams.protocolsSupported containsObject:@(MTROtaSoftwareUpdateProviderOTADownloadProtocolBDXSynchronous)];
+                [commandParams.protocolsSupported containsObject:@(MTROTASoftwareUpdateProviderOTADownloadProtocolBDXSynchronous)];
 
             if (hasUpdate && isBDXProtocolSupported) {
                 auto fabricIndex = handler->GetSubjectDescriptor().fabricIndex;
@@ -531,10 +531,15 @@
                                                params:commandParams
                                            completion:completionHandler];
         } else {
-            [strongDelegate handleQueryImageForNodeID:@(nodeId)
-                                           controller:controller
-                                               params:commandParams
-                                    completionHandler:completionHandler];
+            // Cast is safe because subclass does not add any selectors.
+            [strongDelegate
+                handleQueryImageForNodeID:@(nodeId)
+                               controller:controller
+                                   params:static_cast<MTROtaSoftwareUpdateProviderClusterQueryImageParams *>(commandParams)
+                        completionHandler:^(MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
+                            NSError * _Nullable error) {
+                            completionHandler(data, error);
+                        }];
         }
     });
 }
@@ -553,7 +558,7 @@
     __block ConcreteCommandPath cachedCommandPath(commandPath.mEndpointId, commandPath.mClusterId, commandPath.mCommandId);
 
     auto completionHandler
-        = ^(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data, NSError * _Nullable error) {
+        = ^(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data, NSError * _Nullable error) {
               dispatch_async(mWorkQueue, ^{
                   CommandHandler * handler = EnsureValidState(handle, cachedCommandPath, "ApplyUpdateRequest", data, error);
                   VerifyOrReturn(handler != nullptr);
@@ -568,7 +573,7 @@
               });
           };
 
-    auto * commandParams = [[MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams alloc] init];
+    auto * commandParams = [[MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams alloc] init];
     ConvertToApplyUpdateRequestParams(commandData, commandParams);
 
     auto strongDelegate = mDelegate;
@@ -579,10 +584,16 @@
                                                        params:commandParams
                                                    completion:completionHandler];
         } else {
-            [strongDelegate handleApplyUpdateRequestForNodeID:@(nodeId)
-                                                   controller:controller
-                                                       params:commandParams
-                                            completionHandler:completionHandler];
+            // Cast is safe because subclass does not add any selectors.
+            [strongDelegate
+                handleApplyUpdateRequestForNodeID:@(nodeId)
+                                       controller:controller
+                                           params:static_cast<MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams *>(
+                                                      commandParams)
+                                completionHandler:^(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
+                                    NSError * _Nullable error) {
+                                    completionHandler(data, error);
+                                }];
         }
     });
 }
@@ -610,7 +621,7 @@
         });
     };
 
-    auto * commandParams = [[MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams alloc] init];
+    auto * commandParams = [[MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams alloc] init];
     ConvertToNotifyUpdateAppliedParams(commandData, commandParams);
 
     auto strongDelegate = mDelegate;
@@ -621,16 +632,19 @@
                                                         params:commandParams
                                                     completion:completionHandler];
         } else {
-            [strongDelegate handleNotifyUpdateAppliedForNodeID:@(nodeId)
-                                                    controller:controller
-                                                        params:commandParams
-                                             completionHandler:completionHandler];
+            // Cast is safe because subclass does not add any selectors.
+            [strongDelegate
+                handleNotifyUpdateAppliedForNodeID:@(nodeId)
+                                        controller:controller
+                                            params:static_cast<MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams *>(
+                                                       commandParams)
+                                 completionHandler:completionHandler];
         }
     });
 }
 
 CHIP_ERROR MTROTAProviderDelegateBridge::ConvertToQueryImageParams(
-    const Commands::QueryImage::DecodableType & commandData, MTROtaSoftwareUpdateProviderClusterQueryImageParams * commandParams)
+    const Commands::QueryImage::DecodableType & commandData, MTROTASoftwareUpdateProviderClusterQueryImageParams * commandParams)
 {
     commandParams.vendorId = [NSNumber numberWithUnsignedShort:commandData.vendorId];
     commandParams.productId = [NSNumber numberWithUnsignedShort:commandData.productId];
@@ -663,7 +677,7 @@
 }
 
 void MTROTAProviderDelegateBridge::ConvertFromQueryImageResponseParms(
-    const MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * responseParams,
+    const MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * responseParams,
     Commands::QueryImageResponse::Type & response)
 {
     response.status = static_cast<OTAQueryStatus>([responseParams.status intValue]);
@@ -699,14 +713,14 @@
 
 void MTROTAProviderDelegateBridge::ConvertToApplyUpdateRequestParams(
     const Commands::ApplyUpdateRequest::DecodableType & commandData,
-    MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams * commandParams)
+    MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams * commandParams)
 {
     commandParams.updateToken = AsData(commandData.updateToken);
     commandParams.newVersion = [NSNumber numberWithUnsignedLong:commandData.newVersion];
 }
 
 void MTROTAProviderDelegateBridge::ConvertFromApplyUpdateRequestResponseParms(
-    const MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * responseParams,
+    const MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * responseParams,
     Commands::ApplyUpdateResponse::Type & response)
 {
     response.action = static_cast<OTAApplyUpdateAction>([responseParams.action intValue]);
@@ -715,7 +729,7 @@
 
 void MTROTAProviderDelegateBridge::ConvertToNotifyUpdateAppliedParams(
     const Commands::NotifyUpdateApplied::DecodableType & commandData,
-    MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams * commandParams)
+    MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams * commandParams)
 {
     commandParams.updateToken = AsData(commandData.updateToken);
     commandParams.softwareVersion = [NSNumber numberWithUnsignedLong:commandData.softwareVersion];
diff --git a/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt b/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt
index a475e8b..5e0ed71 100644
--- a/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt
@@ -24,7 +24,7 @@
 
 // NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks): Linter is unable to locate the delete on these objects.
 {{#chip_client_clusters includeAll=true}}
-@implementation MTRBaseCluster{{asUpperCamelCase name}}
+@implementation MTRBaseCluster{{asUpperCamelCase name preserveAcronyms=true}}
 
 - (instancetype)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
 {
@@ -42,14 +42,16 @@
 }
 
 {{#chip_cluster_commands}}
-{{#*inline "callbackName"}}{{#if hasSpecificResponse}}{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase responseName}}{{else}}CommandSuccess{{/if}}{{/inline}}
+{{#*inline "cluster"}}{{asUpperCamelCase parent.name preserveAcronyms=true}}{{/inline}}
+{{#*inline "command"}}{{asUpperCamelCase name preserveAcronyms=true}}{{/inline}}
+{{#*inline "callbackName"}}{{#if hasSpecificResponse}}{{>cluster}}Cluster{{asUpperCamelCase responseName preserveAcronyms=true}}{{else}}CommandSuccess{{/if}}{{/inline}}
 {{#unless (hasArguments)}}
 - (void){{asLowerCamelCase name}}WithCompletion:({{>command_completion_type command=.}})completion
 {
   [self {{asLowerCamelCase name}}WithParams:nil completion:completion];
 }
 {{/unless}}
-- (void){{asLowerCamelCase name}}WithParams: (MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Params * {{#unless (commandHasRequiredField .)}}_Nullable{{/unless}})params completion:({{>command_completion_type command=.}})completion
+- (void){{asLowerCamelCase name}}WithParams: (MTR{{>cluster}}Cluster{{>command}}Params * {{#unless (commandHasRequiredField .)}}_Nullable{{/unless}})params completion:({{>command_completion_type command=.}})completion
 {
     // Make a copy of params before we go async.
     params = [params copy];
@@ -102,7 +104,7 @@
 {{/chip_cluster_commands}}
 
 {{#chip_server_cluster_attributes}}
-{{#*inline "attribute"}}Attribute{{asUpperCamelCase name}}{{/inline}}
+{{#*inline "attribute"}}Attribute{{asUpperCamelCase name preserveAcronyms=true}}{{/inline}}
 - (void)read{{>attribute}}With
 {{~#if_is_fabric_scoped_struct type~}}
   Params:(MTRReadParams * _Nullable)params completion:
@@ -202,11 +204,11 @@
 {{/chip_server_cluster_attributes}}
 
 @end
-{{#if (isStrEqual (asUpperCamelCase name) "UnitTesting")}}
+{{#unless (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (compatClusterNameRemapping name))}}
 
-@implementation MTRBaseClusterTestCluster
+@implementation MTRBaseCluster{{compatClusterNameRemapping name}}
 @end
-{{/if}}
+{{/unless}}
 
 @implementation MTRBaseCluster{{compatClusterNameRemapping name}} (Deprecated)
 
@@ -215,7 +217,7 @@
 {
   [self {{asLowerCamelCase name}}WithParams:params completion:
     {{#if hasSpecificResponse}}
-    ^(MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase responseName}}Params * _Nullable data, NSError * _Nullable error) {
+    ^(MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase responseName preserveAcronyms=true}}Params * _Nullable data, NSError * _Nullable error) {
       // Cast is safe because subclass does not add any selectors.
       completionHandler(static_cast<MTR{{compatClusterNameRemapping parent.name}}Cluster{{asUpperCamelCase responseName}}Params *>(data), error);
     }
@@ -233,7 +235,7 @@
 {{/chip_cluster_commands}}
 
 {{#chip_server_cluster_attributes}}
-{{!Backwards compat for now: Treat DeviceTypeList as DeviceList.  Ideally we would have both, not just DeviceList. }}
+{{!Backwards compat for now: Treat DeviceTypeList as DeviceList.  That's OK, since this is a deprecated API. }}
 {{#*inline "attribute"}}Attribute{{#if (isStrEqual (asUpperCamelCase parent.name) "Descriptor")}}{{#if (isStrEqual (asUpperCamelCase name) "DeviceTypeList")}}DeviceList{{else}}{{asUpperCamelCase name}}{{/if}}{{else}}{{asUpperCamelCase name}}{{/if}}{{/inline}}
 {{! TODO: We need a better setup for the API_AVALABLE annotations here; this does not scale at all sanely. }}
 - (void)read{{>attribute}}With
@@ -244,7 +246,7 @@
 {{~/if_is_fabric_scoped_struct~}}
 (void (^)({{asObjectiveCClass type parent.name compatRemapClusterName=true}} * _Nullable value, NSError * _Nullable error))completionHandler
 {
-  [self readAttribute{{asUpperCamelCase name}}With{{#if_is_fabric_scoped_struct type}}Params:params completion:{{else}}Completion:{{/if_is_fabric_scoped_struct}}
+  [self readAttribute{{asUpperCamelCase name preserveAcronyms=true}}With{{#if_is_fabric_scoped_struct type}}Params:params completion:{{else}}Completion:{{/if_is_fabric_scoped_struct}}
       ^({{asObjectiveCClass type parent.name}} * _Nullable value, NSError * _Nullable error) {
         // Cast is safe because subclass does not add any selectors.
         completionHandler(static_cast<{{asObjectiveCClass type parent.name compatRemapClusterName=true}} *>(value), error);
@@ -253,11 +255,11 @@
 {{#if isWritableAttribute}}
 - (void)write{{>attribute}}WithValue:({{asObjectiveCType type parent.name compatRemapClusterName=true}})value completionHandler:(MTRStatusCompletion)completionHandler
 {
-  [self writeAttribute{{asUpperCamelCase name}}WithValue:value params:nil completion:completionHandler];
+  [self writeAttribute{{asUpperCamelCase name preserveAcronyms=true}}WithValue:value params:nil completion:completionHandler];
 }
 - (void)write{{>attribute}}WithValue:({{asObjectiveCType type parent.name compatRemapClusterName=true}})value params:(MTRWriteParams * _Nullable)params completionHandler:(MTRStatusCompletion)completionHandler
 {
-  [self writeAttribute{{asUpperCamelCase name}}WithValue:value params:params completion:completionHandler];
+  [self writeAttribute{{asUpperCamelCase name preserveAcronyms=true}}WithValue:value params:params completion:completionHandler];
 }
 {{/if}}
 {{#if isReportableAttribute}}
@@ -272,7 +274,7 @@
       subscribeParams.minInterval = minInterval;
       subscribeParams.maxInterval = maxInterval;
   }
-  [self subscribeAttribute{{asUpperCamelCase name}}WithParams:subscribeParams subscriptionEstablished:subscriptionEstablishedHandler reportHandler:
+  [self subscribeAttribute{{asUpperCamelCase name preserveAcronyms=true}}WithParams:subscribeParams subscriptionEstablished:subscriptionEstablishedHandler reportHandler:
      ^({{asObjectiveCClass type parent.name}} * _Nullable value, NSError * _Nullable error) {
        // Cast is safe because subclass does not add any selectors.
        reportHandler(static_cast<{{asObjectiveCClass type parent.name compatRemapClusterName=true}} *>(value), error)     ;
@@ -280,7 +282,7 @@
 }
 + (void) read{{>attribute}}WithAttributeCache:(MTRAttributeCacheContainer *)attributeCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completionHandler:(void (^)({{asObjectiveCClass type parent.name compatRemapClusterName=true}} * _Nullable value, NSError * _Nullable error))completionHandler
 {
-  [self readAttribute{{asUpperCamelCase name}}WithClusterStateCache:attributeCacheContainer.realContainer endpoint:endpoint queue:queue completion:
+  [self readAttribute{{asUpperCamelCase name preserveAcronyms=true}}WithClusterStateCache:attributeCacheContainer.realContainer endpoint:endpoint queue:queue completion:
       ^({{asObjectiveCClass type parent.name}} * _Nullable value, NSError * _Nullable error) {
         // Cast is safe because subclass does not add any selectors.
         completionHandler(static_cast<{{asObjectiveCClass type parent.name compatRemapClusterName=true}} *>(value), error);
diff --git a/src/darwin/Framework/CHIP/templates/MTRBaseClusters.zapt b/src/darwin/Framework/CHIP/templates/MTRBaseClusters.zapt
index 0a6e7ee..e4135a8 100644
--- a/src/darwin/Framework/CHIP/templates/MTRBaseClusters.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRBaseClusters.zapt
@@ -16,24 +16,26 @@
  * Cluster {{name}}
  *    {{description}}
  */
-{{#if (isStrEqual (asUpperCamelCase name) "UnitTesting")}}
+{{#unless (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (compatClusterNameRemapping name))}}
 MTR_NEWLY_AVAILABLE
-{{/if}}
-@interface MTRBaseCluster{{asUpperCamelCase name}} : MTRCluster
+{{/unless}}
+@interface MTRBaseCluster{{asUpperCamelCase name preserveAcronyms=true}} : MTRCluster
 
 - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device
                               endpointID:(NSNumber *)endpointID
                                    queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER MTR_NEWLY_AVAILABLE;
 
 {{#chip_cluster_commands}}
-- (void){{asLowerCamelCase name}}WithParams:(MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Params * {{#unless (commandHasRequiredField .)}}_Nullable{{/unless}})params completion:({{>command_completion_type command=.}})completion MTR_NEWLY_AVAILABLE;
+{{#*inline "cluster"}}{{asUpperCamelCase parent.name preserveAcronyms=true}}{{/inline~}}
+{{~#*inline "command"}}{{asUpperCamelCase name preserveAcronyms=true}}{{/inline~}}
+- (void){{asLowerCamelCase name}}WithParams:(MTR{{>cluster}}Cluster{{>command}}Params * {{#unless (commandHasRequiredField .)}}_Nullable{{/unless}})params completion:({{>command_completion_type command=.}})completion MTR_NEWLY_AVAILABLE;
 {{#unless (hasArguments)}}
 - (void){{asLowerCamelCase name}}WithCompletion:({{>command_completion_type command=.}})completion MTR_NEWLY_AVAILABLE;
 {{/unless}}
 {{/chip_cluster_commands}}
 
 {{#chip_server_cluster_attributes}}
-{{#*inline "attribute"}}Attribute{{asUpperCamelCase name}}{{/inline}}
+{{#*inline "attribute"}}Attribute{{asUpperCamelCase name preserveAcronyms=true}}{{/inline}}
 - (void)read{{>attribute}}With
 {{~#if_is_fabric_scoped_struct type~}}
   Params:(MTRReadParams * _Nullable)params completion:
@@ -59,10 +61,15 @@
 
 {{/chip_client_clusters}}
 
-MTR_NEWLY_DEPRECATED("Please use MTRBaseClusterUnitTesting")
-@interface MTRBaseClusterTestCluster : MTRBaseClusterUnitTesting
+{{#chip_client_clusters includeAll=true}}
+{{#unless (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (compatClusterNameRemapping name))}}
+MTR_NEWLY_DEPRECATED("Please use MTRBaseCluster{{asUpperCamelCase name preserveAcronyms=true}}")
+@interface MTRBaseCluster{{compatClusterNameRemapping name}} : MTRBaseCluster{{asUpperCamelCase name preserveAcronyms=true}}
 @end
 
+{{/unless}}
+{{/chip_client_clusters}}
+
 {{#zcl_clusters}}
 {{#zcl_enums}}
 {{#*inline "enumDef"}}
@@ -71,17 +78,17 @@
    {{objCEnumName ../clusterName ../label}}{{objCEnumItemLabel label}} = {{asHex value 2}},
    {{/zcl_enum_items}}
 }
-{{#if (isStrEqual (asUpperCamelCase clusterName) "UnitTesting")}}
-MTR_NEWLY_AVAILABLE
-{{else if (isStrEqual (asUpperCamelCase clusterName) "TestCluster")}}
-MTR_NEWLY_DEPRECATED("Please use {{objCEnumName "UnitTesting" label}}")
-{{/if}}
-;
 {{/inline}}
-{{> enumDef name=name clusterName=../name label=label}}
+{{> enumDef name=name clusterName=(asUpperCamelCase ../name preserveAcronyms=true) label=label}}
+{{#unless (isStrEqual (asUpperCamelCase ../name preserveAcronyms=true) (compatClusterNameRemapping ../name))}}
+MTR_NEWLY_AVAILABLE;
+
+{{> enumDef name=name clusterName=(compatClusterNameRemapping ../name) label=label}}
+MTR_NEWLY_DEPRECATED("Please use {{objCEnumName (asUpperCamelCase ../name preserveAcronyms=true) label}}")
+{{/unless}}
+;
 
 {{#if (isStrEqual (asUpperCamelCase ../name) "UnitTesting")}}
-{{> enumDef name=name clusterName="TestCluster" label=label}}
 
 {{/if}}
 {{/zcl_enums}}
@@ -136,7 +143,7 @@
 {{/chip_cluster_commands}}
 
 {{#chip_server_cluster_attributes}}
-{{!Backwards compat for now: Treat DeviceTypeList as DeviceList.  Ideally we would have both, not just DeviceList. }}
+{{!Backwards compat for now: Treat DeviceTypeList as DeviceList. That's OK, since this is a deprecated API. }}
 {{#*inline "attribute"}}Attribute{{#if (isStrEqual (asUpperCamelCase parent.name) "Descriptor")}}{{#if (isStrEqual (asUpperCamelCase name) "DeviceTypeList")}}DeviceList{{else}}{{asUpperCamelCase name}}{{/if}}{{else}}{{asUpperCamelCase name}}{{/if}}{{/inline}}
 {{! TODO: We need a better setup for the API_AVALABLE annotations here; this does not scale at all sanely. }}
 - (void)read{{>attribute}}With
diff --git a/src/darwin/Framework/CHIP/templates/MTRBaseClusters_internal.zapt b/src/darwin/Framework/CHIP/templates/MTRBaseClusters_internal.zapt
index b341bcf..15fc82e 100644
--- a/src/darwin/Framework/CHIP/templates/MTRBaseClusters_internal.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRBaseClusters_internal.zapt
@@ -9,7 +9,7 @@
 
 {{#chip_client_clusters includeAll=true}}
 
-@interface MTRBaseCluster{{asUpperCamelCase name}} ()
+@interface MTRBaseCluster{{asUpperCamelCase name preserveAcronyms=true}} ()
 @property (nonatomic, strong, readonly) MTRBaseDevice * device;
 @property (nonatomic, assign, readonly) chip::EndpointId endpoint;
 @end
diff --git a/src/darwin/Framework/CHIP/templates/MTRCallbackBridge-src.zapt b/src/darwin/Framework/CHIP/templates/MTRCallbackBridge-src.zapt
index 178a1ec..7025741 100644
--- a/src/darwin/Framework/CHIP/templates/MTRCallbackBridge-src.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRCallbackBridge-src.zapt
@@ -40,13 +40,13 @@
 {{#chip_client_clusters includeAll=true}}
 {{#chip_server_cluster_attributes}}
 {{#if isArray}}
-{{#>MTRCallbackBridge ns=parent.name                                }}{{asUpperCamelCase ../../name}}{{asUpperCamelCase ../name}}ListAttributeCallback{{/MTRCallbackBridge}}
+{{#>MTRCallbackBridge ns=parent.name                                }}{{asUpperCamelCase ../../name preserveAcronyms=true}}{{asUpperCamelCase ../name preserveAcronyms=true}}ListAttributeCallback{{/MTRCallbackBridge}}
 {{else}}
   {{#if_is_struct type}}
-  {{#>MTRCallbackBridge ns=parent.name                              }}{{asUpperCamelCase ../../name}}{{asUpperCamelCase ../name}}StructAttributeCallback{{/MTRCallbackBridge}}
+  {{#>MTRCallbackBridge ns=parent.name                              }}{{asUpperCamelCase ../../name preserveAcronyms=true}}{{asUpperCamelCase ../name preserveAcronyms=true}}StructAttributeCallback{{/MTRCallbackBridge}}
   {{/if_is_struct}}
   {{#if_is_strongly_typed_bitmap type}}
-  {{#>MTRCallbackBridge ns=parent.name                              }}{{asUpperCamelCase ../../name}}{{asUpperCamelCase ../name}}AttributeCallback{{/MTRCallbackBridge}}
+  {{#>MTRCallbackBridge ns=parent.name                              }}{{asUpperCamelCase ../../name preserveAcronyms=true}}{{asUpperCamelCase ../name preserveAcronyms=true}}AttributeCallback{{/MTRCallbackBridge}}
   {{/if_is_strongly_typed_bitmap}}
 {{/if}}
 {{/chip_server_cluster_attributes}}
@@ -54,13 +54,13 @@
 
 {{#chip_client_clusters includeAll=true}}
 {{#chip_cluster_responses}}
-{{#>MTRCallbackBridge partial-type="Command"                        }}{{asUpperCamelCase ../../name}}Cluster{{asUpperCamelCase ../name}}Callback{{/MTRCallbackBridge}}
+{{#>MTRCallbackBridge partial-type="Command"                        }}{{asUpperCamelCase ../../name preserveAcronyms=true}}Cluster{{asUpperCamelCase ../name preserveAcronyms=true}}Callback{{/MTRCallbackBridge}}
 {{/chip_cluster_responses}}
 {{/chip_client_clusters}}
 
 {{#zcl_clusters}}
 {{#zcl_enums}}
-{{#>MTRCallbackBridge type=(asType label) isNullable=false ns=parent.name}}{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}AttributeCallback{{/MTRCallbackBridge}}
-{{#>MTRCallbackBridge type=(asType label) isNullable=true  ns=parent.name}}Nullable{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}AttributeCallback{{/MTRCallbackBridge}}
+{{#>MTRCallbackBridge type=(asType label) isNullable=false ns=parent.name}}{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}AttributeCallback{{/MTRCallbackBridge}}
+{{#>MTRCallbackBridge type=(asType label) isNullable=true  ns=parent.name}}Nullable{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}AttributeCallback{{/MTRCallbackBridge}}
 {{/zcl_enums}}
 {{/zcl_clusters}}
diff --git a/src/darwin/Framework/CHIP/templates/MTRCallbackBridge_internal.zapt b/src/darwin/Framework/CHIP/templates/MTRCallbackBridge_internal.zapt
index 84c1f56..ccddfc9 100644
--- a/src/darwin/Framework/CHIP/templates/MTRCallbackBridge_internal.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRCallbackBridge_internal.zapt
@@ -16,27 +16,27 @@
 
 {{#chip_client_clusters includeAll=true}}
 {{#chip_cluster_responses}}
-typedef void (*{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}CallbackType)(void *, const chip::app::Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase name}}::DecodableType &);
+typedef void (*{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}CallbackType)(void *, const chip::app::Clusters::{{asUpperCamelCase parent.name}}::Commands::{{asUpperCamelCase name}}::DecodableType &);
 {{/chip_cluster_responses}}
 {{/chip_client_clusters}}
 
 {{#zcl_clusters}}
 {{#zcl_enums}}
-typedef void (*{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}AttributeCallback)(void *, chip::app::Clusters::{{asUpperCamelCase parent.name}}::{{asType label}});
-typedef void (*Nullable{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}AttributeCallback)(void *, const chip::app::DataModel::Nullable<chip::app::Clusters::{{asUpperCamelCase parent.name}}::{{asType label}}> &);
+typedef void (*{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}AttributeCallback)(void *, chip::app::Clusters::{{asUpperCamelCase parent.name}}::{{asType label}});
+typedef void (*Nullable{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}AttributeCallback)(void *, const chip::app::DataModel::Nullable<chip::app::Clusters::{{asUpperCamelCase parent.name}}::{{asType label}}> &);
 {{/zcl_enums}}
 {{/zcl_clusters}}
 
 {{#chip_client_clusters includeAll=true}}
 {{#chip_server_cluster_attributes}}
 {{#if isArray}}
-typedef void (*{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}ListAttributeCallback)(void * context, {{zapTypeToDecodableClusterObjectType type ns=parent.name isArgument=true}} data);
+typedef void (*{{asUpperCamelCase parent.name preserveAcronyms=true}}{{asUpperCamelCase name preserveAcronyms=true}}ListAttributeCallback)(void * context, {{zapTypeToDecodableClusterObjectType type ns=parent.name isArgument=true}} data);
 {{else}}
 {{#if_is_struct type}}
-typedef void (*{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}StructAttributeCallback)(void *, {{zapTypeToDecodableClusterObjectType type ns=parent.name isArgument=true forceNotOptional=true}});
+typedef void (*{{asUpperCamelCase parent.name preserveAcronyms=true}}{{asUpperCamelCase name preserveAcronyms=true}}StructAttributeCallback)(void *, {{zapTypeToDecodableClusterObjectType type ns=parent.name isArgument=true forceNotOptional=true}});
 {{/if_is_struct}}
 {{#if_is_strongly_typed_bitmap type}}
-typedef void (*{{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}AttributeCallback)(void *, {{zapTypeToDecodableClusterObjectType type ns=parent.name isArgument=true forceNotOptional=true}});
+typedef void (*{{asUpperCamelCase parent.name preserveAcronyms=true}}{{asUpperCamelCase name preserveAcronyms=true}}AttributeCallback)(void *, {{zapTypeToDecodableClusterObjectType type ns=parent.name isArgument=true forceNotOptional=true}});
 {{/if_is_strongly_typed_bitmap}}
 {{/if}}
 {{/chip_server_cluster_attributes}}
@@ -76,13 +76,13 @@
 {{#chip_client_clusters includeAll=true}}
 {{#chip_server_cluster_attributes}}
 {{#if isArray}}
-{{#>MTRCallbackBridge header="1" ns=parent.name                                }}{{asUpperCamelCase ../../name}}{{asUpperCamelCase ../name}}ListAttributeCallback{{/MTRCallbackBridge}}
+{{#>MTRCallbackBridge header="1" ns=parent.name                                }}{{asUpperCamelCase ../../name preserveAcronyms=true}}{{asUpperCamelCase ../name preserveAcronyms=true}}ListAttributeCallback{{/MTRCallbackBridge}}
 {{else}}
   {{#if_is_struct type}}
-  {{#>MTRCallbackBridge header="1" ns=parent.name                              }}{{asUpperCamelCase ../../name}}{{asUpperCamelCase ../name}}StructAttributeCallback{{/MTRCallbackBridge}}
+  {{#>MTRCallbackBridge header="1" ns=parent.name                              }}{{asUpperCamelCase ../../name preserveAcronyms=true}}{{asUpperCamelCase ../name preserveAcronyms=true}}StructAttributeCallback{{/MTRCallbackBridge}}
   {{/if_is_struct}}
   {{#if_is_strongly_typed_bitmap type}}
-  {{#>MTRCallbackBridge header="1" ns=parent.name                              }}{{asUpperCamelCase ../../name}}{{asUpperCamelCase ../name}}AttributeCallback{{/MTRCallbackBridge}}
+  {{#>MTRCallbackBridge header="1" ns=parent.name                              }}{{asUpperCamelCase ../../name preserveAcronyms=true}}{{asUpperCamelCase ../name preserveAcronyms=true}}AttributeCallback{{/MTRCallbackBridge}}
   {{/if_is_strongly_typed_bitmap}}
 {{/if}}
 {{/chip_server_cluster_attributes}}
@@ -90,13 +90,13 @@
 
 {{#chip_client_clusters includeAll=true}}
 {{#chip_cluster_responses}}
-{{#>MTRCallbackBridge header="1" partial-type="Command"                        }}{{asUpperCamelCase ../../name}}Cluster{{asUpperCamelCase ../name}}Callback{{/MTRCallbackBridge}}
+{{#>MTRCallbackBridge header="1" partial-type="Command"                        }}{{asUpperCamelCase ../../name preserveAcronyms=true}}Cluster{{asUpperCamelCase ../name preserveAcronyms=true}}Callback{{/MTRCallbackBridge}}
 {{/chip_cluster_responses}}
 {{/chip_client_clusters}}
 
 {{#zcl_clusters}}
 {{#zcl_enums}}
-{{#>MTRCallbackBridge header="1" type=(asType label) isNullable=false ns=parent.name}}{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}AttributeCallback{{/MTRCallbackBridge}}
-{{#>MTRCallbackBridge header="1" type=(asType label) isNullable=true  ns=parent.name}}Nullable{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}AttributeCallback{{/MTRCallbackBridge}}
+{{#>MTRCallbackBridge header="1" type=(asType label) isNullable=false ns=parent.name}}{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}AttributeCallback{{/MTRCallbackBridge}}
+{{#>MTRCallbackBridge header="1" type=(asType label) isNullable=true  ns=parent.name}}Nullable{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}AttributeCallback{{/MTRCallbackBridge}}
 {{/zcl_enums}}
 {{/zcl_clusters}}
diff --git a/src/darwin/Framework/CHIP/templates/MTRClusterConstants.zapt b/src/darwin/Framework/CHIP/templates/MTRClusterConstants.zapt
index 1f93d4b..0fdc8eb 100644
--- a/src/darwin/Framework/CHIP/templates/MTRClusterConstants.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRClusterConstants.zapt
@@ -10,7 +10,8 @@
 MTRCluster{{compatClusterNameRemapping label}}ID MTR_NEWLY_DEPRECATED("Please use MTRClusterIDType{{asUpperCamelCase label}}ID")= {{asMEI manufacturerCode code}},
 {{/zcl_clusters}}
 {{#zcl_clusters}}
-MTRClusterIDType{{asUpperCamelCase label}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
+{{~#*inline "cluster"}}{{asUpperCamelCase label preserveAcronyms=true}}{{/inline~}}
+MTRClusterIDType{{>cluster}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
 {{/zcl_clusters}}
 };
 
@@ -28,8 +29,9 @@
 
 // Global attributes
 {{#zcl_attributes_server}}
+{{~#*inline "attribute"}}{{asUpperCamelCase label preserveAcronyms=true}}{{/inline~}}
 {{#unless clusterRef}}
-MTRAttributeIDTypeGlobalAttribute{{asUpperCamelCase label}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
+MTRAttributeIDTypeGlobalAttribute{{>attribute}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
 {{/unless}}
 {{/zcl_attributes_server}}
 
@@ -63,13 +65,15 @@
 {{/last}}
 {{/zcl_attributes_server}}
 {{#zcl_attributes_server}}
+{{~#*inline "cluster"}}{{asUpperCamelCase ../clusterName preserveAcronyms=true}}{{/inline~}}
+{{~#*inline "attribute"}}{{asUpperCamelCase label preserveAcronyms=true}}{{/inline~}}
 {{#first}}
-// Cluster {{asUpperCamelCase ../clusterName}} attributes
+// Cluster {{> cluster}} attributes
 {{/first}}
 {{#if clusterRef}}
-MTRAttributeIDTypeCluster{{asUpperCamelCase parent.label}}Attribute{{asUpperCamelCase label}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
+MTRAttributeIDTypeCluster{{>cluster}}Attribute{{>attribute}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
 {{else}}
-MTRAttributeIDTypeCluster{{asUpperCamelCase ../clusterName}}Attribute{{asUpperCamelCase label}}ID MTR_NEWLY_AVAILABLE= MTRAttributeIDTypeGlobalAttribute{{asUpperCamelCase label}}ID,
+MTRAttributeIDTypeCluster{{>cluster}}Attribute{{>attribute}}ID MTR_NEWLY_AVAILABLE= MTRAttributeIDTypeGlobalAttribute{{asUpperCamelCase label}}ID,
 {{/if}}
 {{#last}}
 
@@ -98,10 +102,12 @@
 {{/last}}
 {{/zcl_commands}}
 {{#zcl_commands}}
+{{~#*inline "cluster"}}{{asUpperCamelCase ../clusterName preserveAcronyms=true}}{{/inline~}}
+{{~#*inline "command"}}{{asUpperCamelCase label preserveAcronyms=true}}{{/inline~}}
 {{#first}}
-// Cluster {{asUpperCamelCase ../clusterName}} commands
+// Cluster {{>cluster}} commands
 {{/first}}
-MTRCommandIDTypeCluster{{asUpperCamelCase ../clusterName}}Command{{asUpperCamelCase label}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
+MTRCommandIDTypeCluster{{>cluster}}Command{{>command}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
 {{#last}}
 
 {{/last}}
@@ -129,10 +135,12 @@
 {{/last}}
 {{/zcl_events}}
 {{#zcl_events}}
+{{~#*inline "cluster"}}{{asUpperCamelCase ../clusterName preserveAcronyms=true}}{{/inline~}}
+{{~#*inline "event"}}{{asUpperCamelCase name preserveAcronyms=true}}{{/inline~}}
 {{#first}}
-// Cluster {{asUpperCamelCase ../clusterName}} events
+// Cluster {{>cluster}} events
 {{/first}}
-MTREventIDTypeCluster{{asUpperCamelCase ../clusterName}}Event{{asUpperCamelCase name}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
+MTREventIDTypeCluster{{>cluster}}Event{{>event}}ID MTR_NEWLY_AVAILABLE = {{asMEI manufacturerCode code}},
 {{#last}}
 
 {{/last}}
diff --git a/src/darwin/Framework/CHIP/templates/MTRClusters-src.zapt b/src/darwin/Framework/CHIP/templates/MTRClusters-src.zapt
index 6c4c010..a2f0993 100644
--- a/src/darwin/Framework/CHIP/templates/MTRClusters-src.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRClusters-src.zapt
@@ -26,7 +26,7 @@
 
 // NOLINTBEGIN(clang-analyzer-cplusplus.NewDeleteLeaks): Linter is unable to locate the delete on these objects.
 {{#chip_client_clusters includeAll=true}}
-@implementation MTRCluster{{asUpperCamelCase name}}
+@implementation MTRCluster{{asUpperCamelCase name preserveAcronyms=true}}
 
 - (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
 {
@@ -44,14 +44,15 @@
 }
 
 {{#chip_cluster_commands}}
-{{#*inline "callbackName"}}{{#if hasSpecificResponse}}{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase responseName}}{{else}}CommandSuccess{{/if}}{{/inline}}
+{{#*inline "cluster"}}{{asUpperCamelCase parent.name preserveAcronyms=true}}{{/inline}}
+{{#*inline "callbackName"}}{{#if hasSpecificResponse}}{{>cluster}}Cluster{{asUpperCamelCase responseName preserveAcronyms=true}}{{else}}CommandSuccess{{/if}}{{/inline}}
 {{#unless (hasArguments)}}
 - (void){{asLowerCamelCase name}}WithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues expectedValueInterval:(NSNumber *)expectedValueIntervalMs completion:({{>command_completion_type command=.}})completion
 {
   [self {{asLowerCamelCase name}}WithParams:nil expectedValues:expectedValues expectedValueInterval:expectedValueIntervalMs completion:completion];
 }
 {{/unless}}
-- (void){{asLowerCamelCase name}}WithParams: (MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Params * {{#unless (commandHasRequiredField .)}}_Nullable{{/unless}})params expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues expectedValueInterval:(NSNumber *)expectedValueIntervalMs completion:({{>command_completion_type command=.}})completion
+- (void){{asLowerCamelCase name}}WithParams: (MTR{{>cluster}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Params * {{#unless (commandHasRequiredField .)}}_Nullable{{/unless}})params expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues expectedValueInterval:(NSNumber *)expectedValueIntervalMs completion:({{>command_completion_type command=.}})completion
 {
     // Make a copy of params before we go async.
     params = [params copy];
@@ -125,10 +126,10 @@
 {{/chip_cluster_commands}}
 
 {{#chip_server_cluster_attributes}}
-{{!Backwards compat for now: Treat DeviceTypeList as DeviceList.  Ideally we would have both, not just DeviceList. }}
-{{#*inline "attribute"}}Attribute{{#if (isStrEqual (asUpperCamelCase parent.name) "Descriptor")}}{{#if (isStrEqual (asUpperCamelCase name) "DeviceTypeList")}}DeviceList{{else}}{{asUpperCamelCase name}}{{/if}}{{else}}{{asUpperCamelCase name}}{{/if}}{{/inline}}
+{{#*inline "cluster"}}{{asUpperCamelCase parent.name preserveAcronyms=true}}{{/inline}}
+{{#*inline "attribute"}}Attribute{{asUpperCamelCase name preserveAcronyms=true}}{{/inline}}
 - (NSDictionary<NSString *, id> *)read{{>attribute}}WithParams:(MTRReadParams * _Nullable)params {
-    return [self.device readAttributeWithEndpointID:@(_endpoint) clusterID:@(MTRClusterIDType{{asUpperCamelCase parent.name}}ID) attributeID:@(MTRAttributeIDTypeCluster{{asUpperCamelCase parent.name}}Attribute{{asUpperCamelCase name}}ID) params:params];
+    return [self.device readAttributeWithEndpointID:@(_endpoint) clusterID:@(MTRClusterIDType{{>cluster}}ID) attributeID:@(MTRAttributeIDTypeCluster{{>cluster}}{{>attribute}}ID) params:params];
 }
 
 {{#if isWritableAttribute}}
@@ -146,7 +147,7 @@
     }
     {{/if}}
 
-    [self.device writeAttributeWithEndpointID:@(_endpoint) clusterID:@(MTRClusterIDType{{asUpperCamelCase parent.name}}ID) attributeID:@(MTRAttributeIDTypeCluster{{asUpperCamelCase parent.name}}Attribute{{asUpperCamelCase name}}ID) value:dataValueDictionary expectedValueInterval:expectedValueIntervalMs timedWriteTimeout:timedWriteTimeout];
+    [self.device writeAttributeWithEndpointID:@(_endpoint) clusterID:@(MTRClusterIDType{{>cluster}}ID) attributeID:@(MTRAttributeIDTypeCluster{{>cluster}}{{>attribute}}ID) value:dataValueDictionary expectedValueInterval:expectedValueIntervalMs timedWriteTimeout:timedWriteTimeout];
 }
 
 {{/if}}
@@ -154,11 +155,11 @@
 {{/chip_server_cluster_attributes}}
 
 @end
-{{#if (isStrEqual (asUpperCamelCase name) "UnitTesting")}}
+{{#unless (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (compatClusterNameRemapping name))}}
 
-@implementation MTRClusterTestCluster
+@implementation MTRCluster{{compatClusterNameRemapping name}}
 @end
-{{/if}}
+{{/unless}}
 
 @implementation MTRCluster{{compatClusterNameRemapping name}} (Deprecated)
 
@@ -172,7 +173,7 @@
 {
   [self {{asLowerCamelCase name}}WithParams:params expectedValues:expectedDataValueDictionaries expectedValueInterval:expectedValueIntervalMs completion:
       {{#if hasSpecificResponse}}
-    ^(MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase responseName}}Params * _Nullable data, NSError * _Nullable error) {
+    ^(MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase responseName preserveAcronyms=true}}Params * _Nullable data, NSError * _Nullable error) {
       // Cast is safe because subclass does not add any selectors.
       completionHandler(static_cast<MTR{{compatClusterNameRemapping parent.name}}Cluster{{asUpperCamelCase responseName}}Params *>(data), error);
     }
@@ -188,6 +189,35 @@
 }
 {{/unless}}
 {{/chip_cluster_commands}}
+{{~#chip_server_cluster_attributes}}
+{{~!Backwards compat for now: Treat DeviceTypeList as DeviceList.  That's OK, since all these bits are deprecated. ~}}
+{{~#*inline "attribute"}}Attribute{{#if (isStrEqual (asUpperCamelCase parent.name) "Descriptor")}}{{#if (isStrEqual (asUpperCamelCase name) "DeviceTypeList")}}DeviceList{{else}}{{asUpperCamelCase name}}{{/if}}{{else}}{{asUpperCamelCase name}}{{/if}}{{/inline~}}
+{{~#*inline "attributeImpls"}}
+- (NSDictionary<NSString *, id> *)read{{>attribute}}WithParams:(MTRReadParams * _Nullable)params
+{
+  return [self readAttribute{{asUpperCamelCase name preserveAcronyms=true}}WithParams:params];
+}
+{{#if isWritableAttribute}}
+- (void)write{{>attribute}}WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+{
+  [self writeAttribute{{asUpperCamelCase name preserveAcronyms=true}}WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs];
+}
+- (void)write{{>attribute}}WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params
+{
+  [self writeAttribute{{asUpperCamelCase name preserveAcronyms=true}}WithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:params];
+}
+{{/if}}
+{{/inline~}}
+{{#if (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (asUpperCamelCase name))}}
+  {{#if (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) "Descriptor")}}
+    {{#if (isStrEqual (asUpperCamelCase name preserveAcronyms=true) "DeviceTypeList")}}
+      {{> attributeImpls}}
+    {{/if}}
+  {{/if}}
+{{else}}
+  {{> attributeImpls}}
+{{/if}}
+{{/chip_server_cluster_attributes}}
 @end
 
 {{/chip_client_clusters}}
diff --git a/src/darwin/Framework/CHIP/templates/MTRClusters.zapt b/src/darwin/Framework/CHIP/templates/MTRClusters.zapt
index fd58638..f087866 100644
--- a/src/darwin/Framework/CHIP/templates/MTRClusters.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRClusters.zapt
@@ -16,30 +16,42 @@
  * Cluster {{name}}
  *    {{description}}
  */
-{{#if (isStrEqual (asUpperCamelCase name) "UnitTesting")}}
+{{#unless (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (compatClusterNameRemapping name))}}
 MTR_NEWLY_AVAILABLE
-{{/if}}
-@interface MTRCluster{{asUpperCamelCase name}} : MTRCluster
+{{/unless}}
+@interface MTRCluster{{asUpperCamelCase name preserveAcronyms=true}} : MTRCluster
 
 - (instancetype _Nullable)initWithDevice:(MTRDevice *)device
                               endpointID:(NSNumber *)endpointID
                                    queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER MTR_NEWLY_AVAILABLE;
 
 {{#chip_cluster_commands}}
-- (void){{asLowerCamelCase name}}WithParams:(MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Params * {{#unless (commandHasRequiredField .)}}_Nullable{{/unless}})params expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:({{>command_completion_type command=.}})completion MTR_NEWLY_AVAILABLE;
+{{~#*inline "cluster"}}{{asUpperCamelCase parent.name preserveAcronyms=true}}{{/inline~}}
+{{~#*inline "command"}}{{asUpperCamelCase name preserveAcronyms=true}}{{/inline~}}
+- (void){{asLowerCamelCase name}}WithParams:(MTR{{>cluster}}Cluster{{>command}}Params * {{#unless (commandHasRequiredField .)}}_Nullable{{/unless}})params expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:({{>command_completion_type command=.}})completion MTR_NEWLY_AVAILABLE;
 {{#unless (hasArguments)}}
 - (void){{asLowerCamelCase name}}WithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues expectedValueInterval:(NSNumber *)expectedValueIntervalMs completion:({{>command_completion_type command=.}})completion MTR_NEWLY_AVAILABLE;
 {{/unless}}
 {{/chip_cluster_commands}}
 
 {{#chip_server_cluster_attributes}}
-{{!Backwards compat for now: Treat DeviceTypeList as DeviceList.  Ideally we would have both, not just DeviceList. }}
-{{#*inline "attribute"}}Attribute{{#if (isStrEqual (asUpperCamelCase parent.name) "Descriptor")}}{{#if (isStrEqual (asUpperCamelCase name) "DeviceTypeList")}}DeviceList{{else}}{{asUpperCamelCase name}}{{/if}}{{else}}{{asUpperCamelCase name}}{{/if}}{{/inline}}
-{{! TODO: We need a better setup for the API_AVALABLE annotations here; this does not scale at all sanely. }}
-- (NSDictionary<NSString *, id> *)read{{>attribute}}WithParams:(MTRReadParams * _Nullable)params {{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}{{#if (isStrEqual (asUpperCamelCase name) "WriteOnlyInt8u")}}API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)){{/if}}{{/if}};
+{{#*inline "attribute"}}Attribute{{asUpperCamelCase name preserveAcronyms=true}}{{/inline}}
+{{#*inline "availability"}}
+{{#if (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (asUpperCamelCase name))}}
+  {{#if (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) "Descriptor")}}
+    {{#if (isStrEqual (asUpperCamelCase name preserveAcronyms=true) "DeviceTypeList")}}
+      MTR_NEWLY_AVAILABLE
+    {{/if}}
+  {{/if}}
+{{else}}
+  MTR_NEWLY_AVAILABLE
+{{/if}}
+{{/inline}}
+{{! TODO: We need a better setup for the API_AVAILABLE annotations here; this does not scale at all sanely. }}
+- (NSDictionary<NSString *, id> *)read{{>attribute}}WithParams:(MTRReadParams * _Nullable)params {{> availability}};
 {{#if isWritableAttribute}}
-- (void)write{{>attribute}}WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs {{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}{{#if (isStrEqual (asUpperCamelCase name) "WriteOnlyInt8u")}}API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)){{/if}}{{/if}};
-- (void)write{{>attribute}}WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params {{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}{{#if (isStrEqual (asUpperCamelCase name) "WriteOnlyInt8u")}}API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)){{/if}}{{/if}};
+- (void)write{{>attribute}}WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs {{> availability}};
+- (void)write{{>attribute}}WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params {{> availability}};
 {{/if}}
 {{/chip_server_cluster_attributes}}
 
@@ -50,10 +62,15 @@
 
 {{/chip_client_clusters}}
 
-MTR_NEWLY_DEPRECATED("Please use MTRClusterUnitTesting")
-@interface MTRClusterTestCluster : MTRClusterUnitTesting
+{{#chip_client_clusters includeAll=true}}
+{{#unless (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (compatClusterNameRemapping name))}}
+MTR_NEWLY_DEPRECATED("Please use MTRCluster{{asUpperCamelCase name preserveAcronyms=true}}")
+@interface MTRCluster{{compatClusterNameRemapping name}} : MTRCluster{{asUpperCamelCase name preserveAcronyms=true}}
 @end
 
+{{/unless}}
+{{/chip_client_clusters}}
+
 {{#chip_client_clusters includeAll=true}}
 @interface MTRCluster{{compatClusterNameRemapping name}} (Deprecated)
 
@@ -67,6 +84,27 @@
 - (void){{asLowerCamelCase name}}WithExpectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues expectedValueInterval:(NSNumber *)expectedValueIntervalMs completionHandler:({{>command_completion_type command=. compatRemapClusterName=true}})completionHandler MTR_NEWLY_DEPRECATED("Please use {{asLowerCamelCase name}}WithExpectedValues:expectedValueIntervalMs:completion:");
 {{/unless}}
 {{/chip_cluster_commands}}
+{{~#chip_server_cluster_attributes}}
+{{~!Backwards compat for now: Treat DeviceTypeList as DeviceList.  That's OK, since all these bits are deprecated. ~}}
+{{~#*inline "attribute"}}Attribute{{#if (isStrEqual (asUpperCamelCase parent.name) "Descriptor")}}{{#if (isStrEqual (asUpperCamelCase name) "DeviceTypeList")}}DeviceList{{else}}{{asUpperCamelCase name}}{{/if}}{{else}}{{asUpperCamelCase name}}{{/if}}{{/inline~}}
+{{~! TODO: We need a better setup for the API_AVAILABLE annotations here; this does not scale at all sanely. ~}}
+{{~#*inline "attributeDecls"}}
+- (NSDictionary<NSString *, id> *)read{{>attribute}}WithParams:(MTRReadParams * _Nullable)params {{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}{{#if (isStrEqual (asUpperCamelCase name) "WriteOnlyInt8u")}}API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)){{/if}}{{/if}} MTR_NEWLY_DEPRECATED("Please use readAttribute{{asUpperCamelCase name preserveAcronyms=true}}WithParams on MTRCluster{{asUpperCamelCase parent.name preserveAcronyms=true}}");
+{{#if isWritableAttribute}}
+- (void)write{{>attribute}}WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs {{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}{{#if (isStrEqual (asUpperCamelCase name) "WriteOnlyInt8u")}}API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)){{/if}}{{/if}} MTR_NEWLY_DEPRECATED("Please use writeAtribute{{asUpperCamelCase name preserveAcronyms=true}}WithValue on MTRCluster{{asUpperCamelCase parent.name preserveAcronyms=true}}");
+- (void)write{{>attribute}}WithValue:(NSDictionary<NSString *, id> *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params {{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}{{#if (isStrEqual (asUpperCamelCase name) "WriteOnlyInt8u")}}API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)){{/if}}{{/if}} MTR_NEWLY_DEPRECATED("Please use writeAttribute{{asUpperCamelCase name preserveAcronyms=true}}WithValue on MTRCluster{{asUpperCamelCase parent.name preserveAcronyms=true}}");
+{{/if}}
+{{/inline~}}
+{{#if (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (asUpperCamelCase name))}}
+  {{#if (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) "Descriptor")}}
+    {{#if (isStrEqual (asUpperCamelCase name preserveAcronyms=true) "DeviceTypeList")}}
+      {{> attributeDecls}}
+    {{/if}}
+  {{/if}}
+{{else}}
+  {{> attributeDecls}}
+{{/if}}
+{{/chip_server_cluster_attributes}}
 @end
 
 {{/chip_client_clusters}}
diff --git a/src/darwin/Framework/CHIP/templates/MTRClusters_internal.zapt b/src/darwin/Framework/CHIP/templates/MTRClusters_internal.zapt
index f809ff4..ccad7c4 100644
--- a/src/darwin/Framework/CHIP/templates/MTRClusters_internal.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRClusters_internal.zapt
@@ -10,7 +10,7 @@
 
 {{#chip_client_clusters includeAll=true}}
 
-@interface MTRCluster{{asUpperCamelCase name}} ()
+@interface MTRCluster{{asUpperCamelCase name preserveAcronyms=true}} ()
 @property (nonatomic, readonly) uint16_t endpoint;
 @property (nonatomic, readonly) MTRDevice *device;
 @end
diff --git a/src/darwin/Framework/CHIP/templates/MTRCommandPayloadsObjc-src.zapt b/src/darwin/Framework/CHIP/templates/MTRCommandPayloadsObjc-src.zapt
index 55b806d..c2d4fe1 100644
--- a/src/darwin/Framework/CHIP/templates/MTRCommandPayloadsObjc-src.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRCommandPayloadsObjc-src.zapt
@@ -6,7 +6,7 @@
 
 {{#zcl_clusters}}
 {{#zcl_commands}}
-@implementation MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Params
+@implementation MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Params
 - (instancetype)init
 {
   if (self = [super init]) {
@@ -21,7 +21,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 {
-  auto other = [[MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Params alloc] init];
+  auto other = [[MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Params alloc] init];
 
   {{#zcl_command_arguments}}
   other.{{asStructPropertyName label}} = self.{{asStructPropertyName label}};
@@ -38,11 +38,18 @@
 }
 
 @end
-{{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}
+{{#*inline "deprecatedImpl"}}
 
-@implementation MTRTestClusterCluster{{asUpperCamelCase name}}Params
+@implementation MTR{{compatClusterNameRemapping parent.name}}Cluster{{asUpperCamelCase name}}Params
 @end
-{{/if}}
+{{/inline}}
+{{#unless (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) (compatClusterNameRemapping parent.name))}}
+{{> deprecatedImpl}}
+{{else}}
+{{#unless (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (asUpperCamelCase name))}}
+{{> deprecatedImpl}}
+{{/unless}}
+{{/unless}}
 {{/zcl_commands}}
 {{/zcl_clusters}}
 
diff --git a/src/darwin/Framework/CHIP/templates/MTRCommandPayloadsObjc.zapt b/src/darwin/Framework/CHIP/templates/MTRCommandPayloadsObjc.zapt
index 3fab331..e7190cc 100644
--- a/src/darwin/Framework/CHIP/templates/MTRCommandPayloadsObjc.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRCommandPayloadsObjc.zapt
@@ -7,10 +7,14 @@
 
 {{#zcl_clusters}}
 {{#zcl_commands}}
-{{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}
+{{#unless (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) (compatClusterNameRemapping parent.name))}}
 MTR_NEWLY_AVAILABLE
-{{/if}}
-@interface MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Params : NSObject <NSCopying>
+{{else}}
+{{#unless (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (asUpperCamelCase name))}}
+MTR_NEWLY_AVAILABLE
+{{/unless}}
+{{/unless}}
+@interface MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Params : NSObject <NSCopying>
 {{#zcl_command_arguments}}
 
 {{! Override the getter name because some of our properties start with things
@@ -36,13 +40,20 @@
 - (instancetype)init;
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
-{{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}
+{{#*inline "deprecatedDecl"}}
 
-MTR_NEWLY_DEPRECATED("Please use MTRUnitTestingCluster{{asUpperCamelCase name}}Params")
-@interface MTRTestClusterCluster{{asUpperCamelCase name}}Params : MTRUnitTestingCluster{{asUpperCamelCase name}}Params
+MTR_NEWLY_DEPRECATED("Please use MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Params")
+@interface MTR{{compatClusterNameRemapping parent.name}}Cluster{{asUpperCamelCase name}}Params : MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name}}Params
 @end
 
-{{/if}}
+{{/inline}}
+{{#unless (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) (compatClusterNameRemapping parent.name))}}
+{{> deprecatedDecl}}
+{{else}}
+{{#unless (isStrEqual (asUpperCamelCase name preserveAcronyms=true) (asUpperCamelCase name))}}
+{{> deprecatedDecl}}
+{{/unless}}
+{{/unless}}
 {{/zcl_commands}}
 {{/zcl_clusters}}
 
diff --git a/src/darwin/Framework/CHIP/templates/MTREventTLVValueDecoder-src.zapt b/src/darwin/Framework/CHIP/templates/MTREventTLVValueDecoder-src.zapt
index 0d6b38c..14a052b 100644
--- a/src/darwin/Framework/CHIP/templates/MTREventTLVValueDecoder-src.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTREventTLVValueDecoder-src.zapt
@@ -38,7 +38,7 @@
                 return nil;
             }
 
-            MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Event *value = [MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Event new];
+            __auto_type *value = [MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Event new];
 
             {{#zcl_event_fields}}
             do {
diff --git a/src/darwin/Framework/CHIP/templates/MTRStructsObjc-src.zapt b/src/darwin/Framework/CHIP/templates/MTRStructsObjc-src.zapt
index fe5a9a1..83f1183 100644
--- a/src/darwin/Framework/CHIP/templates/MTRStructsObjc-src.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRStructsObjc-src.zapt
@@ -38,22 +38,24 @@
 @end
 {{/inline}}
 
-{{> interfaceImpl interfaceName=(concat "MTR" (asUpperCamelCase parent.name) "Cluster" (asUpperCamelCase name))}}
+{{> interfaceImpl interfaceName=(concat "MTR" (asUpperCamelCase parent.name preserveAcronyms=true) "Cluster" (asUpperCamelCase name preserveAcronyms=true))}}
 
 {{!Backwards compat for now: Add a DeviceType thing that is API-compatible with DeviceTypeStruct. }}
 {{#if (isStrEqual (asUpperCamelCase parent.name) "Descriptor")}}
 {{#if (isStrEqual (asUpperCamelCase name) "DeviceTypeStruct")}}
 {{> interfaceImpl interfaceName="MTRDescriptorClusterDeviceType"}}
 {{/if}}
-{{else if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}
-@implementation MTRTestClusterCluster{{asUpperCamelCase name}} : MTRUnitTestingCluster{{asUpperCamelCase name}}
+{{else}}
+{{#unless (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) (compatClusterNameRemapping parent.name))}}
+@implementation MTR{{compatClusterNameRemapping parent.name}}Cluster{{asUpperCamelCase name}} : MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}
 @end
+{{/unless}}
 {{/if}}
 
 {{/zcl_structs}}
 
 {{#zcl_events}}
-@implementation MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Event
+@implementation MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Event
 - (instancetype)init
 {
   if (self = [super init]) {
@@ -66,7 +68,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone
 {
-  auto other = [[MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Event alloc] init];
+  auto other = [[MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Event alloc] init];
 
   {{#zcl_event_fields}}
   other.{{asStructPropertyName name}} = self.{{asStructPropertyName name}};
@@ -82,11 +84,11 @@
 }
 
 @end
-{{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}
+{{#unless (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) (compatClusterNameRemapping parent.name))}}
 
-@implementation MTRTestClusterCluster{{asUpperCamelCase name}}Event : MTRUnitTestingCluster{{asUpperCamelCase name}}Event
+@implementation MTR{{compatClusterNameRemapping parent.name}}Cluster{{asUpperCamelCase name}}Event : MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Event
 @end
-{{/if}}
+{{/unless}}
 
 {{/zcl_events}}
 
diff --git a/src/darwin/Framework/CHIP/templates/MTRStructsObjc.zapt b/src/darwin/Framework/CHIP/templates/MTRStructsObjc.zapt
index 20dd283..2a34748 100644
--- a/src/darwin/Framework/CHIP/templates/MTRStructsObjc.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRStructsObjc.zapt
@@ -21,10 +21,12 @@
 {{#if (isStrEqual (asUpperCamelCase name) "DeviceTypeStruct")}}
 API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2))
 {{/if}}
-{{else if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}
+{{else}}
+{{#unless (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) (compatClusterNameRemapping parent.name))}}
 MTR_NEWLY_AVAILABLE
+{{/unless}}
 {{/if}}
-@interface MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}} : NSObject <NSCopying>
+@interface MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}} : NSObject <NSCopying>
 {{> interfaceDecl}}
 @end
 
@@ -35,18 +37,20 @@
 {{> interfaceDecl}}
 @end
 {{/if}}
-{{else if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}
-MTR_NEWLY_DEPRECATED("Please use MTRUnitTestingCluster{{asUpperCamelCase name}}")
-@interface MTRTestClusterCluster{{asUpperCamelCase name}} : MTRUnitTestingCluster{{asUpperCamelCase name}}
+{{else}}
+{{#unless (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) (compatClusterNameRemapping parent.name))}}
+MTR_NEWLY_DEPRECATED("Please use MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}")
+@interface MTR{{compatClusterNameRemapping parent.name}}Cluster{{asUpperCamelCase name}} : MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name}}
 @end
+{{/unless}}
 {{/if}}
 {{/zcl_structs}}
 
 {{#zcl_events}}
-{{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}
+{{#unless (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) (compatClusterNameRemapping parent.name))}}
 MTR_NEWLY_AVAILABLE
-{{/if}}
-@interface MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Event : NSObject <NSCopying>
+{{/unless}}
+@interface MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Event : NSObject <NSCopying>
 {{#zcl_event_fields}}
 @property (nonatomic, copy{{#unless (isStrEqual (asGetterName name) (asStructPropertyName name))}}, getter={{asGetterName name}}{{/unless}}) {{asObjectiveCType type parent.parent.name}} {{asStructPropertyName name}};
 {{/zcl_event_fields}}
@@ -54,12 +58,12 @@
 - (instancetype)init;
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
-{{#if (isStrEqual (asUpperCamelCase parent.name) "UnitTesting")}}
+{{#unless (isStrEqual (asUpperCamelCase parent.name preserveAcronyms=true) (compatClusterNameRemapping parent.name))}}
 
-MTR_NEWLY_DEPRECATED("Please use MTRUnitTestingCluster{{asUpperCamelCase name}}Event")
-@interface MTRTestClusterCluster{{asUpperCamelCase name}}Event : MTRUnitTestingCluster{{asUpperCamelCase name}}Event
+MTR_NEWLY_DEPRECATED("Please use MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Event")
+@interface MTR{{compatClusterNameRemapping parent.name}}Cluster{{asUpperCamelCase name}}Event : MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Event
 @end
-{{/if}}
+{{/unless}}
 
 {{/zcl_events}}
 
diff --git a/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt b/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt
index 91e9139..71f74df 100644
--- a/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt
+++ b/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt
@@ -77,7 +77,7 @@
       {{#if (isStrEqual partial-type "Status")}}
       DispatchSuccess(context, nil);
       {{else if (isStrEqual partial-type "Command")}}
-      auto * response = [MTR{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}Params new];
+      auto * response = [MTR{{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase name preserveAcronyms=true}}Params new];
       {{#chip_cluster_response_arguments}}
       {
         {{>decode_value target=(concat "response." (asStructPropertyName label)) source=(concat "data." (asLowerCamelCase label)) cluster=parent.parent.name errorCode="OnFailureFn(context, err); return;" depth=0}}
diff --git a/src/darwin/Framework/CHIP/templates/partials/attribute_data_callback_name.zapt b/src/darwin/Framework/CHIP/templates/partials/attribute_data_callback_name.zapt
index 385e4af..28ec591 100644
--- a/src/darwin/Framework/CHIP/templates/partials/attribute_data_callback_name.zapt
+++ b/src/darwin/Framework/CHIP/templates/partials/attribute_data_callback_name.zapt
@@ -1,22 +1,22 @@
 {{~#if isArray~}}
-  {{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}List
+  {{asUpperCamelCase parent.name preserveAcronyms=true}}{{asUpperCamelCase name preserveAcronyms=true}}List
 {{~else~}}
   {{~#if_is_struct type~}}
     {{~! Structs are not used as types of attributes much, so it's
          less code to generate the callbacks on a per-attribute basis
          than a per-struct-type basis. ~}}
-    {{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}Struct
+    {{asUpperCamelCase parent.name preserveAcronyms=true}}{{asUpperCamelCase name preserveAcronyms=true}}Struct
   {{~else if_is_strongly_typed_bitmap type~}}
-      {{asUpperCamelCase parent.name}}{{asUpperCamelCase name}}
+      {{asUpperCamelCase parent.name preserveAcronyms=true}}{{asUpperCamelCase name preserveAcronyms=true}}
   {{~else~}}
     {{~#if isNullable}}Nullable{{/if~}}
     {{~#if (isStrEqual (asUpperCamelCase type) (asUpperCamelCase "vendor_id"))~}}
       VendorId
     {{~else if_is_strongly_typed_chip_enum type~}}
-        {{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase type}}
+        {{asUpperCamelCase parent.name preserveAcronyms=true}}Cluster{{asUpperCamelCase type preserveAcronyms=true}}
     {{~else~}}
       {{chipCallback.name}}
     {{~/if~}}
   {{~/if_is_struct~}}
 {{~/if~}}
-Attribute
\ No newline at end of file
+Attribute{{~"remove_extra_spaces"~}}
diff --git a/src/darwin/Framework/CHIP/templates/partials/command_completion_type.zapt b/src/darwin/Framework/CHIP/templates/partials/command_completion_type.zapt
index 124d825..6616a32 100644
--- a/src/darwin/Framework/CHIP/templates/partials/command_completion_type.zapt
+++ b/src/darwin/Framework/CHIP/templates/partials/command_completion_type.zapt
@@ -3,7 +3,7 @@
 {{~#if compatRemapClusterName~}}
 {{compatClusterNameRemapping command.parent.name}}
 {{~else~}}
-{{asUpperCamelCase command.parent.name}}
+{{asUpperCamelCase command.parent.name preserveAcronyms=true}}
 {{~/if~}}
 {{/inline}}
 void (^)(MTR{{> clusterName}}Cluster{{asUpperCamelCase command.responseName}}Params * _Nullable data, NSError * _Nullable error)
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
index 526c715..48d87de 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRAttributeTLVValueDecoder.mm
@@ -2538,8 +2538,8 @@
                 auto iter_0 = cppValue.begin();
                 while (iter_0.Next()) {
                     auto & entry_0 = iter_0.GetValue();
-                    MTROtaSoftwareUpdateRequestorClusterProviderLocation * newElement_0;
-                    newElement_0 = [MTROtaSoftwareUpdateRequestorClusterProviderLocation new];
+                    MTROTASoftwareUpdateRequestorClusterProviderLocation * newElement_0;
+                    newElement_0 = [MTROTASoftwareUpdateRequestorClusterProviderLocation new];
                     newElement_0.providerNodeID = [NSNumber numberWithUnsignedLongLong:entry_0.providerNodeID];
                     newElement_0.endpoint = [NSNumber numberWithUnsignedShort:entry_0.endpoint];
                     newElement_0.fabricIndex = [NSNumber numberWithUnsignedChar:entry_0.fabricIndex];
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
index 2cc6d66..4401bd2 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h
@@ -1416,17 +1416,17 @@
                               endpointID:(NSNumber *)endpointID
                                    queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER MTR_NEWLY_AVAILABLE;
 
-- (void)readAttributeAclWithParams:(MTRReadParams * _Nullable)params
+- (void)readAttributeACLWithParams:(MTRReadParams * _Nullable)params
                         completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
-- (void)writeAttributeAclWithValue:(NSArray * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
-- (void)writeAttributeAclWithValue:(NSArray * _Nonnull)value
+- (void)writeAttributeACLWithValue:(NSArray * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
+- (void)writeAttributeACLWithValue:(NSArray * _Nonnull)value
                             params:(MTRWriteParams * _Nullable)params
                         completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
-- (void)subscribeAttributeAclWithParams:(MTRSubscribeParams *)params
+- (void)subscribeAttributeACLWithParams:(MTRSubscribeParams *)params
                 subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
                           reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
     MTR_NEWLY_AVAILABLE;
-+ (void)readAttributeAclWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
++ (void)readAttributeACLWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
                                      endpoint:(NSNumber *)endpoint
                                         queue:(dispatch_queue_t)queue
                                    completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
@@ -2030,19 +2030,20 @@
  * Cluster OTA Software Update Provider
  *    Provides an interface for providing OTA software updates
  */
-@interface MTRBaseClusterOtaSoftwareUpdateProvider : MTRCluster
+MTR_NEWLY_AVAILABLE
+@interface MTRBaseClusterOTASoftwareUpdateProvider : MTRCluster
 
 - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device
                               endpointID:(NSNumber *)endpointID
                                    queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER MTR_NEWLY_AVAILABLE;
 
-- (void)queryImageWithParams:(MTROtaSoftwareUpdateProviderClusterQueryImageParams *)params
-                  completion:(void (^)(MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
+- (void)queryImageWithParams:(MTROTASoftwareUpdateProviderClusterQueryImageParams *)params
+                  completion:(void (^)(MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
                                  NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
-- (void)applyUpdateRequestWithParams:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
-                          completion:(void (^)(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
+- (void)applyUpdateRequestWithParams:(MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
+                          completion:(void (^)(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                          NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
-- (void)notifyUpdateAppliedWithParams:(MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
+- (void)notifyUpdateAppliedWithParams:(MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
                            completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
 
 - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
@@ -2114,13 +2115,14 @@
  * Cluster OTA Software Update Requestor
  *    Provides an interface for downloading and applying OTA software updates
  */
-@interface MTRBaseClusterOtaSoftwareUpdateRequestor : MTRCluster
+MTR_NEWLY_AVAILABLE
+@interface MTRBaseClusterOTASoftwareUpdateRequestor : MTRCluster
 
 - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device
                               endpointID:(NSNumber *)endpointID
                                    queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER MTR_NEWLY_AVAILABLE;
 
-- (void)announceOtaProviderWithParams:(MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
+- (void)announceOtaProviderWithParams:(MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
                            completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
 
 - (void)readAttributeDefaultOtaProvidersWithParams:(MTRReadParams * _Nullable)params
@@ -11013,58 +11015,58 @@
                                                          completion:(void (^)(NSNumber * _Nullable value,
                                                                         NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
 
-- (void)readAttributePirOccupiedToUnoccupiedDelayWithCompletion:(void (^)(NSNumber * _Nullable value,
+- (void)readAttributePIROccupiedToUnoccupiedDelayWithCompletion:(void (^)(NSNumber * _Nullable value,
                                                                     NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
-- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                                  completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
-- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                                      params:(MTRWriteParams * _Nullable)params
                                                  completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
-- (void)subscribeAttributePirOccupiedToUnoccupiedDelayWithParams:(MTRSubscribeParams *)params
+- (void)subscribeAttributePIROccupiedToUnoccupiedDelayWithParams:(MTRSubscribeParams *)params
                                          subscriptionEstablished:
                                              (MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
                                                    reportHandler:(void (^)(NSNumber * _Nullable value,
                                                                      NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE;
-+ (void)readAttributePirOccupiedToUnoccupiedDelayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
++ (void)readAttributePIROccupiedToUnoccupiedDelayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
                                                               endpoint:(NSNumber *)endpoint
                                                                  queue:(dispatch_queue_t)queue
                                                             completion:(void (^)(NSNumber * _Nullable value,
                                                                            NSError * _Nullable error))completion
     MTR_NEWLY_AVAILABLE;
 
-- (void)readAttributePirUnoccupiedToOccupiedDelayWithCompletion:(void (^)(NSNumber * _Nullable value,
+- (void)readAttributePIRUnoccupiedToOccupiedDelayWithCompletion:(void (^)(NSNumber * _Nullable value,
                                                                     NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
-- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                                  completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
-- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                                      params:(MTRWriteParams * _Nullable)params
                                                  completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
-- (void)subscribeAttributePirUnoccupiedToOccupiedDelayWithParams:(MTRSubscribeParams *)params
+- (void)subscribeAttributePIRUnoccupiedToOccupiedDelayWithParams:(MTRSubscribeParams *)params
                                          subscriptionEstablished:
                                              (MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
                                                    reportHandler:(void (^)(NSNumber * _Nullable value,
                                                                      NSError * _Nullable error))reportHandler MTR_NEWLY_AVAILABLE;
-+ (void)readAttributePirUnoccupiedToOccupiedDelayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
++ (void)readAttributePIRUnoccupiedToOccupiedDelayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
                                                               endpoint:(NSNumber *)endpoint
                                                                  queue:(dispatch_queue_t)queue
                                                             completion:(void (^)(NSNumber * _Nullable value,
                                                                            NSError * _Nullable error))completion
     MTR_NEWLY_AVAILABLE;
 
-- (void)readAttributePirUnoccupiedToOccupiedThresholdWithCompletion:(void (^)(NSNumber * _Nullable value,
+- (void)readAttributePIRUnoccupiedToOccupiedThresholdWithCompletion:(void (^)(NSNumber * _Nullable value,
                                                                         NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
-- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
                                                      completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
-- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
                                                          params:(MTRWriteParams * _Nullable)params
                                                      completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
-- (void)subscribeAttributePirUnoccupiedToOccupiedThresholdWithParams:(MTRSubscribeParams *)params
+- (void)subscribeAttributePIRUnoccupiedToOccupiedThresholdWithParams:(MTRSubscribeParams *)params
                                              subscriptionEstablished:
                                                  (MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
                                                        reportHandler:(void (^)(NSNumber * _Nullable value,
                                                                          NSError * _Nullable error))reportHandler
     MTR_NEWLY_AVAILABLE;
-+ (void)readAttributePirUnoccupiedToOccupiedThresholdWithClusterStateCache:
++ (void)readAttributePIRUnoccupiedToOccupiedThresholdWithClusterStateCache:
             (MTRClusterStateCacheContainer *)clusterStateCacheContainer
                                                                   endpoint:(NSNumber *)endpoint
                                                                      queue:(dispatch_queue_t)queue
@@ -11267,7 +11269,8 @@
  * Cluster Wake on LAN
  *    This cluster provides an interface for managing low power mode on a device that supports the Wake On LAN protocol.
  */
-@interface MTRBaseClusterWakeOnLan : MTRCluster
+MTR_NEWLY_AVAILABLE
+@interface MTRBaseClusterWakeOnLAN : MTRCluster
 
 - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device
                               endpointID:(NSNumber *)endpointID
@@ -15899,6 +15902,18 @@
 
 @end
 
+MTR_NEWLY_DEPRECATED("Please use MTRBaseClusterOTASoftwareUpdateProvider")
+@interface MTRBaseClusterOtaSoftwareUpdateProvider : MTRBaseClusterOTASoftwareUpdateProvider
+@end
+
+MTR_NEWLY_DEPRECATED("Please use MTRBaseClusterOTASoftwareUpdateRequestor")
+@interface MTRBaseClusterOtaSoftwareUpdateRequestor : MTRBaseClusterOTASoftwareUpdateRequestor
+@end
+
+MTR_NEWLY_DEPRECATED("Please use MTRBaseClusterWakeOnLAN")
+@interface MTRBaseClusterWakeOnLan : MTRBaseClusterWakeOnLAN
+@end
+
 MTR_NEWLY_DEPRECATED("Please use MTRBaseClusterUnitTesting")
 @interface MTRBaseClusterTestCluster : MTRBaseClusterUnitTesting
 @end
@@ -16050,31 +16065,65 @@
     MTRActionsCommandBitsDisableActionWithDuration = 0x800,
 };
 
+typedef NS_ENUM(uint8_t, MTROTASoftwareUpdateProviderOTAApplyUpdateAction) {
+    MTROTASoftwareUpdateProviderOTAApplyUpdateActionProceed = 0x00,
+    MTROTASoftwareUpdateProviderOTAApplyUpdateActionAwaitNextAction = 0x01,
+    MTROTASoftwareUpdateProviderOTAApplyUpdateActionDiscontinue = 0x02,
+} MTR_NEWLY_AVAILABLE;
+
 typedef NS_ENUM(uint8_t, MTROtaSoftwareUpdateProviderOTAApplyUpdateAction) {
     MTROtaSoftwareUpdateProviderOTAApplyUpdateActionProceed = 0x00,
     MTROtaSoftwareUpdateProviderOTAApplyUpdateActionAwaitNextAction = 0x01,
     MTROtaSoftwareUpdateProviderOTAApplyUpdateActionDiscontinue = 0x02,
-};
+} MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateProviderOTAApplyUpdateAction");
+
+typedef NS_ENUM(uint8_t, MTROTASoftwareUpdateProviderOTADownloadProtocol) {
+    MTROTASoftwareUpdateProviderOTADownloadProtocolBDXSynchronous = 0x00,
+    MTROTASoftwareUpdateProviderOTADownloadProtocolBDXAsynchronous = 0x01,
+    MTROTASoftwareUpdateProviderOTADownloadProtocolHTTPS = 0x02,
+    MTROTASoftwareUpdateProviderOTADownloadProtocolVendorSpecific = 0x03,
+} MTR_NEWLY_AVAILABLE;
 
 typedef NS_ENUM(uint8_t, MTROtaSoftwareUpdateProviderOTADownloadProtocol) {
     MTROtaSoftwareUpdateProviderOTADownloadProtocolBDXSynchronous = 0x00,
     MTROtaSoftwareUpdateProviderOTADownloadProtocolBDXAsynchronous = 0x01,
     MTROtaSoftwareUpdateProviderOTADownloadProtocolHTTPS = 0x02,
     MTROtaSoftwareUpdateProviderOTADownloadProtocolVendorSpecific = 0x03,
-};
+} MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateProviderOTADownloadProtocol");
+
+typedef NS_ENUM(uint8_t, MTROTASoftwareUpdateProviderOTAQueryStatus) {
+    MTROTASoftwareUpdateProviderOTAQueryStatusUpdateAvailable = 0x00,
+    MTROTASoftwareUpdateProviderOTAQueryStatusBusy = 0x01,
+    MTROTASoftwareUpdateProviderOTAQueryStatusNotAvailable = 0x02,
+    MTROTASoftwareUpdateProviderOTAQueryStatusDownloadProtocolNotSupported = 0x03,
+} MTR_NEWLY_AVAILABLE;
 
 typedef NS_ENUM(uint8_t, MTROtaSoftwareUpdateProviderOTAQueryStatus) {
     MTROtaSoftwareUpdateProviderOTAQueryStatusUpdateAvailable = 0x00,
     MTROtaSoftwareUpdateProviderOTAQueryStatusBusy = 0x01,
     MTROtaSoftwareUpdateProviderOTAQueryStatusNotAvailable = 0x02,
     MTROtaSoftwareUpdateProviderOTAQueryStatusDownloadProtocolNotSupported = 0x03,
-};
+} MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateProviderOTAQueryStatus");
+
+typedef NS_ENUM(uint8_t, MTROTASoftwareUpdateRequestorOTAAnnouncementReason) {
+    MTROTASoftwareUpdateRequestorOTAAnnouncementReasonSimpleAnnouncement = 0x00,
+    MTROTASoftwareUpdateRequestorOTAAnnouncementReasonUpdateAvailable = 0x01,
+    MTROTASoftwareUpdateRequestorOTAAnnouncementReasonUrgentUpdateAvailable = 0x02,
+} MTR_NEWLY_AVAILABLE;
 
 typedef NS_ENUM(uint8_t, MTROtaSoftwareUpdateRequestorOTAAnnouncementReason) {
     MTROtaSoftwareUpdateRequestorOTAAnnouncementReasonSimpleAnnouncement = 0x00,
     MTROtaSoftwareUpdateRequestorOTAAnnouncementReasonUpdateAvailable = 0x01,
     MTROtaSoftwareUpdateRequestorOTAAnnouncementReasonUrgentUpdateAvailable = 0x02,
-};
+} MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateRequestorOTAAnnouncementReason");
+
+typedef NS_ENUM(uint8_t, MTROTASoftwareUpdateRequestorOTAChangeReason) {
+    MTROTASoftwareUpdateRequestorOTAChangeReasonUnknown = 0x00,
+    MTROTASoftwareUpdateRequestorOTAChangeReasonSuccess = 0x01,
+    MTROTASoftwareUpdateRequestorOTAChangeReasonFailure = 0x02,
+    MTROTASoftwareUpdateRequestorOTAChangeReasonTimeOut = 0x03,
+    MTROTASoftwareUpdateRequestorOTAChangeReasonDelayByProvider = 0x04,
+} MTR_NEWLY_AVAILABLE;
 
 typedef NS_ENUM(uint8_t, MTROtaSoftwareUpdateRequestorOTAChangeReason) {
     MTROtaSoftwareUpdateRequestorOTAChangeReasonUnknown = 0x00,
@@ -16082,7 +16131,19 @@
     MTROtaSoftwareUpdateRequestorOTAChangeReasonFailure = 0x02,
     MTROtaSoftwareUpdateRequestorOTAChangeReasonTimeOut = 0x03,
     MTROtaSoftwareUpdateRequestorOTAChangeReasonDelayByProvider = 0x04,
-};
+} MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateRequestorOTAChangeReason");
+
+typedef NS_ENUM(uint8_t, MTROTASoftwareUpdateRequestorOTAUpdateState) {
+    MTROTASoftwareUpdateRequestorOTAUpdateStateUnknown = 0x00,
+    MTROTASoftwareUpdateRequestorOTAUpdateStateIdle = 0x01,
+    MTROTASoftwareUpdateRequestorOTAUpdateStateQuerying = 0x02,
+    MTROTASoftwareUpdateRequestorOTAUpdateStateDelayedOnQuery = 0x03,
+    MTROTASoftwareUpdateRequestorOTAUpdateStateDownloading = 0x04,
+    MTROTASoftwareUpdateRequestorOTAUpdateStateApplying = 0x05,
+    MTROTASoftwareUpdateRequestorOTAUpdateStateDelayedOnApply = 0x06,
+    MTROTASoftwareUpdateRequestorOTAUpdateStateRollingBack = 0x07,
+    MTROTASoftwareUpdateRequestorOTAUpdateStateDelayedOnUserConsent = 0x08,
+} MTR_NEWLY_AVAILABLE;
 
 typedef NS_ENUM(uint8_t, MTROtaSoftwareUpdateRequestorOTAUpdateState) {
     MTROtaSoftwareUpdateRequestorOTAUpdateStateUnknown = 0x00,
@@ -16094,7 +16155,7 @@
     MTROtaSoftwareUpdateRequestorOTAUpdateStateDelayedOnApply = 0x06,
     MTROtaSoftwareUpdateRequestorOTAUpdateStateRollingBack = 0x07,
     MTROtaSoftwareUpdateRequestorOTAUpdateStateDelayedOnUserConsent = 0x08,
-};
+} MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateRequestorOTAUpdateState");
 
 typedef NS_ENUM(uint8_t, MTRTimeFormatLocalizationCalendarType) {
     MTRTimeFormatLocalizationCalendarTypeBuddhist = 0x00,
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
index 4af3218..e894ea0 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.mm
@@ -10364,20 +10364,20 @@
     return self;
 }
 
-- (void)readAttributeAclWithParams:(MTRReadParams * _Nullable)params
+- (void)readAttributeACLWithParams:(MTRReadParams * _Nullable)params
                         completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 { // Make a copy of params before we go async.
     params = [params copy];
     using TypeInfo = AccessControl::Attributes::Acl::TypeInfo;
-    return MTRReadAttribute<MTRAccessControlAclListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
+    return MTRReadAttribute<MTRAccessControlACLListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
 
-- (void)writeAttributeAclWithValue:(NSArray * _Nonnull)value completion:(MTRStatusCompletion)completion
+- (void)writeAttributeACLWithValue:(NSArray * _Nonnull)value completion:(MTRStatusCompletion)completion
 {
-    [self writeAttributeAclWithValue:(NSArray * _Nonnull) value params:nil completion:completion];
+    [self writeAttributeACLWithValue:(NSArray * _Nonnull) value params:nil completion:completion];
 }
-- (void)writeAttributeAclWithValue:(NSArray * _Nonnull)value
+- (void)writeAttributeACLWithValue:(NSArray * _Nonnull)value
                             params:(MTRWriteParams * _Nullable)params
                         completion:(MTRStatusCompletion)completion
 {
@@ -10508,23 +10508,23 @@
     std::move(*bridge).DispatchAction(self.device);
 }
 
-- (void)subscribeAttributeAclWithParams:(MTRSubscribeParams * _Nonnull)params
+- (void)subscribeAttributeACLWithParams:(MTRSubscribeParams * _Nonnull)params
                 subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
                           reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = AccessControl::Attributes::Acl::TypeInfo;
-    MTRSubscribeAttribute<MTRAccessControlAclListAttributeCallbackSubscriptionBridge, NSArray, TypeInfo::DecodableType>(params,
+    MTRSubscribeAttribute<MTRAccessControlACLListAttributeCallbackSubscriptionBridge, NSArray, TypeInfo::DecodableType>(params,
         subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(),
         TypeInfo::GetAttributeId());
 }
 
-+ (void)readAttributeAclWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
++ (void)readAttributeACLWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
                                      endpoint:(NSNumber *)endpoint
                                         queue:(dispatch_queue_t)queue
                                    completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTRAccessControlAclListAttributeCallbackBridge(queue, completion);
-    std::move(*bridge).DispatchLocalAction(^(AccessControlAclListAttributeCallback successCb, MTRErrorCallback failureCb) {
+    auto * bridge = new MTRAccessControlACLListAttributeCallbackBridge(queue, completion);
+    std::move(*bridge).DispatchLocalAction(^(AccessControlACLListAttributeCallback successCb, MTRErrorCallback failureCb) {
         if (clusterStateCacheContainer.cppClusterStateCache) {
             chip::app::ConcreteAttributePath path;
             using TypeInfo = AccessControl::Attributes::Acl::TypeInfo;
@@ -11007,7 +11007,7 @@
 - (void)readAttributeAclWithParams:(MTRReadParams * _Nullable)params
                  completionHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completionHandler
 {
-    [self readAttributeAclWithParams:params
+    [self readAttributeACLWithParams:params
                           completion:^(NSArray * _Nullable value, NSError * _Nullable error) {
                               // Cast is safe because subclass does not add any selectors.
                               completionHandler(static_cast<NSArray *>(value), error);
@@ -11015,13 +11015,13 @@
 }
 - (void)writeAttributeAclWithValue:(NSArray * _Nonnull)value completionHandler:(MTRStatusCompletion)completionHandler
 {
-    [self writeAttributeAclWithValue:value params:nil completion:completionHandler];
+    [self writeAttributeACLWithValue:value params:nil completion:completionHandler];
 }
 - (void)writeAttributeAclWithValue:(NSArray * _Nonnull)value
                             params:(MTRWriteParams * _Nullable)params
                  completionHandler:(MTRStatusCompletion)completionHandler
 {
-    [self writeAttributeAclWithValue:value params:params completion:completionHandler];
+    [self writeAttributeACLWithValue:value params:params completion:completionHandler];
 }
 - (void)subscribeAttributeAclWithMinInterval:(NSNumber * _Nonnull)minInterval
                                  maxInterval:(NSNumber * _Nonnull)maxInterval
@@ -11036,7 +11036,7 @@
         subscribeParams.minInterval = minInterval;
         subscribeParams.maxInterval = maxInterval;
     }
-    [self subscribeAttributeAclWithParams:subscribeParams
+    [self subscribeAttributeACLWithParams:subscribeParams
                   subscriptionEstablished:subscriptionEstablishedHandler
                             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
                                 // Cast is safe because subclass does not add any selectors.
@@ -11048,7 +11048,7 @@
                                      queue:(dispatch_queue_t)queue
                          completionHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completionHandler
 {
-    [self readAttributeAclWithClusterStateCache:attributeCacheContainer.realContainer
+    [self readAttributeACLWithClusterStateCache:attributeCacheContainer.realContainer
                                        endpoint:endpoint
                                           queue:queue
                                      completion:^(NSArray * _Nullable value, NSError * _Nullable error) {
@@ -15005,7 +15005,7 @@
 
 @end
 
-@implementation MTRBaseClusterOtaSoftwareUpdateProvider
+@implementation MTRBaseClusterOTASoftwareUpdateProvider
 
 - (instancetype)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
 {
@@ -15020,17 +15020,17 @@
     return self;
 }
 
-- (void)queryImageWithParams:(MTROtaSoftwareUpdateProviderClusterQueryImageParams *)params
-                  completion:(void (^)(MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
+- (void)queryImageWithParams:(MTROTASoftwareUpdateProviderClusterQueryImageParams *)params
+                  completion:(void (^)(MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
                                  NSError * _Nullable error))completion
 {
     // Make a copy of params before we go async.
     params = [params copy];
-    auto * bridge = new MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(self.callbackQueue, completion,
+    auto * bridge = new MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(self.callbackQueue, completion,
         ^(ExchangeManager & exchangeManager, const SessionHandle & session,
-            OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType successCb, MTRErrorCallback failureCb,
+            OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType successCb, MTRErrorCallback failureCb,
             MTRCallbackBridgeBase * bridge) {
-            auto * typedBridge = static_cast<MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge *>(bridge);
+            auto * typedBridge = static_cast<MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge *>(bridge);
             chip::Optional<uint16_t> timedInvokeTimeoutMs;
             ListFreer listFreer;
             OtaSoftwareUpdateProvider::Commands::QueryImage::Type request;
@@ -15088,17 +15088,17 @@
     std::move(*bridge).DispatchAction(self.device);
 }
 
-- (void)applyUpdateRequestWithParams:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
-                          completion:(void (^)(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
+- (void)applyUpdateRequestWithParams:(MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
+                          completion:(void (^)(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                          NSError * _Nullable error))completion
 {
     // Make a copy of params before we go async.
     params = [params copy];
-    auto * bridge = new MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(self.callbackQueue, completion,
+    auto * bridge = new MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(self.callbackQueue, completion,
         ^(ExchangeManager & exchangeManager, const SessionHandle & session,
-            OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType successCb, MTRErrorCallback failureCb,
+            OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType successCb, MTRErrorCallback failureCb,
             MTRCallbackBridgeBase * bridge) {
-            auto * typedBridge = static_cast<MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge *>(bridge);
+            auto * typedBridge = static_cast<MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge *>(bridge);
             chip::Optional<uint16_t> timedInvokeTimeoutMs;
             ListFreer listFreer;
             OtaSoftwareUpdateProvider::Commands::ApplyUpdateRequest::Type request;
@@ -15116,7 +15116,7 @@
     std::move(*bridge).DispatchAction(self.device);
 }
 
-- (void)notifyUpdateAppliedWithParams:(MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
+- (void)notifyUpdateAppliedWithParams:(MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
                            completion:(MTRStatusCompletion)completion
 {
     // Make a copy of params before we go async.
@@ -15150,7 +15150,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = OtaSoftwareUpdateProvider::Attributes::GeneratedCommandList::TypeInfo;
-    return MTRReadAttribute<MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge, NSArray,
+    return MTRReadAttribute<MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge, NSArray,
         TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15161,7 +15161,7 @@
                                                (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = OtaSoftwareUpdateProvider::Attributes::GeneratedCommandList::TypeInfo;
-    MTRSubscribeAttribute<MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
+    MTRSubscribeAttribute<MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
         TypeInfo::DecodableType>(params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint,
         TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15172,9 +15172,9 @@
                                                     completion:
                                                         (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(OTASoftwareUpdateProviderGeneratedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = OtaSoftwareUpdateProvider::Attributes::GeneratedCommandList::TypeInfo;
@@ -15196,7 +15196,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = OtaSoftwareUpdateProvider::Attributes::AcceptedCommandList::TypeInfo;
-    return MTRReadAttribute<MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge, NSArray,
+    return MTRReadAttribute<MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge, NSArray,
         TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15207,7 +15207,7 @@
                                               (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = OtaSoftwareUpdateProvider::Attributes::AcceptedCommandList::TypeInfo;
-    MTRSubscribeAttribute<MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
+    MTRSubscribeAttribute<MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
         TypeInfo::DecodableType>(params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint,
         TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15218,9 +15218,9 @@
                                                    completion:
                                                        (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(OTASoftwareUpdateProviderAcceptedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = OtaSoftwareUpdateProvider::Attributes::AcceptedCommandList::TypeInfo;
@@ -15242,7 +15242,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = OtaSoftwareUpdateProvider::Attributes::AttributeList::TypeInfo;
-    return MTRReadAttribute<MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
+    return MTRReadAttribute<MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
 
@@ -15251,7 +15251,7 @@
                                     reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = OtaSoftwareUpdateProvider::Attributes::AttributeList::TypeInfo;
-    MTRSubscribeAttribute<MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge, NSArray,
+    MTRSubscribeAttribute<MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge, NSArray,
         TypeInfo::DecodableType>(params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint,
         TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15261,9 +15261,9 @@
                                                   queue:(dispatch_queue_t)queue
                                              completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(OtaSoftwareUpdateProviderAttributeListListAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(OTASoftwareUpdateProviderAttributeListListAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = OtaSoftwareUpdateProvider::Attributes::AttributeList::TypeInfo;
@@ -15368,6 +15368,9 @@
 
 @end
 
+@implementation MTRBaseClusterOtaSoftwareUpdateProvider
+@end
+
 @implementation MTRBaseClusterOtaSoftwareUpdateProvider (Deprecated)
 
 - (void)queryImageWithParams:(MTROtaSoftwareUpdateProviderClusterQueryImageParams *)params
@@ -15376,7 +15379,7 @@
 {
     [self queryImageWithParams:params
                     completion:^(
-                        MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error) {
+                        MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error) {
                         // Cast is safe because subclass does not add any selectors.
                         completionHandler(static_cast<MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams *>(data), error);
                     }];
@@ -15386,7 +15389,7 @@
                                          NSError * _Nullable error))completionHandler
 {
     [self applyUpdateRequestWithParams:params
-                            completion:^(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
+                            completion:^(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                 NSError * _Nullable error) {
                                 // Cast is safe because subclass does not add any selectors.
                                 completionHandler(
@@ -15625,7 +15628,7 @@
 
 @end
 
-@implementation MTRBaseClusterOtaSoftwareUpdateRequestor
+@implementation MTRBaseClusterOTASoftwareUpdateRequestor
 
 - (instancetype)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
 {
@@ -15640,7 +15643,7 @@
     return self;
 }
 
-- (void)announceOtaProviderWithParams:(MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
+- (void)announceOtaProviderWithParams:(MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
                            completion:(MTRStatusCompletion)completion
 {
     // Make a copy of params before we go async.
@@ -15682,7 +15685,7 @@
 { // Make a copy of params before we go async.
     params = [params copy];
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::DefaultOtaProviders::TypeInfo;
-    return MTRReadAttribute<MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge, NSArray,
+    return MTRReadAttribute<MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge, NSArray,
         TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15726,11 +15729,11 @@
                     }
                     listFreer.add(listHolder_0);
                     for (size_t i_0 = 0; i_0 < value.count; ++i_0) {
-                        if (![value[i_0] isKindOfClass:[MTROtaSoftwareUpdateRequestorClusterProviderLocation class]]) {
+                        if (![value[i_0] isKindOfClass:[MTROTASoftwareUpdateRequestorClusterProviderLocation class]]) {
                             // Wrong kind of value.
                             return CHIP_ERROR_INVALID_ARGUMENT;
                         }
-                        auto element_0 = (MTROtaSoftwareUpdateRequestorClusterProviderLocation *) value[i_0];
+                        auto element_0 = (MTROTASoftwareUpdateRequestorClusterProviderLocation *) value[i_0];
                         listHolder_0->mList[i_0].providerNodeID = element_0.providerNodeID.unsignedLongLongValue;
                         listHolder_0->mList[i_0].endpoint = element_0.endpoint.unsignedShortValue;
                         listHolder_0->mList[i_0].fabricIndex = element_0.fabricIndex.unsignedCharValue;
@@ -15753,7 +15756,7 @@
                                               (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::DefaultOtaProviders::TypeInfo;
-    MTRSubscribeAttribute<MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge, NSArray,
+    MTRSubscribeAttribute<MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge, NSArray,
         TypeInfo::DecodableType>(params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint,
         TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15764,9 +15767,9 @@
                                                    completion:
                                                        (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(OTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::DefaultOtaProviders::TypeInfo;
@@ -15830,7 +15833,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::UpdateState::TypeInfo;
-    return MTRReadAttribute<MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge, NSNumber,
+    return MTRReadAttribute<MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge, NSNumber,
         TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15840,7 +15843,7 @@
                                   reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::UpdateState::TypeInfo;
-    MTRSubscribeAttribute<MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge, NSNumber,
+    MTRSubscribeAttribute<MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge, NSNumber,
         TypeInfo::DecodableType>(params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint,
         TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15850,9 +15853,9 @@
                                                 queue:(dispatch_queue_t)queue
                                            completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(OTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::UpdateState::TypeInfo;
@@ -15918,7 +15921,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::GeneratedCommandList::TypeInfo;
-    return MTRReadAttribute<MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge, NSArray,
+    return MTRReadAttribute<MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge, NSArray,
         TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15929,7 +15932,7 @@
                                                (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::GeneratedCommandList::TypeInfo;
-    MTRSubscribeAttribute<MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
+    MTRSubscribeAttribute<MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
         TypeInfo::DecodableType>(params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint,
         TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15940,9 +15943,9 @@
                                                     completion:
                                                         (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(OTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::GeneratedCommandList::TypeInfo;
@@ -15964,7 +15967,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::AcceptedCommandList::TypeInfo;
-    return MTRReadAttribute<MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge, NSArray,
+    return MTRReadAttribute<MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge, NSArray,
         TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15975,7 +15978,7 @@
                                               (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::AcceptedCommandList::TypeInfo;
-    MTRSubscribeAttribute<MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
+    MTRSubscribeAttribute<MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
         TypeInfo::DecodableType>(params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint,
         TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -15986,9 +15989,9 @@
                                                    completion:
                                                        (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(OTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::AcceptedCommandList::TypeInfo;
@@ -16010,7 +16013,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::AttributeList::TypeInfo;
-    return MTRReadAttribute<MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge, NSArray,
+    return MTRReadAttribute<MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge, NSArray,
         TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -16020,7 +16023,7 @@
                                     reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::AttributeList::TypeInfo;
-    MTRSubscribeAttribute<MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge, NSArray,
+    MTRSubscribeAttribute<MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge, NSArray,
         TypeInfo::DecodableType>(params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint,
         TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -16030,9 +16033,9 @@
                                                   queue:(dispatch_queue_t)queue
                                              completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(OtaSoftwareUpdateRequestorAttributeListListAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(OTASoftwareUpdateRequestorAttributeListListAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = OtaSoftwareUpdateRequestor::Attributes::AttributeList::TypeInfo;
@@ -16137,6 +16140,9 @@
 
 @end
 
+@implementation MTRBaseClusterOtaSoftwareUpdateRequestor
+@end
+
 @implementation MTRBaseClusterOtaSoftwareUpdateRequestor (Deprecated)
 
 - (void)announceOtaProviderWithParams:(MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
@@ -79555,7 +79561,7 @@
     });
 }
 
-- (void)readAttributePirOccupiedToUnoccupiedDelayWithCompletion:(void (^)(NSNumber * _Nullable value,
+- (void)readAttributePIROccupiedToUnoccupiedDelayWithCompletion:(void (^)(NSNumber * _Nullable value,
                                                                     NSError * _Nullable error))completion
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
@@ -79564,11 +79570,11 @@
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
 
-- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion
+- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion
 {
-    [self writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull) value params:nil completion:completion];
+    [self writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull) value params:nil completion:completion];
 }
-- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                                      params:(MTRWriteParams * _Nullable)params
                                                  completion:(MTRStatusCompletion)completion
 {
@@ -79601,7 +79607,7 @@
     std::move(*bridge).DispatchAction(self.device);
 }
 
-- (void)subscribeAttributePirOccupiedToUnoccupiedDelayWithParams:(MTRSubscribeParams * _Nonnull)params
+- (void)subscribeAttributePIROccupiedToUnoccupiedDelayWithParams:(MTRSubscribeParams * _Nonnull)params
                                          subscriptionEstablished:
                                              (MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
                                                    reportHandler:(void (^)(NSNumber * _Nullable value,
@@ -79613,7 +79619,7 @@
         TypeInfo::GetAttributeId());
 }
 
-+ (void)readAttributePirOccupiedToUnoccupiedDelayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
++ (void)readAttributePIROccupiedToUnoccupiedDelayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
                                                               endpoint:(NSNumber *)endpoint
                                                                  queue:(dispatch_queue_t)queue
                                                             completion:(void (^)(NSNumber * _Nullable value,
@@ -79638,7 +79644,7 @@
     });
 }
 
-- (void)readAttributePirUnoccupiedToOccupiedDelayWithCompletion:(void (^)(NSNumber * _Nullable value,
+- (void)readAttributePIRUnoccupiedToOccupiedDelayWithCompletion:(void (^)(NSNumber * _Nullable value,
                                                                     NSError * _Nullable error))completion
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
@@ -79647,11 +79653,11 @@
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
 
-- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion
+- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion
 {
-    [self writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull) value params:nil completion:completion];
+    [self writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull) value params:nil completion:completion];
 }
-- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                                      params:(MTRWriteParams * _Nullable)params
                                                  completion:(MTRStatusCompletion)completion
 {
@@ -79684,7 +79690,7 @@
     std::move(*bridge).DispatchAction(self.device);
 }
 
-- (void)subscribeAttributePirUnoccupiedToOccupiedDelayWithParams:(MTRSubscribeParams * _Nonnull)params
+- (void)subscribeAttributePIRUnoccupiedToOccupiedDelayWithParams:(MTRSubscribeParams * _Nonnull)params
                                          subscriptionEstablished:
                                              (MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
                                                    reportHandler:(void (^)(NSNumber * _Nullable value,
@@ -79696,7 +79702,7 @@
         TypeInfo::GetAttributeId());
 }
 
-+ (void)readAttributePirUnoccupiedToOccupiedDelayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
++ (void)readAttributePIRUnoccupiedToOccupiedDelayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer
                                                               endpoint:(NSNumber *)endpoint
                                                                  queue:(dispatch_queue_t)queue
                                                             completion:(void (^)(NSNumber * _Nullable value,
@@ -79721,7 +79727,7 @@
     });
 }
 
-- (void)readAttributePirUnoccupiedToOccupiedThresholdWithCompletion:(void (^)(NSNumber * _Nullable value,
+- (void)readAttributePIRUnoccupiedToOccupiedThresholdWithCompletion:(void (^)(NSNumber * _Nullable value,
                                                                         NSError * _Nullable error))completion
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
@@ -79730,12 +79736,12 @@
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
 
-- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
                                                      completion:(MTRStatusCompletion)completion
 {
-    [self writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull) value params:nil completion:completion];
+    [self writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull) value params:nil completion:completion];
 }
-- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
+- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
                                                          params:(MTRWriteParams * _Nullable)params
                                                      completion:(MTRStatusCompletion)completion
 {
@@ -79768,7 +79774,7 @@
     std::move(*bridge).DispatchAction(self.device);
 }
 
-- (void)subscribeAttributePirUnoccupiedToOccupiedThresholdWithParams:(MTRSubscribeParams * _Nonnull)params
+- (void)subscribeAttributePIRUnoccupiedToOccupiedThresholdWithParams:(MTRSubscribeParams * _Nonnull)params
                                              subscriptionEstablished:
                                                  (MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished
                                                        reportHandler:(void (^)(NSNumber * _Nullable value,
@@ -79780,7 +79786,7 @@
         TypeInfo::GetAttributeId());
 }
 
-+ (void)readAttributePirUnoccupiedToOccupiedThresholdWithClusterStateCache:
++ (void)readAttributePIRUnoccupiedToOccupiedThresholdWithClusterStateCache:
             (MTRClusterStateCacheContainer *)clusterStateCacheContainer
                                                                   endpoint:(NSNumber *)endpoint
                                                                      queue:(dispatch_queue_t)queue
@@ -80681,7 +80687,7 @@
 - (void)readAttributePirOccupiedToUnoccupiedDelayWithCompletionHandler:(void (^)(NSNumber * _Nullable value,
                                                                            NSError * _Nullable error))completionHandler
 {
-    [self readAttributePirOccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+    [self readAttributePIROccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
         // Cast is safe because subclass does not add any selectors.
         completionHandler(static_cast<NSNumber *>(value), error);
     }];
@@ -80689,13 +80695,13 @@
 - (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                           completionHandler:(MTRStatusCompletion)completionHandler
 {
-    [self writeAttributePirOccupiedToUnoccupiedDelayWithValue:value params:nil completion:completionHandler];
+    [self writeAttributePIROccupiedToUnoccupiedDelayWithValue:value params:nil completion:completionHandler];
 }
 - (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                                      params:(MTRWriteParams * _Nullable)params
                                           completionHandler:(MTRStatusCompletion)completionHandler
 {
-    [self writeAttributePirOccupiedToUnoccupiedDelayWithValue:value params:params completion:completionHandler];
+    [self writeAttributePIROccupiedToUnoccupiedDelayWithValue:value params:params completion:completionHandler];
 }
 - (void)subscribeAttributePirOccupiedToUnoccupiedDelayWithMinInterval:(NSNumber * _Nonnull)minInterval
                                                           maxInterval:(NSNumber * _Nonnull)maxInterval
@@ -80712,7 +80718,7 @@
         subscribeParams.minInterval = minInterval;
         subscribeParams.maxInterval = maxInterval;
     }
-    [self subscribeAttributePirOccupiedToUnoccupiedDelayWithParams:subscribeParams
+    [self subscribeAttributePIROccupiedToUnoccupiedDelayWithParams:subscribeParams
                                            subscriptionEstablished:subscriptionEstablishedHandler
                                                      reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                                                          // Cast is safe because subclass does not add any selectors.
@@ -80725,7 +80731,7 @@
                                                   completionHandler:(void (^)(NSNumber * _Nullable value,
                                                                         NSError * _Nullable error))completionHandler
 {
-    [self readAttributePirOccupiedToUnoccupiedDelayWithClusterStateCache:attributeCacheContainer.realContainer
+    [self readAttributePIROccupiedToUnoccupiedDelayWithClusterStateCache:attributeCacheContainer.realContainer
                                                                 endpoint:endpoint
                                                                    queue:queue
                                                               completion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
@@ -80737,7 +80743,7 @@
 - (void)readAttributePirUnoccupiedToOccupiedDelayWithCompletionHandler:(void (^)(NSNumber * _Nullable value,
                                                                            NSError * _Nullable error))completionHandler
 {
-    [self readAttributePirUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+    [self readAttributePIRUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
         // Cast is safe because subclass does not add any selectors.
         completionHandler(static_cast<NSNumber *>(value), error);
     }];
@@ -80745,13 +80751,13 @@
 - (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                           completionHandler:(MTRStatusCompletion)completionHandler
 {
-    [self writeAttributePirUnoccupiedToOccupiedDelayWithValue:value params:nil completion:completionHandler];
+    [self writeAttributePIRUnoccupiedToOccupiedDelayWithValue:value params:nil completion:completionHandler];
 }
 - (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSNumber * _Nonnull)value
                                                      params:(MTRWriteParams * _Nullable)params
                                           completionHandler:(MTRStatusCompletion)completionHandler
 {
-    [self writeAttributePirUnoccupiedToOccupiedDelayWithValue:value params:params completion:completionHandler];
+    [self writeAttributePIRUnoccupiedToOccupiedDelayWithValue:value params:params completion:completionHandler];
 }
 - (void)subscribeAttributePirUnoccupiedToOccupiedDelayWithMinInterval:(NSNumber * _Nonnull)minInterval
                                                           maxInterval:(NSNumber * _Nonnull)maxInterval
@@ -80768,7 +80774,7 @@
         subscribeParams.minInterval = minInterval;
         subscribeParams.maxInterval = maxInterval;
     }
-    [self subscribeAttributePirUnoccupiedToOccupiedDelayWithParams:subscribeParams
+    [self subscribeAttributePIRUnoccupiedToOccupiedDelayWithParams:subscribeParams
                                            subscriptionEstablished:subscriptionEstablishedHandler
                                                      reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                                                          // Cast is safe because subclass does not add any selectors.
@@ -80781,7 +80787,7 @@
                                                   completionHandler:(void (^)(NSNumber * _Nullable value,
                                                                         NSError * _Nullable error))completionHandler
 {
-    [self readAttributePirUnoccupiedToOccupiedDelayWithClusterStateCache:attributeCacheContainer.realContainer
+    [self readAttributePIRUnoccupiedToOccupiedDelayWithClusterStateCache:attributeCacheContainer.realContainer
                                                                 endpoint:endpoint
                                                                    queue:queue
                                                               completion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
@@ -80793,7 +80799,7 @@
 - (void)readAttributePirUnoccupiedToOccupiedThresholdWithCompletionHandler:(void (^)(NSNumber * _Nullable value,
                                                                                NSError * _Nullable error))completionHandler
 {
-    [self readAttributePirUnoccupiedToOccupiedThresholdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+    [self readAttributePIRUnoccupiedToOccupiedThresholdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
         // Cast is safe because subclass does not add any selectors.
         completionHandler(static_cast<NSNumber *>(value), error);
     }];
@@ -80801,13 +80807,13 @@
 - (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
                                               completionHandler:(MTRStatusCompletion)completionHandler
 {
-    [self writeAttributePirUnoccupiedToOccupiedThresholdWithValue:value params:nil completion:completionHandler];
+    [self writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:value params:nil completion:completionHandler];
 }
 - (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSNumber * _Nonnull)value
                                                          params:(MTRWriteParams * _Nullable)params
                                               completionHandler:(MTRStatusCompletion)completionHandler
 {
-    [self writeAttributePirUnoccupiedToOccupiedThresholdWithValue:value params:params completion:completionHandler];
+    [self writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:value params:params completion:completionHandler];
 }
 - (void)subscribeAttributePirUnoccupiedToOccupiedThresholdWithMinInterval:(NSNumber * _Nonnull)minInterval
                                                               maxInterval:(NSNumber * _Nonnull)maxInterval
@@ -80824,7 +80830,7 @@
         subscribeParams.minInterval = minInterval;
         subscribeParams.maxInterval = maxInterval;
     }
-    [self subscribeAttributePirUnoccupiedToOccupiedThresholdWithParams:subscribeParams
+    [self subscribeAttributePIRUnoccupiedToOccupiedThresholdWithParams:subscribeParams
                                                subscriptionEstablished:subscriptionEstablishedHandler
                                                          reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                                                              // Cast is safe because subclass does not add any selectors.
@@ -80837,7 +80843,7 @@
                                                       completionHandler:(void (^)(NSNumber * _Nullable value,
                                                                             NSError * _Nullable error))completionHandler
 {
-    [self readAttributePirUnoccupiedToOccupiedThresholdWithClusterStateCache:attributeCacheContainer.realContainer
+    [self readAttributePIRUnoccupiedToOccupiedThresholdWithClusterStateCache:attributeCacheContainer.realContainer
                                                                     endpoint:endpoint
                                                                        queue:queue
                                                                   completion:^(
@@ -81437,7 +81443,7 @@
 
 @end
 
-@implementation MTRBaseClusterWakeOnLan
+@implementation MTRBaseClusterWakeOnLAN
 
 - (instancetype)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
 {
@@ -81498,7 +81504,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = WakeOnLan::Attributes::GeneratedCommandList::TypeInfo;
-    return MTRReadAttribute<MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
+    return MTRReadAttribute<MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
 
@@ -81508,7 +81514,7 @@
                                                (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = WakeOnLan::Attributes::GeneratedCommandList::TypeInfo;
-    MTRSubscribeAttribute<MTRWakeOnLanGeneratedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
+    MTRSubscribeAttribute<MTRWakeOnLANGeneratedCommandListListAttributeCallbackSubscriptionBridge, NSArray,
         TypeInfo::DecodableType>(params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint,
         TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
@@ -81519,9 +81525,9 @@
                                                     completion:
                                                         (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(WakeOnLanGeneratedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(WakeOnLANGeneratedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = WakeOnLan::Attributes::GeneratedCommandList::TypeInfo;
@@ -81543,7 +81549,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = WakeOnLan::Attributes::AcceptedCommandList::TypeInfo;
-    return MTRReadAttribute<MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
+    return MTRReadAttribute<MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
 
@@ -81553,7 +81559,7 @@
                                               (void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = WakeOnLan::Attributes::AcceptedCommandList::TypeInfo;
-    MTRSubscribeAttribute<MTRWakeOnLanAcceptedCommandListListAttributeCallbackSubscriptionBridge, NSArray, TypeInfo::DecodableType>(
+    MTRSubscribeAttribute<MTRWakeOnLANAcceptedCommandListListAttributeCallbackSubscriptionBridge, NSArray, TypeInfo::DecodableType>(
         params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(),
         TypeInfo::GetAttributeId());
 }
@@ -81564,9 +81570,9 @@
                                                    completion:
                                                        (void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge(queue, completion);
+    auto * bridge = new MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge(queue, completion);
     std::move(*bridge).DispatchLocalAction(
-        ^(WakeOnLanAcceptedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
+        ^(WakeOnLANAcceptedCommandListListAttributeCallback successCb, MTRErrorCallback failureCb) {
             if (clusterStateCacheContainer.cppClusterStateCache) {
                 chip::app::ConcreteAttributePath path;
                 using TypeInfo = WakeOnLan::Attributes::AcceptedCommandList::TypeInfo;
@@ -81588,7 +81594,7 @@
 {
     MTRReadParams * params = [[MTRReadParams alloc] init];
     using TypeInfo = WakeOnLan::Attributes::AttributeList::TypeInfo;
-    return MTRReadAttribute<MTRWakeOnLanAttributeListListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
+    return MTRReadAttribute<MTRWakeOnLANAttributeListListAttributeCallbackBridge, NSArray, TypeInfo::DecodableType>(
         params, completion, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(), TypeInfo::GetAttributeId());
 }
 
@@ -81597,7 +81603,7 @@
                                     reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler
 {
     using TypeInfo = WakeOnLan::Attributes::AttributeList::TypeInfo;
-    MTRSubscribeAttribute<MTRWakeOnLanAttributeListListAttributeCallbackSubscriptionBridge, NSArray, TypeInfo::DecodableType>(
+    MTRSubscribeAttribute<MTRWakeOnLANAttributeListListAttributeCallbackSubscriptionBridge, NSArray, TypeInfo::DecodableType>(
         params, subscriptionEstablished, reportHandler, self.callbackQueue, self.device, self->_endpoint, TypeInfo::GetClusterId(),
         TypeInfo::GetAttributeId());
 }
@@ -81607,8 +81613,8 @@
                                                   queue:(dispatch_queue_t)queue
                                              completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion
 {
-    auto * bridge = new MTRWakeOnLanAttributeListListAttributeCallbackBridge(queue, completion);
-    std::move(*bridge).DispatchLocalAction(^(WakeOnLanAttributeListListAttributeCallback successCb, MTRErrorCallback failureCb) {
+    auto * bridge = new MTRWakeOnLANAttributeListListAttributeCallbackBridge(queue, completion);
+    std::move(*bridge).DispatchLocalAction(^(WakeOnLANAttributeListListAttributeCallback successCb, MTRErrorCallback failureCb) {
         if (clusterStateCacheContainer.cppClusterStateCache) {
             chip::app::ConcreteAttributePath path;
             using TypeInfo = WakeOnLan::Attributes::AttributeList::TypeInfo;
@@ -81713,6 +81719,9 @@
 
 @end
 
+@implementation MTRBaseClusterWakeOnLan
+@end
+
 @implementation MTRBaseClusterWakeOnLan (Deprecated)
 
 - (void)readAttributeMACAddressWithCompletionHandler:(void (^)(
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters_internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters_internal.h
index 56dc085..1e65a8b 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters_internal.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters_internal.h
@@ -82,12 +82,12 @@
 @property (nonatomic, assign, readonly) chip::EndpointId endpoint;
 @end
 
-@interface MTRBaseClusterOtaSoftwareUpdateProvider ()
+@interface MTRBaseClusterOTASoftwareUpdateProvider ()
 @property (nonatomic, strong, readonly) MTRBaseDevice * device;
 @property (nonatomic, assign, readonly) chip::EndpointId endpoint;
 @end
 
-@interface MTRBaseClusterOtaSoftwareUpdateRequestor ()
+@interface MTRBaseClusterOTASoftwareUpdateRequestor ()
 @property (nonatomic, strong, readonly) MTRBaseDevice * device;
 @property (nonatomic, assign, readonly) chip::EndpointId endpoint;
 @end
@@ -277,7 +277,7 @@
 @property (nonatomic, assign, readonly) chip::EndpointId endpoint;
 @end
 
-@interface MTRBaseClusterWakeOnLan ()
+@interface MTRBaseClusterWakeOnLAN ()
 @property (nonatomic, strong, readonly) MTRBaseDevice * device;
 @property (nonatomic, assign, readonly) chip::EndpointId endpoint;
 @end
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm
index 5a83eb0..afbaae6 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm
@@ -1965,7 +1965,7 @@
     }
 }
 
-void MTRAccessControlAclListAttributeCallbackBridge::OnSuccessFn(void * context,
+void MTRAccessControlACLListAttributeCallbackBridge::OnSuccessFn(void * context,
     const chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType> &
         value)
 {
@@ -2047,7 +2047,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRAccessControlAclListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTRAccessControlACLListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -2574,7 +2574,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value)
 {
     NSArray * _Nonnull objCValue;
@@ -2597,7 +2597,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -2612,7 +2612,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value)
 {
     NSArray * _Nonnull objCValue;
@@ -2635,7 +2635,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -2650,7 +2650,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value)
 {
     NSArray * _Nonnull objCValue;
@@ -2673,7 +2673,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -2688,7 +2688,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge::OnSuccessFn(void * context,
+void MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge::OnSuccessFn(void * context,
     const chip::app::DataModel::DecodableList<
         chip::app::Clusters::OtaSoftwareUpdateRequestor::Structs::ProviderLocation::DecodableType> & value)
 {
@@ -2698,8 +2698,8 @@
         auto iter_0 = value.begin();
         while (iter_0.Next()) {
             auto & entry_0 = iter_0.GetValue();
-            MTROtaSoftwareUpdateRequestorClusterProviderLocation * newElement_0;
-            newElement_0 = [MTROtaSoftwareUpdateRequestorClusterProviderLocation new];
+            MTROTASoftwareUpdateRequestorClusterProviderLocation * newElement_0;
+            newElement_0 = [MTROTASoftwareUpdateRequestorClusterProviderLocation new];
             newElement_0.providerNodeID = [NSNumber numberWithUnsignedLongLong:entry_0.providerNodeID];
             newElement_0.endpoint = [NSNumber numberWithUnsignedShort:entry_0.endpoint];
             newElement_0.fabricIndex = [NSNumber numberWithUnsignedChar:entry_0.fabricIndex];
@@ -2715,7 +2715,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -2730,7 +2730,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value)
 {
     NSArray * _Nonnull objCValue;
@@ -2753,7 +2753,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -2768,7 +2768,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value)
 {
     NSArray * _Nonnull objCValue;
@@ -2791,7 +2791,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -2806,7 +2806,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value)
 {
     NSArray * _Nonnull objCValue;
@@ -2829,7 +2829,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -8432,7 +8432,7 @@
     }
 }
 
-void MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge::OnSuccessFn(
+void MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value)
 {
     NSArray * _Nonnull objCValue;
@@ -8455,7 +8455,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRWakeOnLanGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTRWakeOnLANGeneratedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -8470,7 +8470,7 @@
     }
 }
 
-void MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge::OnSuccessFn(
+void MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value)
 {
     NSArray * _Nonnull objCValue;
@@ -8493,7 +8493,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRWakeOnLanAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTRWakeOnLANAcceptedCommandListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -8508,7 +8508,7 @@
     }
 }
 
-void MTRWakeOnLanAttributeListListAttributeCallbackBridge::OnSuccessFn(
+void MTRWakeOnLANAttributeListListAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value)
 {
     NSArray * _Nonnull objCValue;
@@ -8531,7 +8531,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRWakeOnLanAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTRWakeOnLANAttributeListListAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -11649,10 +11649,10 @@
     DispatchSuccess(context, response);
 };
 
-void MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge::OnSuccessFn(
     void * context, const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::QueryImageResponse::DecodableType & data)
 {
-    auto * response = [MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams new];
+    auto * response = [MTROTASoftwareUpdateProviderClusterQueryImageResponseParams new];
     {
         response.status = [NSNumber numberWithUnsignedChar:chip::to_underlying(data.status)];
     }
@@ -11713,10 +11713,10 @@
     DispatchSuccess(context, response);
 };
 
-void MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge::OnSuccessFn(
     void * context, const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::ApplyUpdateResponse::DecodableType & data)
 {
-    auto * response = [MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams new];
+    auto * response = [MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams new];
     {
         response.action = [NSNumber numberWithUnsignedChar:chip::to_underlying(data.action)];
     }
@@ -13856,7 +13856,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnSuccessFn(
     void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction value)
 {
     NSNumber * _Nonnull objCValue;
@@ -13864,7 +13864,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -13879,7 +13879,7 @@
     }
 }
 
-void MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnSuccessFn(void * context,
+void MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnSuccessFn(void * context,
     const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction> & value)
 {
     NSNumber * _Nullable objCValue;
@@ -13891,7 +13891,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -13906,7 +13906,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnSuccessFn(
     void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol value)
 {
     NSNumber * _Nonnull objCValue;
@@ -13914,7 +13914,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -13929,7 +13929,7 @@
     }
 }
 
-void MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnSuccessFn(void * context,
+void MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnSuccessFn(void * context,
     const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol> & value)
 {
     NSNumber * _Nullable objCValue;
@@ -13941,7 +13941,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -13956,7 +13956,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnSuccessFn(
     void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus value)
 {
     NSNumber * _Nonnull objCValue;
@@ -13964,7 +13964,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -13979,7 +13979,7 @@
     }
 }
 
-void MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnSuccessFn(
+void MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnSuccessFn(
     void * context, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus> & value)
 {
     NSNumber * _Nullable objCValue;
@@ -13991,7 +13991,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -14006,7 +14006,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnSuccessFn(
     void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason value)
 {
     NSNumber * _Nonnull objCValue;
@@ -14014,7 +14014,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -14029,7 +14029,7 @@
     }
 }
 
-void MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnSuccessFn(void * context,
+void MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnSuccessFn(void * context,
     const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason> & value)
 {
     NSNumber * _Nullable objCValue;
@@ -14041,7 +14041,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge::
+void MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge::
     OnSubscriptionEstablished()
 {
     if (!mQueue) {
@@ -14057,7 +14057,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnSuccessFn(
     void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum value)
 {
     NSNumber * _Nonnull objCValue;
@@ -14065,7 +14065,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -14080,7 +14080,7 @@
     }
 }
 
-void MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnSuccessFn(void * context,
+void MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnSuccessFn(void * context,
     const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum> & value)
 {
     NSNumber * _Nullable objCValue;
@@ -14092,7 +14092,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -14107,7 +14107,7 @@
     }
 }
 
-void MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnSuccessFn(
+void MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnSuccessFn(
     void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum value)
 {
     NSNumber * _Nonnull objCValue;
@@ -14115,7 +14115,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
@@ -14130,7 +14130,7 @@
     }
 }
 
-void MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnSuccessFn(void * context,
+void MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnSuccessFn(void * context,
     const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum> & value)
 {
     NSNumber * _Nullable objCValue;
@@ -14142,7 +14142,7 @@
     DispatchSuccess(context, objCValue);
 };
 
-void MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
+void MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge::OnSubscriptionEstablished()
 {
     if (!mQueue) {
         return;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h
index 98cfb00..eff36ea 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge_internal.h
@@ -55,9 +55,9 @@
     void *, const chip::app::Clusters::Scenes::Commands::EnhancedViewSceneResponse::DecodableType &);
 typedef void (*ScenesClusterCopySceneResponseCallbackType)(
     void *, const chip::app::Clusters::Scenes::Commands::CopySceneResponse::DecodableType &);
-typedef void (*OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType)(
+typedef void (*OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType)(
     void *, const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::QueryImageResponse::DecodableType &);
-typedef void (*OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType)(
+typedef void (*OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType)(
     void *, const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::ApplyUpdateResponse::DecodableType &);
 typedef void (*GeneralCommissioningClusterArmFailSafeResponseCallbackType)(
     void *, const chip::app::Clusters::GeneralCommissioning::Commands::ArmFailSafeResponse::DecodableType &);
@@ -189,29 +189,29 @@
 typedef void (*ActionsClusterEndpointListTypeEnumAttributeCallback)(void *, chip::app::Clusters::Actions::EndpointListTypeEnum);
 typedef void (*NullableActionsClusterEndpointListTypeEnumAttributeCallback)(
     void *, const chip::app::DataModel::Nullable<chip::app::Clusters::Actions::EndpointListTypeEnum> &);
-typedef void (*OtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback)(
+typedef void (*OTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback)(
     void *, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction);
-typedef void (*NullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback)(
+typedef void (*NullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback)(
     void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction> &);
-typedef void (*OtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback)(
+typedef void (*OTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback)(
     void *, chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol);
-typedef void (*NullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback)(
+typedef void (*NullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback)(
     void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol> &);
-typedef void (*OtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback)(
+typedef void (*OTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback)(
     void *, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus);
-typedef void (*NullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback)(
+typedef void (*NullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback)(
     void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus> &);
-typedef void (*OtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback)(
+typedef void (*OTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback)(
     void *, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason);
-typedef void (*NullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback)(
+typedef void (*NullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback)(
     void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason> &);
-typedef void (*OtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback)(
+typedef void (*OTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback)(
     void *, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum);
-typedef void (*NullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback)(
+typedef void (*NullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback)(
     void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum> &);
-typedef void (*OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback)(
+typedef void (*OTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback)(
     void *, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum);
-typedef void (*NullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback)(
+typedef void (*NullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback)(
     void *, const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum> &);
 typedef void (*TimeFormatLocalizationClusterCalendarTypeAttributeCallback)(
     void *, chip::app::Clusters::TimeFormatLocalization::CalendarType);
@@ -601,7 +601,7 @@
                                                                 const chip::app::DataModel::DecodableList<chip::CommandId> & data);
 typedef void (*BindingAttributeListListAttributeCallback)(void * context,
                                                           const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
-typedef void (*AccessControlAclListAttributeCallback)(
+typedef void (*AccessControlACLListAttributeCallback)(
     void * context,
     const chip::app::DataModel::DecodableList<chip::app::Clusters::AccessControl::Structs::AccessControlEntry::DecodableType> &
         data);
@@ -634,21 +634,21 @@
                                                               const chip::app::DataModel::DecodableList<chip::CommandId> & data);
 typedef void (*BasicAttributeListListAttributeCallback)(void * context,
                                                         const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
-typedef void (*OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback)(
+typedef void (*OTASoftwareUpdateProviderGeneratedCommandListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
-typedef void (*OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback)(
+typedef void (*OTASoftwareUpdateProviderAcceptedCommandListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
-typedef void (*OtaSoftwareUpdateProviderAttributeListListAttributeCallback)(
+typedef void (*OTASoftwareUpdateProviderAttributeListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
-typedef void (*OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback)(
+typedef void (*OTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback)(
     void * context,
     const chip::app::DataModel::DecodableList<
         chip::app::Clusters::OtaSoftwareUpdateRequestor::Structs::ProviderLocation::DecodableType> & data);
-typedef void (*OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback)(
+typedef void (*OTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
-typedef void (*OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback)(
+typedef void (*OTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
-typedef void (*OtaSoftwareUpdateRequestorAttributeListListAttributeCallback)(
+typedef void (*OTASoftwareUpdateRequestorAttributeListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
 typedef void (*LocalizationConfigurationSupportedLocalesListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::CharSpan> & data);
@@ -965,11 +965,11 @@
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
 typedef void (*OccupancySensingAttributeListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
-typedef void (*WakeOnLanGeneratedCommandListListAttributeCallback)(
+typedef void (*WakeOnLANGeneratedCommandListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
-typedef void (*WakeOnLanAcceptedCommandListListAttributeCallback)(
+typedef void (*WakeOnLANAcceptedCommandListListAttributeCallback)(
     void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & data);
-typedef void (*WakeOnLanAttributeListListAttributeCallback)(void * context,
+typedef void (*WakeOnLANAttributeListListAttributeCallback)(void * context,
                                                             const chip::app::DataModel::DecodableList<chip::AttributeId> & data);
 typedef void (*ChannelChannelListListAttributeCallback)(
     void * context,
@@ -3008,14 +3008,14 @@
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRAccessControlAclListAttributeCallbackBridge : public MTRCallbackBridge<AccessControlAclListAttributeCallback>
+class MTRAccessControlACLListAttributeCallbackBridge : public MTRCallbackBridge<AccessControlACLListAttributeCallback>
 {
 public:
-    MTRAccessControlAclListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<AccessControlAclListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTRAccessControlACLListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<AccessControlACLListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRAccessControlAclListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
-        MTRCallbackBridge<AccessControlAclListAttributeCallback>(queue, handler, action, OnSuccessFn){};
+    MTRAccessControlACLListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<AccessControlACLListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(
         void * context,
@@ -3023,19 +3023,19 @@
             value);
 };
 
-class MTRAccessControlAclListAttributeCallbackSubscriptionBridge : public MTRAccessControlAclListAttributeCallbackBridge
+class MTRAccessControlACLListAttributeCallbackSubscriptionBridge : public MTRAccessControlACLListAttributeCallbackBridge
 {
 public:
-    MTRAccessControlAclListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTRAccessControlACLListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action,
                                                                MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRAccessControlAclListAttributeCallbackBridge(queue, handler, action),
+        MTRAccessControlACLListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRAccessControlAclListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRAccessControlAclListAttributeCallbackBridge::OnDone;
+    using MTRAccessControlACLListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRAccessControlACLListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -3461,116 +3461,116 @@
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback>
+class MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateProviderGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<OTASoftwareUpdateProviderGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
 
-class MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge
+class MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateProviderGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback>
+class MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateProviderAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
+        MTRCallbackBridge<OTASoftwareUpdateProviderAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
 
-class MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge
+class MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateProviderAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateProviderAttributeListListAttributeCallback>
+class MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateProviderAttributeListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
+        MTRCallbackBridge<OTASoftwareUpdateProviderAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
 
-class MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge
+class MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateProviderAttributeListListAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateProviderAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>
+class MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<OTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};
 
     static void OnSuccessFn(void * context,
@@ -3578,121 +3578,121 @@
                                 chip::app::Clusters::OtaSoftwareUpdateRequestor::Structs::ProviderLocation::DecodableType> & value);
 };
 
-class MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge
+class MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateRequestorDefaultOtaProvidersListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>
+class MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                  MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<OTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallback>(queue, handler, action,
                                                                                                OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
 
-class MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge
+class MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateRequestorGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>
+class MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                 MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<OTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallback>(queue, handler, action,
                                                                                               OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
 
-class MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge
+class MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateRequestorAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateRequestorAttributeListListAttributeCallback>
+class MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateRequestorAttributeListListAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                           MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
+        MTRCallbackBridge<OTASoftwareUpdateRequestorAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
 
-class MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge
+class MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateRequestorAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -8548,97 +8548,97 @@
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge
-    : public MTRCallbackBridge<WakeOnLanGeneratedCommandListListAttributeCallback>
+class MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge
+    : public MTRCallbackBridge<WakeOnLANGeneratedCommandListListAttributeCallback>
 {
 public:
-    MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<WakeOnLanGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WakeOnLANGeneratedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                 MTRActionBlock action) :
-        MTRCallbackBridge<WakeOnLanGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
+        MTRCallbackBridge<WakeOnLANGeneratedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
 
-class MTRWakeOnLanGeneratedCommandListListAttributeCallbackSubscriptionBridge
-    : public MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge
+class MTRWakeOnLANGeneratedCommandListListAttributeCallbackSubscriptionBridge
+    : public MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge
 {
 public:
-    MTRWakeOnLanGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTRWakeOnLANGeneratedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                             MTRActionBlock action,
                                                                             MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
+        MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRWakeOnLanGeneratedCommandListListAttributeCallbackBridge::OnDone;
+    using MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWakeOnLANGeneratedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge
-    : public MTRCallbackBridge<WakeOnLanAcceptedCommandListListAttributeCallback>
+class MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge
+    : public MTRCallbackBridge<WakeOnLANAcceptedCommandListListAttributeCallback>
 {
 public:
-    MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<WakeOnLanAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WakeOnLANAcceptedCommandListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                MTRActionBlock action) :
-        MTRCallbackBridge<WakeOnLanAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
+        MTRCallbackBridge<WakeOnLANAcceptedCommandListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::CommandId> & value);
 };
 
-class MTRWakeOnLanAcceptedCommandListListAttributeCallbackSubscriptionBridge
-    : public MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge
+class MTRWakeOnLANAcceptedCommandListListAttributeCallbackSubscriptionBridge
+    : public MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge
 {
 public:
-    MTRWakeOnLanAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTRWakeOnLANAcceptedCommandListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                            MTRActionBlock action,
                                                                            MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
+        MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRWakeOnLanAcceptedCommandListListAttributeCallbackBridge::OnDone;
+    using MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWakeOnLANAcceptedCommandListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRWakeOnLanAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<WakeOnLanAttributeListListAttributeCallback>
+class MTRWakeOnLANAttributeListListAttributeCallbackBridge : public MTRCallbackBridge<WakeOnLANAttributeListListAttributeCallback>
 {
 public:
-    MTRWakeOnLanAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<WakeOnLanAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTRWakeOnLANAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<WakeOnLANAttributeListListAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRWakeOnLanAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
-        MTRCallbackBridge<WakeOnLanAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
+    MTRWakeOnLANAttributeListListAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action) :
+        MTRCallbackBridge<WakeOnLANAttributeListListAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, const chip::app::DataModel::DecodableList<chip::AttributeId> & value);
 };
 
-class MTRWakeOnLanAttributeListListAttributeCallbackSubscriptionBridge : public MTRWakeOnLanAttributeListListAttributeCallbackBridge
+class MTRWakeOnLANAttributeListListAttributeCallbackSubscriptionBridge : public MTRWakeOnLANAttributeListListAttributeCallbackBridge
 {
 public:
-    MTRWakeOnLanAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTRWakeOnLANAttributeListListAttributeCallbackSubscriptionBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                      MTRActionBlock action,
                                                                      MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRWakeOnLanAttributeListListAttributeCallbackBridge(queue, handler, action),
+        MTRWakeOnLANAttributeListListAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRWakeOnLanAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRWakeOnLanAttributeListListAttributeCallbackBridge::OnDone;
+    using MTRWakeOnLANAttributeListListAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRWakeOnLANAttributeListListAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
@@ -11010,32 +11010,32 @@
     static void OnSuccessFn(void * context, const chip::app::Clusters::Scenes::Commands::CopySceneResponse::DecodableType & data);
 };
 
-class MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType>
+class MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                         MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, action, OnSuccessFn){};
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
                 const chip::app::Clusters::OtaSoftwareUpdateProvider::Commands::QueryImageResponse::DecodableType & data);
 };
 
-class MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>
+class MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                          MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, action, OnSuccessFn){};
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType>(queue, handler, action, OnSuccessFn){};
 
     static void
     OnSuccessFn(void * context,
@@ -12694,54 +12694,54 @@
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>
+class MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
+    MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, OnSuccessFn){};
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction value);
 };
 
-class MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
+class MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
-    : public MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>
+class MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
+    : public MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>
 {
 public:
-    MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler,
+        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};
 
-    MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};
 
     static void
@@ -12749,72 +12749,72 @@
                 const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAApplyUpdateAction> & value);
 };
 
-class MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge
-    : public MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
+class MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge
+    : public MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge
 {
 public:
-    MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge(
+    MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action),
+        MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRNullableOtaSoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnDone;
+    using MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOTASoftwareUpdateProviderClusterOTAApplyUpdateActionAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>
+class MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol value);
 };
 
-class MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
+class MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
-    : public MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>
+class MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
+    : public MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>
 {
 public:
-    MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler,
+        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};
 
-    MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};
 
     static void
@@ -12822,70 +12822,70 @@
                 const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTADownloadProtocol> & value);
 };
 
-class MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge
-    : public MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
+class MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge
+    : public MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge
 {
 public:
-    MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge(
+    MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action),
+        MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRNullableOtaSoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnDone;
+    using MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOTASoftwareUpdateProviderClusterOTADownloadProtocolAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>
+class MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                              MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
+        MTRCallbackBridge<OTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, action, OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus value);
 };
 
-class MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
+class MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
-    : public MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>
+class MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
+    : public MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>
 {
 public:
-    MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn){};
+        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<NullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};
 
     static void
@@ -12893,74 +12893,74 @@
                 const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateProvider::OTAQueryStatus> & value);
 };
 
-class MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge
-    : public MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
+class MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge
+    : public MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge
 {
 public:
-    MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge(
+    MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action),
+        MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRNullableOtaSoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnDone;
+    using MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOTASoftwareUpdateProviderClusterOTAQueryStatusAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>
+class MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
+    MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, OnSuccessFn){};
+        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
+    MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                      ResponseHandler handler,
                                                                                      MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, action,
                                                                                                    OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason value);
 };
 
-class MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
+class MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
-    : public MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>
+class MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
+    : public MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>
 {
 public:
-    MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler,
+        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler,
                                                                                                            OnSuccessFn){};
 
-    MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                              ResponseHandler handler,
                                                                                              MTRActionBlock action) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallback>(queue, handler, action,
                                                                                                            OnSuccessFn){};
 
     static void OnSuccessFn(
@@ -12968,73 +12968,73 @@
         const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAAnnouncementReason> & value);
 };
 
-class MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge
-    : public MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
+class MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge
+    : public MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge
 {
 public:
-    MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge(
+    MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action),
+        MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnDone;
+    using MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOTASoftwareUpdateRequestorClusterOTAAnnouncementReasonAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>
+class MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
+    MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                    ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, OnSuccessFn){};
+        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                    MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, action,
                                                                                                  OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum value);
 };
 
-class MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
+class MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
-    : public MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>
+class MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
+    : public MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>
 {
 public:
-    MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler,
+        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler,
                                                                                                          OnSuccessFn){};
 
-    MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                            ResponseHandler handler,
                                                                                            MTRActionBlock action) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallback>(queue, handler, action,
                                                                                                          OnSuccessFn){};
 
     static void
@@ -13042,72 +13042,72 @@
                 const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAChangeReasonEnum> & value);
 };
 
-class MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge
-    : public MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
+class MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge
+    : public MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge
 {
 public:
-    MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge(
+    MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action),
+        MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnDone;
+    using MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOTASoftwareUpdateRequestorClusterOTAChangeReasonEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
-    : public MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>
+class MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
+    : public MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>
 {
 public:
-    MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};
+    MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler) :
+        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, OnSuccessFn){};
 
-    MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
+    MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue, ResponseHandler handler,
                                                                                   MTRActionBlock action) :
-        MTRCallbackBridge<OtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<OTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, action,
                                                                                                 OnSuccessFn){};
 
     static void OnSuccessFn(void * context, chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum value);
 };
 
-class MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge
-    : public MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
+class MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge
+    : public MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
 {
 public:
-    MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge(
+    MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action),
+        MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTROtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnDone;
+    using MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTROTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
 };
 
-class MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
-    : public MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>
+class MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
+    : public MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>
 {
 public:
-    MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler,
+        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler,
                                                                                                         OnSuccessFn){};
 
-    MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue,
+    MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(dispatch_queue_t queue,
                                                                                           ResponseHandler handler,
                                                                                           MTRActionBlock action) :
-        MTRCallbackBridge<NullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, action,
+        MTRCallbackBridge<NullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallback>(queue, handler, action,
                                                                                                         OnSuccessFn){};
 
     static void
@@ -13115,20 +13115,20 @@
                 const chip::app::DataModel::Nullable<chip::app::Clusters::OtaSoftwareUpdateRequestor::OTAUpdateStateEnum> & value);
 };
 
-class MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge
-    : public MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
+class MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge
+    : public MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge
 {
 public:
-    MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge(
+    MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackSubscriptionBridge(
         dispatch_queue_t queue, ResponseHandler handler, MTRActionBlock action,
         MTRSubscriptionEstablishedHandler establishedHandler) :
-        MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action),
+        MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge(queue, handler, action),
         mEstablishedHandler(establishedHandler)
     {}
 
     void OnSubscriptionEstablished();
-    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
-    using MTRNullableOtaSoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnDone;
+    using MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::KeepAliveOnCallback;
+    using MTRNullableOTASoftwareUpdateRequestorClusterOTAUpdateStateEnumAttributeCallbackBridge::OnDone;
 
 private:
     MTRSubscriptionEstablishedHandler mEstablishedHandler;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
index a4a8a00..63896e7 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h
@@ -114,8 +114,8 @@
     MTRClusterIDTypeAccessControlID MTR_NEWLY_AVAILABLE = 0x0000001F,
     MTRClusterIDTypeActionsID MTR_NEWLY_AVAILABLE = 0x00000025,
     MTRClusterIDTypeBasicID MTR_NEWLY_AVAILABLE = 0x00000028,
-    MTRClusterIDTypeOtaSoftwareUpdateProviderID MTR_NEWLY_AVAILABLE = 0x00000029,
-    MTRClusterIDTypeOtaSoftwareUpdateRequestorID MTR_NEWLY_AVAILABLE = 0x0000002A,
+    MTRClusterIDTypeOTASoftwareUpdateProviderID MTR_NEWLY_AVAILABLE = 0x00000029,
+    MTRClusterIDTypeOTASoftwareUpdateRequestorID MTR_NEWLY_AVAILABLE = 0x0000002A,
     MTRClusterIDTypeLocalizationConfigurationID MTR_NEWLY_AVAILABLE = 0x0000002B,
     MTRClusterIDTypeTimeFormatLocalizationID MTR_NEWLY_AVAILABLE = 0x0000002C,
     MTRClusterIDTypeUnitLocalizationID MTR_NEWLY_AVAILABLE = 0x0000002D,
@@ -157,7 +157,7 @@
     MTRClusterIDTypeFlowMeasurementID MTR_NEWLY_AVAILABLE = 0x00000404,
     MTRClusterIDTypeRelativeHumidityMeasurementID MTR_NEWLY_AVAILABLE = 0x00000405,
     MTRClusterIDTypeOccupancySensingID MTR_NEWLY_AVAILABLE = 0x00000406,
-    MTRClusterIDTypeWakeOnLanID MTR_NEWLY_AVAILABLE = 0x00000503,
+    MTRClusterIDTypeWakeOnLANID MTR_NEWLY_AVAILABLE = 0x00000503,
     MTRClusterIDTypeChannelID MTR_NEWLY_AVAILABLE = 0x00000504,
     MTRClusterIDTypeTargetNavigatorID MTR_NEWLY_AVAILABLE = 0x00000505,
     MTRClusterIDTypeMediaPlaybackID MTR_NEWLY_AVAILABLE = 0x00000506,
@@ -675,7 +675,7 @@
     = MTRClusterGlobalAttributeClusterRevisionID,
 
     // Cluster AccessControl attributes
-    MTRAttributeIDTypeClusterAccessControlAttributeAclID MTR_NEWLY_AVAILABLE = 0x00000000,
+    MTRAttributeIDTypeClusterAccessControlAttributeACLID MTR_NEWLY_AVAILABLE = 0x00000000,
     MTRAttributeIDTypeClusterAccessControlAttributeExtensionID MTR_NEWLY_AVAILABLE = 0x00000001,
     MTRAttributeIDTypeClusterAccessControlAttributeSubjectsPerAccessControlEntryID MTR_NEWLY_AVAILABLE = 0x00000002,
     MTRAttributeIDTypeClusterAccessControlAttributeTargetsPerAccessControlEntryID MTR_NEWLY_AVAILABLE = 0x00000003,
@@ -837,16 +837,16 @@
         "Please use MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeClusterRevisionID")
     = MTRClusterGlobalAttributeClusterRevisionID,
 
-    // Cluster OtaSoftwareUpdateProvider attributes
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE
+    // Cluster OTASoftwareUpdateProvider attributes
+    MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeAttributeListID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeAttributeListID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeAttributeListID,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeFeatureMapID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeFeatureMapID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeFeatureMapID,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeClusterRevisionID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeClusterRevisionID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeClusterRevisionID,
 
     // Cluster OtaSoftwareUpdateRequestor deprecated attribute names
@@ -878,20 +878,20 @@
         "Please use MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeClusterRevisionID")
     = MTRClusterGlobalAttributeClusterRevisionID,
 
-    // Cluster OtaSoftwareUpdateRequestor attributes
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeDefaultOtaProvidersID MTR_NEWLY_AVAILABLE = 0x00000000,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeUpdatePossibleID MTR_NEWLY_AVAILABLE = 0x00000001,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeUpdateStateID MTR_NEWLY_AVAILABLE = 0x00000002,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeUpdateStateProgressID MTR_NEWLY_AVAILABLE = 0x00000003,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE
+    // Cluster OTASoftwareUpdateRequestor attributes
+    MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeDefaultOtaProvidersID MTR_NEWLY_AVAILABLE = 0x00000000,
+    MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeUpdatePossibleID MTR_NEWLY_AVAILABLE = 0x00000001,
+    MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeUpdateStateID MTR_NEWLY_AVAILABLE = 0x00000002,
+    MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeUpdateStateProgressID MTR_NEWLY_AVAILABLE = 0x00000003,
+    MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeAttributeListID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeAttributeListID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeAttributeListID,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeFeatureMapID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeFeatureMapID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeFeatureMapID,
-    MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeClusterRevisionID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeClusterRevisionID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeClusterRevisionID,
 
     // Cluster LocalizationConfiguration deprecated attribute names
@@ -3870,9 +3870,9 @@
     MTRAttributeIDTypeClusterOccupancySensingAttributeOccupancyID MTR_NEWLY_AVAILABLE = 0x00000000,
     MTRAttributeIDTypeClusterOccupancySensingAttributeOccupancySensorTypeID MTR_NEWLY_AVAILABLE = 0x00000001,
     MTRAttributeIDTypeClusterOccupancySensingAttributeOccupancySensorTypeBitmapID MTR_NEWLY_AVAILABLE = 0x00000002,
-    MTRAttributeIDTypeClusterOccupancySensingAttributePirOccupiedToUnoccupiedDelayID MTR_NEWLY_AVAILABLE = 0x00000010,
-    MTRAttributeIDTypeClusterOccupancySensingAttributePirUnoccupiedToOccupiedDelayID MTR_NEWLY_AVAILABLE = 0x00000011,
-    MTRAttributeIDTypeClusterOccupancySensingAttributePirUnoccupiedToOccupiedThresholdID MTR_NEWLY_AVAILABLE = 0x00000012,
+    MTRAttributeIDTypeClusterOccupancySensingAttributePIROccupiedToUnoccupiedDelayID MTR_NEWLY_AVAILABLE = 0x00000010,
+    MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedDelayID MTR_NEWLY_AVAILABLE = 0x00000011,
+    MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedThresholdID MTR_NEWLY_AVAILABLE = 0x00000012,
     MTRAttributeIDTypeClusterOccupancySensingAttributeUltrasonicOccupiedToUnoccupiedDelayID MTR_NEWLY_AVAILABLE = 0x00000020,
     MTRAttributeIDTypeClusterOccupancySensingAttributeUltrasonicUnoccupiedToOccupiedDelayID MTR_NEWLY_AVAILABLE = 0x00000021,
     MTRAttributeIDTypeClusterOccupancySensingAttributeUltrasonicUnoccupiedToOccupiedThresholdID MTR_NEWLY_AVAILABLE = 0x00000022,
@@ -3911,16 +3911,16 @@
         "Please use MTRAttributeIDTypeClusterWakeOnLanAttributeClusterRevisionID")
     = MTRClusterGlobalAttributeClusterRevisionID,
 
-    // Cluster WakeOnLan attributes
-    MTRAttributeIDTypeClusterWakeOnLanAttributeMACAddressID MTR_NEWLY_AVAILABLE = 0x00000000,
-    MTRAttributeIDTypeClusterWakeOnLanAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE
+    // Cluster WakeOnLAN attributes
+    MTRAttributeIDTypeClusterWakeOnLANAttributeMACAddressID MTR_NEWLY_AVAILABLE = 0x00000000,
+    MTRAttributeIDTypeClusterWakeOnLANAttributeGeneratedCommandListID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID,
-    MTRAttributeIDTypeClusterWakeOnLanAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterWakeOnLANAttributeAcceptedCommandListID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID,
-    MTRAttributeIDTypeClusterWakeOnLanAttributeAttributeListID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterWakeOnLANAttributeAttributeListID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeAttributeListID,
-    MTRAttributeIDTypeClusterWakeOnLanAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID,
-    MTRAttributeIDTypeClusterWakeOnLanAttributeClusterRevisionID MTR_NEWLY_AVAILABLE
+    MTRAttributeIDTypeClusterWakeOnLANAttributeFeatureMapID MTR_NEWLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID,
+    MTRAttributeIDTypeClusterWakeOnLANAttributeClusterRevisionID MTR_NEWLY_AVAILABLE
     = MTRAttributeIDTypeGlobalAttributeClusterRevisionID,
 
     // Cluster Channel deprecated attribute names
@@ -5511,20 +5511,20 @@
         "Please use MTRCommandIDTypeClusterOtaSoftwareUpdateProviderCommandNotifyUpdateAppliedID")
     = 0x00000004,
 
-    // Cluster OtaSoftwareUpdateProvider commands
-    MTRCommandIDTypeClusterOtaSoftwareUpdateProviderCommandQueryImageID MTR_NEWLY_AVAILABLE = 0x00000000,
-    MTRCommandIDTypeClusterOtaSoftwareUpdateProviderCommandQueryImageResponseID MTR_NEWLY_AVAILABLE = 0x00000001,
-    MTRCommandIDTypeClusterOtaSoftwareUpdateProviderCommandApplyUpdateRequestID MTR_NEWLY_AVAILABLE = 0x00000002,
-    MTRCommandIDTypeClusterOtaSoftwareUpdateProviderCommandApplyUpdateResponseID MTR_NEWLY_AVAILABLE = 0x00000003,
-    MTRCommandIDTypeClusterOtaSoftwareUpdateProviderCommandNotifyUpdateAppliedID MTR_NEWLY_AVAILABLE = 0x00000004,
+    // Cluster OTASoftwareUpdateProvider commands
+    MTRCommandIDTypeClusterOTASoftwareUpdateProviderCommandQueryImageID MTR_NEWLY_AVAILABLE = 0x00000000,
+    MTRCommandIDTypeClusterOTASoftwareUpdateProviderCommandQueryImageResponseID MTR_NEWLY_AVAILABLE = 0x00000001,
+    MTRCommandIDTypeClusterOTASoftwareUpdateProviderCommandApplyUpdateRequestID MTR_NEWLY_AVAILABLE = 0x00000002,
+    MTRCommandIDTypeClusterOTASoftwareUpdateProviderCommandApplyUpdateResponseID MTR_NEWLY_AVAILABLE = 0x00000003,
+    MTRCommandIDTypeClusterOTASoftwareUpdateProviderCommandNotifyUpdateAppliedID MTR_NEWLY_AVAILABLE = 0x00000004,
 
     // Cluster OtaSoftwareUpdateRequestor deprecated command id names
     MTRClusterOtaSoftwareUpdateRequestorCommandAnnounceOtaProviderID MTR_NEWLY_DEPRECATED(
         "Please use MTRCommandIDTypeClusterOtaSoftwareUpdateRequestorCommandAnnounceOtaProviderID")
     = 0x00000000,
 
-    // Cluster OtaSoftwareUpdateRequestor commands
-    MTRCommandIDTypeClusterOtaSoftwareUpdateRequestorCommandAnnounceOtaProviderID MTR_NEWLY_AVAILABLE = 0x00000000,
+    // Cluster OTASoftwareUpdateRequestor commands
+    MTRCommandIDTypeClusterOTASoftwareUpdateRequestorCommandAnnounceOtaProviderID MTR_NEWLY_AVAILABLE = 0x00000000,
 
     // Cluster GeneralCommissioning deprecated command id names
     MTRClusterGeneralCommissioningCommandArmFailSafeID MTR_NEWLY_DEPRECATED(
@@ -6402,10 +6402,10 @@
         "Please use MTREventIDTypeClusterOtaSoftwareUpdateRequestorEventDownloadErrorID")
     = 0x00000002,
 
-    // Cluster OtaSoftwareUpdateRequestor events
-    MTREventIDTypeClusterOtaSoftwareUpdateRequestorEventStateTransitionID MTR_NEWLY_AVAILABLE = 0x00000000,
-    MTREventIDTypeClusterOtaSoftwareUpdateRequestorEventVersionAppliedID MTR_NEWLY_AVAILABLE = 0x00000001,
-    MTREventIDTypeClusterOtaSoftwareUpdateRequestorEventDownloadErrorID MTR_NEWLY_AVAILABLE = 0x00000002,
+    // Cluster OTASoftwareUpdateRequestor events
+    MTREventIDTypeClusterOTASoftwareUpdateRequestorEventStateTransitionID MTR_NEWLY_AVAILABLE = 0x00000000,
+    MTREventIDTypeClusterOTASoftwareUpdateRequestorEventVersionAppliedID MTR_NEWLY_AVAILABLE = 0x00000001,
+    MTREventIDTypeClusterOTASoftwareUpdateRequestorEventDownloadErrorID MTR_NEWLY_AVAILABLE = 0x00000002,
 
     // Cluster GeneralDiagnostics deprecated event names
     MTRClusterGeneralDiagnosticsEventHardwareFaultChangeID MTR_NEWLY_DEPRECATED(
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
index 17c8336..5abf133 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h
@@ -543,7 +543,7 @@
                               endpointID:(NSNumber *)endpointID
                                    queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER MTR_NEWLY_AVAILABLE;
 
-- (NSDictionary<NSString *, id> *)readAttributeDeviceListWithParams:(MTRReadParams * _Nullable)params;
+- (NSDictionary<NSString *, id> *)readAttributeDeviceTypeListWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE;
 
 - (NSDictionary<NSString *, id> *)readAttributeServerListWithParams:(MTRReadParams * _Nullable)params;
 
@@ -611,12 +611,12 @@
                               endpointID:(NSNumber *)endpointID
                                    queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER MTR_NEWLY_AVAILABLE;
 
-- (NSDictionary<NSString *, id> *)readAttributeAclWithParams:(MTRReadParams * _Nullable)params;
-- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
-             expectedValueInterval:(NSNumber *)expectedValueIntervalMs;
-- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (NSDictionary<NSString *, id> *)readAttributeACLWithParams:(MTRReadParams * _Nullable)params MTR_NEWLY_AVAILABLE;
+- (void)writeAttributeACLWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+             expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_NEWLY_AVAILABLE;
+- (void)writeAttributeACLWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
-                            params:(MTRWriteParams * _Nullable)params;
+                            params:(MTRWriteParams * _Nullable)params MTR_NEWLY_AVAILABLE;
 
 - (NSDictionary<NSString *, id> *)readAttributeExtensionWithParams:(MTRReadParams * _Nullable)params;
 - (void)writeAttributeExtensionWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
@@ -820,23 +820,24 @@
  * Cluster OTA Software Update Provider
  *    Provides an interface for providing OTA software updates
  */
-@interface MTRClusterOtaSoftwareUpdateProvider : MTRCluster
+MTR_NEWLY_AVAILABLE
+@interface MTRClusterOTASoftwareUpdateProvider : MTRCluster
 
 - (instancetype _Nullable)initWithDevice:(MTRDevice *)device
                               endpointID:(NSNumber *)endpointID
                                    queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER MTR_NEWLY_AVAILABLE;
 
-- (void)queryImageWithParams:(MTROtaSoftwareUpdateProviderClusterQueryImageParams *)params
+- (void)queryImageWithParams:(MTROTASoftwareUpdateProviderClusterQueryImageParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
        expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
-                  completion:(void (^)(MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
+                  completion:(void (^)(MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
                                  NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
-- (void)applyUpdateRequestWithParams:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
+- (void)applyUpdateRequestWithParams:(MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
-                          completion:(void (^)(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
+                          completion:(void (^)(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                          NSError * _Nullable error))completion MTR_NEWLY_AVAILABLE;
-- (void)notifyUpdateAppliedWithParams:(MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
+- (void)notifyUpdateAppliedWithParams:(MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
@@ -860,13 +861,14 @@
  * Cluster OTA Software Update Requestor
  *    Provides an interface for downloading and applying OTA software updates
  */
-@interface MTRClusterOtaSoftwareUpdateRequestor : MTRCluster
+MTR_NEWLY_AVAILABLE
+@interface MTRClusterOTASoftwareUpdateRequestor : MTRCluster
 
 - (instancetype _Nullable)initWithDevice:(MTRDevice *)device
                               endpointID:(NSNumber *)endpointID
                                    queue:(dispatch_queue_t)queue NS_DESIGNATED_INITIALIZER MTR_NEWLY_AVAILABLE;
 
-- (void)announceOtaProviderWithParams:(MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
+- (void)announceOtaProviderWithParams:(MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> * _Nullable)expectedDataValueDictionaries
                 expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion MTR_NEWLY_AVAILABLE;
@@ -3609,26 +3611,29 @@
 
 - (NSDictionary<NSString *, id> *)readAttributeOccupancySensorTypeBitmapWithParams:(MTRReadParams * _Nullable)params;
 
-- (NSDictionary<NSString *, id> *)readAttributePirOccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params;
-- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
-                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs;
-- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (NSDictionary<NSString *, id> *)readAttributePIROccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params
+    MTR_NEWLY_AVAILABLE;
+- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_NEWLY_AVAILABLE;
+- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
-                                                     params:(MTRWriteParams * _Nullable)params;
+                                                     params:(MTRWriteParams * _Nullable)params MTR_NEWLY_AVAILABLE;
 
-- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params;
-- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
-                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs;
-- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (NSDictionary<NSString *, id> *)readAttributePIRUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params
+    MTR_NEWLY_AVAILABLE;
+- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_NEWLY_AVAILABLE;
+- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
-                                                     params:(MTRWriteParams * _Nullable)params;
+                                                     params:(MTRWriteParams * _Nullable)params MTR_NEWLY_AVAILABLE;
 
-- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedThresholdWithParams:(MTRReadParams * _Nullable)params;
-- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
-                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs;
-- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (NSDictionary<NSString *, id> *)readAttributePIRUnoccupiedToOccupiedThresholdWithParams:(MTRReadParams * _Nullable)params
+    MTR_NEWLY_AVAILABLE;
+- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_NEWLY_AVAILABLE;
+- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
-                                                         params:(MTRWriteParams * _Nullable)params;
+                                                         params:(MTRWriteParams * _Nullable)params MTR_NEWLY_AVAILABLE;
 
 - (NSDictionary<NSString *, id> *)readAttributeUltrasonicOccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params;
 - (void)writeAttributeUltrasonicOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
@@ -3692,7 +3697,8 @@
  * Cluster Wake on LAN
  *    This cluster provides an interface for managing low power mode on a device that supports the Wake On LAN protocol.
  */
-@interface MTRClusterWakeOnLan : MTRCluster
+MTR_NEWLY_AVAILABLE
+@interface MTRClusterWakeOnLAN : MTRCluster
 
 - (instancetype _Nullable)initWithDevice:(MTRDevice *)device
                               endpointID:(NSNumber *)endpointID
@@ -5303,15 +5309,12 @@
                                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                       params:(MTRWriteParams * _Nullable)params;
 
-- (NSDictionary<NSString *, id> *)readAttributeWriteOnlyInt8uWithParams:(MTRReadParams * _Nullable)params
-    API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2));
+- (NSDictionary<NSString *, id> *)readAttributeWriteOnlyInt8uWithParams:(MTRReadParams * _Nullable)params;
+- (void)writeAttributeWriteOnlyInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs;
 - (void)writeAttributeWriteOnlyInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                         expectedValueInterval:(NSNumber *)expectedValueIntervalMs
-    API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2));
-- (void)writeAttributeWriteOnlyInt8uWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
-                        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
-                                       params:(MTRWriteParams * _Nullable)params
-    API_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2));
+                                       params:(MTRWriteParams * _Nullable)params;
 
 - (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params;
 
@@ -5328,6 +5331,18 @@
 
 @end
 
+MTR_NEWLY_DEPRECATED("Please use MTRClusterOTASoftwareUpdateProvider")
+@interface MTRClusterOtaSoftwareUpdateProvider : MTRClusterOTASoftwareUpdateProvider
+@end
+
+MTR_NEWLY_DEPRECATED("Please use MTRClusterOTASoftwareUpdateRequestor")
+@interface MTRClusterOtaSoftwareUpdateRequestor : MTRClusterOTASoftwareUpdateRequestor
+@end
+
+MTR_NEWLY_DEPRECATED("Please use MTRClusterWakeOnLAN")
+@interface MTRClusterWakeOnLan : MTRClusterWakeOnLAN
+@end
+
 MTR_NEWLY_DEPRECATED("Please use MTRClusterUnitTesting")
 @interface MTRClusterTestCluster : MTRClusterUnitTesting
 @end
@@ -5592,6 +5607,8 @@
                                endpoint:(uint16_t)endpoint
                                   queue:(dispatch_queue_t)queue MTR_NEWLY_DEPRECATED("Please use initWithDevice:endpoindID:queue:");
 
+- (NSDictionary<NSString *, id> *)readAttributeDeviceListWithParams:(MTRReadParams * _Nullable)params
+    MTR_NEWLY_DEPRECATED("Please use readAttributeDeviceTypeListWithParams on MTRClusterDescriptor");
 @end
 
 @interface MTRClusterBinding (Deprecated)
@@ -5608,6 +5625,15 @@
                                endpoint:(uint16_t)endpoint
                                   queue:(dispatch_queue_t)queue MTR_NEWLY_DEPRECATED("Please use initWithDevice:endpoindID:queue:");
 
+- (NSDictionary<NSString *, id> *)readAttributeAclWithParams:(MTRReadParams * _Nullable)params
+    MTR_NEWLY_DEPRECATED("Please use readAttributeACLWithParams on MTRClusterAccessControl");
+- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+    MTR_NEWLY_DEPRECATED("Please use writeAtributeACLWithValue on MTRClusterAccessControl");
+- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+                            params:(MTRWriteParams * _Nullable)params
+    MTR_NEWLY_DEPRECATED("Please use writeAttributeACLWithValue on MTRClusterAccessControl");
 @end
 
 @interface MTRClusterActions (Deprecated)
@@ -6505,6 +6531,33 @@
                                endpoint:(uint16_t)endpoint
                                   queue:(dispatch_queue_t)queue MTR_NEWLY_DEPRECATED("Please use initWithDevice:endpoindID:queue:");
 
+- (NSDictionary<NSString *, id> *)readAttributePirOccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params
+    MTR_NEWLY_DEPRECATED("Please use readAttributePIROccupiedToUnoccupiedDelayWithParams on MTRClusterOccupancySensing");
+- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+    MTR_NEWLY_DEPRECATED("Please use writeAtributePIROccupiedToUnoccupiedDelayWithValue on MTRClusterOccupancySensing");
+- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+                                                     params:(MTRWriteParams * _Nullable)params
+    MTR_NEWLY_DEPRECATED("Please use writeAttributePIROccupiedToUnoccupiedDelayWithValue on MTRClusterOccupancySensing");
+- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params
+    MTR_NEWLY_DEPRECATED("Please use readAttributePIRUnoccupiedToOccupiedDelayWithParams on MTRClusterOccupancySensing");
+- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+    MTR_NEWLY_DEPRECATED("Please use writeAtributePIRUnoccupiedToOccupiedDelayWithValue on MTRClusterOccupancySensing");
+- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+                                                     params:(MTRWriteParams * _Nullable)params
+    MTR_NEWLY_DEPRECATED("Please use writeAttributePIRUnoccupiedToOccupiedDelayWithValue on MTRClusterOccupancySensing");
+- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedThresholdWithParams:(MTRReadParams * _Nullable)params
+    MTR_NEWLY_DEPRECATED("Please use readAttributePIRUnoccupiedToOccupiedThresholdWithParams on MTRClusterOccupancySensing");
+- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+    MTR_NEWLY_DEPRECATED("Please use writeAtributePIRUnoccupiedToOccupiedThresholdWithValue on MTRClusterOccupancySensing");
+- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+                                                         params:(MTRWriteParams * _Nullable)params
+    MTR_NEWLY_DEPRECATED("Please use writeAttributePIRUnoccupiedToOccupiedThresholdWithValue on MTRClusterOccupancySensing");
 @end
 
 @interface MTRClusterWakeOnLan (Deprecated)
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
index 2451ca0..f98b645 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.mm
@@ -3644,7 +3644,7 @@
     return self;
 }
 
-- (NSDictionary<NSString *, id> *)readAttributeDeviceListWithParams:(MTRReadParams * _Nullable)params
+- (NSDictionary<NSString *, id> *)readAttributeDeviceTypeListWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
                                           clusterID:@(MTRClusterIDTypeDescriptorID)
@@ -3725,6 +3725,10 @@
     return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
 }
 
+- (NSDictionary<NSString *, id> *)readAttributeDeviceListWithParams:(MTRReadParams * _Nullable)params
+{
+    return [self readAttributeDeviceTypeListWithParams:params];
+}
 @end
 
 @implementation MTRClusterBinding
@@ -3835,20 +3839,20 @@
     return self;
 }
 
-- (NSDictionary<NSString *, id> *)readAttributeAclWithParams:(MTRReadParams * _Nullable)params
+- (NSDictionary<NSString *, id> *)readAttributeACLWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
                                           clusterID:@(MTRClusterIDTypeAccessControlID)
-                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeAclID)
+                                        attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeACLID)
                                              params:params];
 }
 
-- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (void)writeAttributeACLWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
 {
-    [self writeAttributeAclWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
+    [self writeAttributeACLWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:nil];
 }
-- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (void)writeAttributeACLWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
              expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                             params:(MTRWriteParams * _Nullable)params
 {
@@ -3856,7 +3860,7 @@
 
     [self.device writeAttributeWithEndpointID:@(_endpoint)
                                     clusterID:@(MTRClusterIDTypeAccessControlID)
-                                  attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeAclID)
+                                  attributeID:@(MTRAttributeIDTypeClusterAccessControlAttributeACLID)
                                         value:dataValueDictionary
                         expectedValueInterval:expectedValueIntervalMs
                             timedWriteTimeout:timedWriteTimeout];
@@ -3964,6 +3968,21 @@
     return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
 }
 
+- (NSDictionary<NSString *, id> *)readAttributeAclWithParams:(MTRReadParams * _Nullable)params
+{
+    return [self readAttributeACLWithParams:params];
+}
+- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+{
+    [self writeAttributeACLWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs];
+}
+- (void)writeAttributeAclWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+             expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+                            params:(MTRWriteParams * _Nullable)params
+{
+    [self writeAttributeACLWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs params:params];
+}
 @end
 
 @implementation MTRClusterActions
@@ -5215,7 +5234,7 @@
 }
 @end
 
-@implementation MTRClusterOtaSoftwareUpdateProvider
+@implementation MTRClusterOTASoftwareUpdateProvider
 
 - (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
 {
@@ -5230,10 +5249,10 @@
     return self;
 }
 
-- (void)queryImageWithParams:(MTROtaSoftwareUpdateProviderClusterQueryImageParams *)params
+- (void)queryImageWithParams:(MTROTASoftwareUpdateProviderClusterQueryImageParams *)params
               expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
        expectedValueInterval:(NSNumber *)expectedValueIntervalMs
-                  completion:(void (^)(MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
+                  completion:(void (^)(MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data,
                                  NSError * _Nullable error))completion
 {
     // Make a copy of params before we go async.
@@ -5247,7 +5266,7 @@
         MTR_LOG_INFO("OtaSoftwareUpdateProvider QueryImage dequeueWorkItem %@", self.device.asyncCallbackWorkQueue);
         MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                 controller:self.device.deviceController];
-        auto * bridge = new MTROtaSoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(
+        auto * bridge = new MTROTASoftwareUpdateProviderClusterQueryImageResponseCallbackBridge(
             self.callbackQueue,
             ^(id _Nullable value, NSError * _Nullable error) {
                 completion(value, error);
@@ -5255,7 +5274,7 @@
                 [workItem endWork];
             },
             ^(ExchangeManager & exchangeManager, const SessionHandle & session,
-                OtaSoftwareUpdateProviderClusterQueryImageResponseCallbackType successCb, MTRErrorCallback failureCb,
+                OTASoftwareUpdateProviderClusterQueryImageResponseCallbackType successCb, MTRErrorCallback failureCb,
                 MTRCallbackBridgeBase * bridge) {
                 chip::Optional<uint16_t> timedInvokeTimeoutMs;
                 ListFreer listFreer;
@@ -5326,10 +5345,10 @@
     }
 }
 
-- (void)applyUpdateRequestWithParams:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
+- (void)applyUpdateRequestWithParams:(MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
                       expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                expectedValueInterval:(NSNumber *)expectedValueIntervalMs
-                          completion:(void (^)(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
+                          completion:(void (^)(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                          NSError * _Nullable error))completion
 {
     // Make a copy of params before we go async.
@@ -5343,7 +5362,7 @@
         MTR_LOG_INFO("OtaSoftwareUpdateProvider ApplyUpdateRequest dequeueWorkItem %@", self.device.asyncCallbackWorkQueue);
         MTRBaseDevice * baseDevice = [[MTRBaseDevice alloc] initWithNodeID:self.device.nodeID
                                                                 controller:self.device.deviceController];
-        auto * bridge = new MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(
+        auto * bridge = new MTROTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackBridge(
             self.callbackQueue,
             ^(id _Nullable value, NSError * _Nullable error) {
                 completion(value, error);
@@ -5351,7 +5370,7 @@
                 [workItem endWork];
             },
             ^(ExchangeManager & exchangeManager, const SessionHandle & session,
-                OtaSoftwareUpdateProviderClusterApplyUpdateResponseCallbackType successCb, MTRErrorCallback failureCb,
+                OTASoftwareUpdateProviderClusterApplyUpdateResponseCallbackType successCb, MTRErrorCallback failureCb,
                 MTRCallbackBridgeBase * bridge) {
                 chip::Optional<uint16_t> timedInvokeTimeoutMs;
                 ListFreer listFreer;
@@ -5381,7 +5400,7 @@
     }
 }
 
-- (void)notifyUpdateAppliedWithParams:(MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
+- (void)notifyUpdateAppliedWithParams:(MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion
@@ -5438,8 +5457,8 @@
 {
     return [self.device
         readAttributeWithEndpointID:@(_endpoint)
-                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateProviderID)
-                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeGeneratedCommandListID)
+                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
+                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeGeneratedCommandListID)
                              params:params];
 }
 
@@ -5447,37 +5466,40 @@
 {
     return
         [self.device readAttributeWithEndpointID:@(_endpoint)
-                                       clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateProviderID)
-                                     attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeAcceptedCommandListID)
+                                       clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
+                                     attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeAcceptedCommandListID)
                                           params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateProviderID)
-                                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeAttributeListID)
+                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
+                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeAttributeListID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateProviderID)
-                                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeFeatureMapID)
+                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
+                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeFeatureMapID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateProviderID)
-                                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateProviderAttributeClusterRevisionID)
+                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateProviderID)
+                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateProviderAttributeClusterRevisionID)
                                              params:params];
 }
 
 @end
 
+@implementation MTRClusterOtaSoftwareUpdateProvider
+@end
+
 @implementation MTRClusterOtaSoftwareUpdateProvider (Deprecated)
 
 - (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
@@ -5495,7 +5517,7 @@
                 expectedValues:expectedDataValueDictionaries
          expectedValueInterval:expectedValueIntervalMs
                     completion:^(
-                        MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error) {
+                        MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable data, NSError * _Nullable error) {
                         // Cast is safe because subclass does not add any selectors.
                         completionHandler(static_cast<MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams *>(data), error);
                     }];
@@ -5509,7 +5531,7 @@
     [self applyUpdateRequestWithParams:params
                         expectedValues:expectedDataValueDictionaries
                  expectedValueInterval:expectedValueIntervalMs
-                            completion:^(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
+                            completion:^(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable data,
                                 NSError * _Nullable error) {
                                 // Cast is safe because subclass does not add any selectors.
                                 completionHandler(
@@ -5528,7 +5550,7 @@
 }
 @end
 
-@implementation MTRClusterOtaSoftwareUpdateRequestor
+@implementation MTRClusterOTASoftwareUpdateRequestor
 
 - (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
 {
@@ -5543,7 +5565,7 @@
     return self;
 }
 
-- (void)announceOtaProviderWithParams:(MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
+- (void)announceOtaProviderWithParams:(MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams *)params
                        expectedValues:(NSArray<NSDictionary<NSString *, id> *> *)expectedValues
                 expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                            completion:(MTRStatusCompletion)completion
@@ -5608,8 +5630,8 @@
 {
     return [self.device
         readAttributeWithEndpointID:@(_endpoint)
-                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeDefaultOtaProvidersID)
+                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeDefaultOtaProvidersID)
                              params:params];
 }
 
@@ -5625,8 +5647,8 @@
     NSNumber * timedWriteTimeout = params.timedWriteTimeout;
 
     [self.device writeAttributeWithEndpointID:@(_endpoint)
-                                    clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                                  attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeDefaultOtaProvidersID)
+                                    clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                                  attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeDefaultOtaProvidersID)
                                         value:dataValueDictionary
                         expectedValueInterval:expectedValueIntervalMs
                             timedWriteTimeout:timedWriteTimeout];
@@ -5635,16 +5657,16 @@
 - (NSDictionary<NSString *, id> *)readAttributeUpdatePossibleWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeUpdatePossibleID)
+                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeUpdatePossibleID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeUpdateStateWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeUpdateStateID)
+                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeUpdateStateID)
                                              params:params];
 }
 
@@ -5652,8 +5674,8 @@
 {
     return [self.device
         readAttributeWithEndpointID:@(_endpoint)
-                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeUpdateStateProgressID)
+                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeUpdateStateProgressID)
                              params:params];
 }
 
@@ -5661,8 +5683,8 @@
 {
     return [self.device
         readAttributeWithEndpointID:@(_endpoint)
-                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeGeneratedCommandListID)
+                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeGeneratedCommandListID)
                              params:params];
 }
 
@@ -5670,37 +5692,40 @@
 {
     return [self.device
         readAttributeWithEndpointID:@(_endpoint)
-                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeAcceptedCommandListID)
+                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeAcceptedCommandListID)
                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeAttributeListID)
+                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeAttributeListID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeFeatureMapID)
+                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeFeatureMapID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeOtaSoftwareUpdateRequestorID)
-                                        attributeID:@(MTRAttributeIDTypeClusterOtaSoftwareUpdateRequestorAttributeClusterRevisionID)
+                                          clusterID:@(MTRClusterIDTypeOTASoftwareUpdateRequestorID)
+                                        attributeID:@(MTRAttributeIDTypeClusterOTASoftwareUpdateRequestorAttributeClusterRevisionID)
                                              params:params];
 }
 
 @end
 
+@implementation MTRClusterOtaSoftwareUpdateRequestor
+@end
+
 @implementation MTRClusterOtaSoftwareUpdateRequestor (Deprecated)
 
 - (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
@@ -19419,23 +19444,23 @@
                                              params:params];
 }
 
-- (NSDictionary<NSString *, id> *)readAttributePirOccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params
+- (NSDictionary<NSString *, id> *)readAttributePIROccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params
 {
     return
         [self.device readAttributeWithEndpointID:@(_endpoint)
                                        clusterID:@(MTRClusterIDTypeOccupancySensingID)
-                                     attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePirOccupiedToUnoccupiedDelayID)
+                                     attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIROccupiedToUnoccupiedDelayID)
                                           params:params];
 }
 
-- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
 {
-    [self writeAttributePirOccupiedToUnoccupiedDelayWithValue:dataValueDictionary
+    [self writeAttributePIROccupiedToUnoccupiedDelayWithValue:dataValueDictionary
                                         expectedValueInterval:expectedValueIntervalMs
                                                        params:nil];
 }
-- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                      params:(MTRWriteParams * _Nullable)params
 {
@@ -19443,29 +19468,29 @@
 
     [self.device writeAttributeWithEndpointID:@(_endpoint)
                                     clusterID:@(MTRClusterIDTypeOccupancySensingID)
-                                  attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePirOccupiedToUnoccupiedDelayID)
+                                  attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIROccupiedToUnoccupiedDelayID)
                                         value:dataValueDictionary
                         expectedValueInterval:expectedValueIntervalMs
                             timedWriteTimeout:timedWriteTimeout];
 }
 
-- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params
+- (NSDictionary<NSString *, id> *)readAttributePIRUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params
 {
     return
         [self.device readAttributeWithEndpointID:@(_endpoint)
                                        clusterID:@(MTRClusterIDTypeOccupancySensingID)
-                                     attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePirUnoccupiedToOccupiedDelayID)
+                                     attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedDelayID)
                                           params:params];
 }
 
-- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
 {
-    [self writeAttributePirUnoccupiedToOccupiedDelayWithValue:dataValueDictionary
+    [self writeAttributePIRUnoccupiedToOccupiedDelayWithValue:dataValueDictionary
                                         expectedValueInterval:expectedValueIntervalMs
                                                        params:nil];
 }
-- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (void)writeAttributePIRUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                       expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                      params:(MTRWriteParams * _Nullable)params
 {
@@ -19473,29 +19498,29 @@
 
     [self.device writeAttributeWithEndpointID:@(_endpoint)
                                     clusterID:@(MTRClusterIDTypeOccupancySensingID)
-                                  attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePirUnoccupiedToOccupiedDelayID)
+                                  attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedDelayID)
                                         value:dataValueDictionary
                         expectedValueInterval:expectedValueIntervalMs
                             timedWriteTimeout:timedWriteTimeout];
 }
 
-- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedThresholdWithParams:(MTRReadParams * _Nullable)params
+- (NSDictionary<NSString *, id> *)readAttributePIRUnoccupiedToOccupiedThresholdWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device
         readAttributeWithEndpointID:@(_endpoint)
                           clusterID:@(MTRClusterIDTypeOccupancySensingID)
-                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePirUnoccupiedToOccupiedThresholdID)
+                        attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedThresholdID)
                              params:params];
 }
 
-- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
 {
-    [self writeAttributePirUnoccupiedToOccupiedThresholdWithValue:dataValueDictionary
+    [self writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:dataValueDictionary
                                             expectedValueInterval:expectedValueIntervalMs
                                                            params:nil];
 }
-- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+- (void)writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
                                           expectedValueInterval:(NSNumber *)expectedValueIntervalMs
                                                          params:(MTRWriteParams * _Nullable)params
 {
@@ -19504,7 +19529,7 @@
     [self.device
         writeAttributeWithEndpointID:@(_endpoint)
                            clusterID:@(MTRClusterIDTypeOccupancySensingID)
-                         attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePirUnoccupiedToOccupiedThresholdID)
+                         attributeID:@(MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedThresholdID)
                                value:dataValueDictionary
                expectedValueInterval:expectedValueIntervalMs
                    timedWriteTimeout:timedWriteTimeout];
@@ -19748,9 +19773,61 @@
     return [self initWithDevice:device endpointID:@(endpoint) queue:queue];
 }
 
+- (NSDictionary<NSString *, id> *)readAttributePirOccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params
+{
+    return [self readAttributePIROccupiedToUnoccupiedDelayWithParams:params];
+}
+- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+{
+    [self writeAttributePIROccupiedToUnoccupiedDelayWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs];
+}
+- (void)writeAttributePirOccupiedToUnoccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+                                                     params:(MTRWriteParams * _Nullable)params
+{
+    [self writeAttributePIROccupiedToUnoccupiedDelayWithValue:dataValueDictionary
+                                        expectedValueInterval:expectedValueIntervalMs
+                                                       params:params];
+}
+- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedDelayWithParams:(MTRReadParams * _Nullable)params
+{
+    return [self readAttributePIRUnoccupiedToOccupiedDelayWithParams:params];
+}
+- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+{
+    [self writeAttributePIRUnoccupiedToOccupiedDelayWithValue:dataValueDictionary expectedValueInterval:expectedValueIntervalMs];
+}
+- (void)writeAttributePirUnoccupiedToOccupiedDelayWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                      expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+                                                     params:(MTRWriteParams * _Nullable)params
+{
+    [self writeAttributePIRUnoccupiedToOccupiedDelayWithValue:dataValueDictionary
+                                        expectedValueInterval:expectedValueIntervalMs
+                                                       params:params];
+}
+- (NSDictionary<NSString *, id> *)readAttributePirUnoccupiedToOccupiedThresholdWithParams:(MTRReadParams * _Nullable)params
+{
+    return [self readAttributePIRUnoccupiedToOccupiedThresholdWithParams:params];
+}
+- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+{
+    [self writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:dataValueDictionary
+                                            expectedValueInterval:expectedValueIntervalMs];
+}
+- (void)writeAttributePirUnoccupiedToOccupiedThresholdWithValue:(NSDictionary<NSString *, id> *)dataValueDictionary
+                                          expectedValueInterval:(NSNumber *)expectedValueIntervalMs
+                                                         params:(MTRWriteParams * _Nullable)params
+{
+    [self writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:dataValueDictionary
+                                            expectedValueInterval:expectedValueIntervalMs
+                                                           params:params];
+}
 @end
 
-@implementation MTRClusterWakeOnLan
+@implementation MTRClusterWakeOnLAN
 
 - (instancetype)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID queue:(dispatch_queue_t)queue
 {
@@ -19768,53 +19845,56 @@
 - (NSDictionary<NSString *, id> *)readAttributeMACAddressWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeWakeOnLanID)
-                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLanAttributeMACAddressID)
+                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
+                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeMACAddressID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeWakeOnLanID)
-                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLanAttributeGeneratedCommandListID)
+                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
+                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeGeneratedCommandListID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeWakeOnLanID)
-                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLanAttributeAcceptedCommandListID)
+                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
+                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeAcceptedCommandListID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeWakeOnLanID)
-                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLanAttributeAttributeListID)
+                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
+                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeAttributeListID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeWakeOnLanID)
-                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLanAttributeFeatureMapID)
+                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
+                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeFeatureMapID)
                                              params:params];
 }
 
 - (NSDictionary<NSString *, id> *)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params
 {
     return [self.device readAttributeWithEndpointID:@(_endpoint)
-                                          clusterID:@(MTRClusterIDTypeWakeOnLanID)
-                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLanAttributeClusterRevisionID)
+                                          clusterID:@(MTRClusterIDTypeWakeOnLANID)
+                                        attributeID:@(MTRAttributeIDTypeClusterWakeOnLANAttributeClusterRevisionID)
                                              params:params];
 }
 
 @end
 
+@implementation MTRClusterWakeOnLan
+@end
+
 @implementation MTRClusterWakeOnLan (Deprecated)
 
 - (instancetype)initWithDevice:(MTRDevice *)device endpoint:(uint16_t)endpoint queue:(dispatch_queue_t)queue
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters_internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters_internal.h
index b5d6cff..3bcc5e9 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters_internal.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters_internal.h
@@ -83,12 +83,12 @@
 @property (nonatomic, readonly) MTRDevice * device;
 @end
 
-@interface MTRClusterOtaSoftwareUpdateProvider ()
+@interface MTRClusterOTASoftwareUpdateProvider ()
 @property (nonatomic, readonly) uint16_t endpoint;
 @property (nonatomic, readonly) MTRDevice * device;
 @end
 
-@interface MTRClusterOtaSoftwareUpdateRequestor ()
+@interface MTRClusterOTASoftwareUpdateRequestor ()
 @property (nonatomic, readonly) uint16_t endpoint;
 @property (nonatomic, readonly) MTRDevice * device;
 @end
@@ -278,7 +278,7 @@
 @property (nonatomic, readonly) MTRDevice * device;
 @end
 
-@interface MTRClusterWakeOnLan ()
+@interface MTRClusterWakeOnLAN ()
 @property (nonatomic, readonly) uint16_t endpoint;
 @property (nonatomic, readonly) MTRDevice * device;
 @end
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h
index 275e2e4..6ce4208 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h
@@ -1503,7 +1503,8 @@
 - (instancetype)init;
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
-@interface MTROtaSoftwareUpdateProviderClusterQueryImageParams : NSObject <NSCopying>
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateProviderClusterQueryImageParams : NSObject <NSCopying>
 
 @property (nonatomic, copy) NSNumber * _Nonnull vendorId;
 
@@ -1539,7 +1540,13 @@
 - (instancetype)init;
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
-@interface MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams : NSObject <NSCopying>
+
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateProviderClusterQueryImageParams")
+@interface MTROtaSoftwareUpdateProviderClusterQueryImageParams : MTROTASoftwareUpdateProviderClusterQueryImageParams
+@end
+
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateProviderClusterQueryImageResponseParams : NSObject <NSCopying>
 
 @property (nonatomic, copy) NSNumber * _Nonnull status;
 
@@ -1576,7 +1583,13 @@
 - (instancetype)init;
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
-@interface MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams : NSObject <NSCopying>
+
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateProviderClusterQueryImageResponseParams")
+@interface MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams : MTROTASoftwareUpdateProviderClusterQueryImageResponseParams
+@end
+
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams : NSObject <NSCopying>
 
 @property (nonatomic, copy) NSData * _Nonnull updateToken;
 
@@ -1600,7 +1613,13 @@
 - (instancetype)init;
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
-@interface MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams : NSObject <NSCopying>
+
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams")
+@interface MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams : MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams
+@end
+
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams : NSObject <NSCopying>
 
 @property (nonatomic, copy) NSNumber * _Nonnull action;
 
@@ -1625,7 +1644,14 @@
 - (instancetype)init;
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
-@interface MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams : NSObject <NSCopying>
+
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams")
+@interface MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams
+    : MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams
+@end
+
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams : NSObject <NSCopying>
 
 @property (nonatomic, copy) NSData * _Nonnull updateToken;
 
@@ -1649,7 +1675,14 @@
 - (instancetype)init;
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
-@interface MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams : NSObject <NSCopying>
+
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams")
+@interface MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams
+    : MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams
+@end
+
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams : NSObject <NSCopying>
 
 @property (nonatomic, copy) NSNumber * _Nonnull providerNodeId;
 
@@ -1679,6 +1712,12 @@
 - (instancetype)init;
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
+
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams")
+@interface MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams
+    : MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams
+@end
+
 @interface MTRGeneralCommissioningClusterArmFailSafeParams : NSObject <NSCopying>
 
 @property (nonatomic, copy) NSNumber * _Nonnull expiryLengthSeconds;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
index 1206aaf..744bd8c 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.mm
@@ -1985,7 +1985,7 @@
 }
 
 @end
-@implementation MTROtaSoftwareUpdateProviderClusterQueryImageParams
+@implementation MTROTASoftwareUpdateProviderClusterQueryImageParams
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -2012,7 +2012,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 {
-    auto other = [[MTROtaSoftwareUpdateProviderClusterQueryImageParams alloc] init];
+    auto other = [[MTROTASoftwareUpdateProviderClusterQueryImageParams alloc] init];
 
     other.vendorId = self.vendorId;
     other.productId = self.productId;
@@ -2038,7 +2038,10 @@
 }
 
 @end
-@implementation MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams
+
+@implementation MTROtaSoftwareUpdateProviderClusterQueryImageParams
+@end
+@implementation MTROTASoftwareUpdateProviderClusterQueryImageResponseParams
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -2065,7 +2068,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 {
-    auto other = [[MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams alloc] init];
+    auto other = [[MTROTASoftwareUpdateProviderClusterQueryImageResponseParams alloc] init];
 
     other.status = self.status;
     other.delayedActionTime = self.delayedActionTime;
@@ -2092,7 +2095,10 @@
 }
 
 @end
-@implementation MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams
+
+@implementation MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams
+@end
+@implementation MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -2107,7 +2113,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 {
-    auto other = [[MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams alloc] init];
+    auto other = [[MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams alloc] init];
 
     other.updateToken = self.updateToken;
     other.newVersion = self.newVersion;
@@ -2125,7 +2131,10 @@
 }
 
 @end
-@implementation MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams
+
+@implementation MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams
+@end
+@implementation MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -2140,7 +2149,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 {
-    auto other = [[MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams alloc] init];
+    auto other = [[MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams alloc] init];
 
     other.action = self.action;
     other.delayedActionTime = self.delayedActionTime;
@@ -2157,7 +2166,10 @@
 }
 
 @end
-@implementation MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams
+
+@implementation MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams
+@end
+@implementation MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -2172,7 +2184,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 {
-    auto other = [[MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams alloc] init];
+    auto other = [[MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams alloc] init];
 
     other.updateToken = self.updateToken;
     other.softwareVersion = self.softwareVersion;
@@ -2190,7 +2202,10 @@
 }
 
 @end
-@implementation MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams
+
+@implementation MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams
+@end
+@implementation MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -2211,7 +2226,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 {
-    auto other = [[MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams alloc] init];
+    auto other = [[MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams alloc] init];
 
     other.providerNodeId = self.providerNodeId;
     other.vendorId = self.vendorId;
@@ -2233,6 +2248,9 @@
 }
 
 @end
+
+@implementation MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams
+@end
 @implementation MTRGeneralCommissioningClusterArmFailSafeParams
 - (instancetype)init
 {
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm b/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm
index 52fe36a..f4c013d 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTREventTLVValueDecoder.mm
@@ -136,8 +136,7 @@
                 return nil;
             }
 
-            MTRAccessControlClusterAccessControlEntryChangedEvent * value =
-                [MTRAccessControlClusterAccessControlEntryChangedEvent new];
+            __auto_type * value = [MTRAccessControlClusterAccessControlEntryChangedEvent new];
 
             do {
                 NSNumber * _Nullable memberValue;
@@ -247,8 +246,7 @@
                 return nil;
             }
 
-            MTRAccessControlClusterAccessControlExtensionChangedEvent * value =
-                [MTRAccessControlClusterAccessControlExtensionChangedEvent new];
+            __auto_type * value = [MTRAccessControlClusterAccessControlExtensionChangedEvent new];
 
             do {
                 NSNumber * _Nullable memberValue;
@@ -311,7 +309,7 @@
                 return nil;
             }
 
-            MTRActionsClusterStateChangedEvent * value = [MTRActionsClusterStateChangedEvent new];
+            __auto_type * value = [MTRActionsClusterStateChangedEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -339,7 +337,7 @@
                 return nil;
             }
 
-            MTRActionsClusterActionFailedEvent * value = [MTRActionsClusterActionFailedEvent new];
+            __auto_type * value = [MTRActionsClusterActionFailedEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -382,7 +380,7 @@
                 return nil;
             }
 
-            MTRBasicClusterStartUpEvent * value = [MTRBasicClusterStartUpEvent new];
+            __auto_type * value = [MTRBasicClusterStartUpEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -400,7 +398,7 @@
                 return nil;
             }
 
-            MTRBasicClusterShutDownEvent * value = [MTRBasicClusterShutDownEvent new];
+            __auto_type * value = [MTRBasicClusterShutDownEvent new];
 
             return value;
         }
@@ -412,7 +410,7 @@
                 return nil;
             }
 
-            MTRBasicClusterLeaveEvent * value = [MTRBasicClusterLeaveEvent new];
+            __auto_type * value = [MTRBasicClusterLeaveEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -430,7 +428,7 @@
                 return nil;
             }
 
-            MTRBasicClusterReachableChangedEvent * value = [MTRBasicClusterReachableChangedEvent new];
+            __auto_type * value = [MTRBasicClusterReachableChangedEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -468,8 +466,7 @@
                 return nil;
             }
 
-            MTROtaSoftwareUpdateRequestorClusterStateTransitionEvent * value =
-                [MTROtaSoftwareUpdateRequestorClusterStateTransitionEvent new];
+            __auto_type * value = [MTROTASoftwareUpdateRequestorClusterStateTransitionEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -506,8 +503,7 @@
                 return nil;
             }
 
-            MTROtaSoftwareUpdateRequestorClusterVersionAppliedEvent * value =
-                [MTROtaSoftwareUpdateRequestorClusterVersionAppliedEvent new];
+            __auto_type * value = [MTROTASoftwareUpdateRequestorClusterVersionAppliedEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -530,8 +526,7 @@
                 return nil;
             }
 
-            MTROtaSoftwareUpdateRequestorClusterDownloadErrorEvent * value =
-                [MTROtaSoftwareUpdateRequestorClusterDownloadErrorEvent new];
+            __auto_type * value = [MTROTASoftwareUpdateRequestorClusterDownloadErrorEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -662,8 +657,7 @@
                 return nil;
             }
 
-            MTRGeneralDiagnosticsClusterHardwareFaultChangeEvent * value =
-                [MTRGeneralDiagnosticsClusterHardwareFaultChangeEvent new];
+            __auto_type * value = [MTRGeneralDiagnosticsClusterHardwareFaultChangeEvent new];
 
             do {
                 NSArray * _Nonnull memberValue;
@@ -716,7 +710,7 @@
                 return nil;
             }
 
-            MTRGeneralDiagnosticsClusterRadioFaultChangeEvent * value = [MTRGeneralDiagnosticsClusterRadioFaultChangeEvent new];
+            __auto_type * value = [MTRGeneralDiagnosticsClusterRadioFaultChangeEvent new];
 
             do {
                 NSArray * _Nonnull memberValue;
@@ -769,7 +763,7 @@
                 return nil;
             }
 
-            MTRGeneralDiagnosticsClusterNetworkFaultChangeEvent * value = [MTRGeneralDiagnosticsClusterNetworkFaultChangeEvent new];
+            __auto_type * value = [MTRGeneralDiagnosticsClusterNetworkFaultChangeEvent new];
 
             do {
                 NSArray * _Nonnull memberValue;
@@ -822,7 +816,7 @@
                 return nil;
             }
 
-            MTRGeneralDiagnosticsClusterBootReasonEvent * value = [MTRGeneralDiagnosticsClusterBootReasonEvent new];
+            __auto_type * value = [MTRGeneralDiagnosticsClusterBootReasonEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -850,7 +844,7 @@
                 return nil;
             }
 
-            MTRSoftwareDiagnosticsClusterSoftwareFaultEvent * value = [MTRSoftwareDiagnosticsClusterSoftwareFaultEvent new];
+            __auto_type * value = [MTRSoftwareDiagnosticsClusterSoftwareFaultEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -899,8 +893,7 @@
                 return nil;
             }
 
-            MTRThreadNetworkDiagnosticsClusterConnectionStatusEvent * value =
-                [MTRThreadNetworkDiagnosticsClusterConnectionStatusEvent new];
+            __auto_type * value = [MTRThreadNetworkDiagnosticsClusterConnectionStatusEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -918,8 +911,7 @@
                 return nil;
             }
 
-            MTRThreadNetworkDiagnosticsClusterNetworkFaultChangeEvent * value =
-                [MTRThreadNetworkDiagnosticsClusterNetworkFaultChangeEvent new];
+            __auto_type * value = [MTRThreadNetworkDiagnosticsClusterNetworkFaultChangeEvent new];
 
             do {
                 NSArray * _Nonnull memberValue;
@@ -982,7 +974,7 @@
                 return nil;
             }
 
-            MTRWiFiNetworkDiagnosticsClusterDisconnectionEvent * value = [MTRWiFiNetworkDiagnosticsClusterDisconnectionEvent new];
+            __auto_type * value = [MTRWiFiNetworkDiagnosticsClusterDisconnectionEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1000,8 +992,7 @@
                 return nil;
             }
 
-            MTRWiFiNetworkDiagnosticsClusterAssociationFailureEvent * value =
-                [MTRWiFiNetworkDiagnosticsClusterAssociationFailureEvent new];
+            __auto_type * value = [MTRWiFiNetworkDiagnosticsClusterAssociationFailureEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1024,8 +1015,7 @@
                 return nil;
             }
 
-            MTRWiFiNetworkDiagnosticsClusterConnectionStatusEvent * value =
-                [MTRWiFiNetworkDiagnosticsClusterConnectionStatusEvent new];
+            __auto_type * value = [MTRWiFiNetworkDiagnosticsClusterConnectionStatusEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1063,7 +1053,7 @@
                 return nil;
             }
 
-            MTRBridgedDeviceBasicClusterStartUpEvent * value = [MTRBridgedDeviceBasicClusterStartUpEvent new];
+            __auto_type * value = [MTRBridgedDeviceBasicClusterStartUpEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1081,7 +1071,7 @@
                 return nil;
             }
 
-            MTRBridgedDeviceBasicClusterShutDownEvent * value = [MTRBridgedDeviceBasicClusterShutDownEvent new];
+            __auto_type * value = [MTRBridgedDeviceBasicClusterShutDownEvent new];
 
             return value;
         }
@@ -1093,7 +1083,7 @@
                 return nil;
             }
 
-            MTRBridgedDeviceBasicClusterLeaveEvent * value = [MTRBridgedDeviceBasicClusterLeaveEvent new];
+            __auto_type * value = [MTRBridgedDeviceBasicClusterLeaveEvent new];
 
             return value;
         }
@@ -1105,7 +1095,7 @@
                 return nil;
             }
 
-            MTRBridgedDeviceBasicClusterReachableChangedEvent * value = [MTRBridgedDeviceBasicClusterReachableChangedEvent new];
+            __auto_type * value = [MTRBridgedDeviceBasicClusterReachableChangedEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1133,7 +1123,7 @@
                 return nil;
             }
 
-            MTRSwitchClusterSwitchLatchedEvent * value = [MTRSwitchClusterSwitchLatchedEvent new];
+            __auto_type * value = [MTRSwitchClusterSwitchLatchedEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1151,7 +1141,7 @@
                 return nil;
             }
 
-            MTRSwitchClusterInitialPressEvent * value = [MTRSwitchClusterInitialPressEvent new];
+            __auto_type * value = [MTRSwitchClusterInitialPressEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1169,7 +1159,7 @@
                 return nil;
             }
 
-            MTRSwitchClusterLongPressEvent * value = [MTRSwitchClusterLongPressEvent new];
+            __auto_type * value = [MTRSwitchClusterLongPressEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1187,7 +1177,7 @@
                 return nil;
             }
 
-            MTRSwitchClusterShortReleaseEvent * value = [MTRSwitchClusterShortReleaseEvent new];
+            __auto_type * value = [MTRSwitchClusterShortReleaseEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1205,7 +1195,7 @@
                 return nil;
             }
 
-            MTRSwitchClusterLongReleaseEvent * value = [MTRSwitchClusterLongReleaseEvent new];
+            __auto_type * value = [MTRSwitchClusterLongReleaseEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1223,7 +1213,7 @@
                 return nil;
             }
 
-            MTRSwitchClusterMultiPressOngoingEvent * value = [MTRSwitchClusterMultiPressOngoingEvent new];
+            __auto_type * value = [MTRSwitchClusterMultiPressOngoingEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1246,7 +1236,7 @@
                 return nil;
             }
 
-            MTRSwitchClusterMultiPressCompleteEvent * value = [MTRSwitchClusterMultiPressCompleteEvent new];
+            __auto_type * value = [MTRSwitchClusterMultiPressCompleteEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1329,7 +1319,7 @@
                 return nil;
             }
 
-            MTRBooleanStateClusterStateChangeEvent * value = [MTRBooleanStateClusterStateChangeEvent new];
+            __auto_type * value = [MTRBooleanStateClusterStateChangeEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1367,7 +1357,7 @@
                 return nil;
             }
 
-            MTRDoorLockClusterDoorLockAlarmEvent * value = [MTRDoorLockClusterDoorLockAlarmEvent new];
+            __auto_type * value = [MTRDoorLockClusterDoorLockAlarmEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1385,7 +1375,7 @@
                 return nil;
             }
 
-            MTRDoorLockClusterDoorStateChangeEvent * value = [MTRDoorLockClusterDoorStateChangeEvent new];
+            __auto_type * value = [MTRDoorLockClusterDoorStateChangeEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1403,7 +1393,7 @@
                 return nil;
             }
 
-            MTRDoorLockClusterLockOperationEvent * value = [MTRDoorLockClusterLockOperationEvent new];
+            __auto_type * value = [MTRDoorLockClusterLockOperationEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1484,7 +1474,7 @@
                 return nil;
             }
 
-            MTRDoorLockClusterLockOperationErrorEvent * value = [MTRDoorLockClusterLockOperationErrorEvent new];
+            __auto_type * value = [MTRDoorLockClusterLockOperationErrorEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1570,7 +1560,7 @@
                 return nil;
             }
 
-            MTRDoorLockClusterLockUserChangeEvent * value = [MTRDoorLockClusterLockUserChangeEvent new];
+            __auto_type * value = [MTRDoorLockClusterLockUserChangeEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -1664,8 +1654,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterSupplyVoltageLowEvent * value =
-                [MTRPumpConfigurationAndControlClusterSupplyVoltageLowEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterSupplyVoltageLowEvent new];
 
             return value;
         }
@@ -1677,8 +1666,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterSupplyVoltageHighEvent * value =
-                [MTRPumpConfigurationAndControlClusterSupplyVoltageHighEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterSupplyVoltageHighEvent new];
 
             return value;
         }
@@ -1690,8 +1678,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterPowerMissingPhaseEvent * value =
-                [MTRPumpConfigurationAndControlClusterPowerMissingPhaseEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterPowerMissingPhaseEvent new];
 
             return value;
         }
@@ -1703,8 +1690,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterSystemPressureLowEvent * value =
-                [MTRPumpConfigurationAndControlClusterSystemPressureLowEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterSystemPressureLowEvent new];
 
             return value;
         }
@@ -1716,8 +1702,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterSystemPressureHighEvent * value =
-                [MTRPumpConfigurationAndControlClusterSystemPressureHighEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterSystemPressureHighEvent new];
 
             return value;
         }
@@ -1729,8 +1714,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterDryRunningEvent * value =
-                [MTRPumpConfigurationAndControlClusterDryRunningEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterDryRunningEvent new];
 
             return value;
         }
@@ -1742,8 +1726,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterMotorTemperatureHighEvent * value =
-                [MTRPumpConfigurationAndControlClusterMotorTemperatureHighEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterMotorTemperatureHighEvent new];
 
             return value;
         }
@@ -1755,8 +1738,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterPumpMotorFatalFailureEvent * value =
-                [MTRPumpConfigurationAndControlClusterPumpMotorFatalFailureEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterPumpMotorFatalFailureEvent new];
 
             return value;
         }
@@ -1768,8 +1750,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterElectronicTemperatureHighEvent * value =
-                [MTRPumpConfigurationAndControlClusterElectronicTemperatureHighEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterElectronicTemperatureHighEvent new];
 
             return value;
         }
@@ -1781,8 +1762,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterPumpBlockedEvent * value =
-                [MTRPumpConfigurationAndControlClusterPumpBlockedEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterPumpBlockedEvent new];
 
             return value;
         }
@@ -1794,8 +1774,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterSensorFailureEvent * value =
-                [MTRPumpConfigurationAndControlClusterSensorFailureEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterSensorFailureEvent new];
 
             return value;
         }
@@ -1807,8 +1786,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterElectronicNonFatalFailureEvent * value =
-                [MTRPumpConfigurationAndControlClusterElectronicNonFatalFailureEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterElectronicNonFatalFailureEvent new];
 
             return value;
         }
@@ -1820,8 +1798,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterElectronicFatalFailureEvent * value =
-                [MTRPumpConfigurationAndControlClusterElectronicFatalFailureEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterElectronicFatalFailureEvent new];
 
             return value;
         }
@@ -1833,8 +1810,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterGeneralFaultEvent * value =
-                [MTRPumpConfigurationAndControlClusterGeneralFaultEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterGeneralFaultEvent new];
 
             return value;
         }
@@ -1846,7 +1822,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterLeakageEvent * value = [MTRPumpConfigurationAndControlClusterLeakageEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterLeakageEvent new];
 
             return value;
         }
@@ -1858,8 +1834,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterAirDetectionEvent * value =
-                [MTRPumpConfigurationAndControlClusterAirDetectionEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterAirDetectionEvent new];
 
             return value;
         }
@@ -1871,8 +1846,7 @@
                 return nil;
             }
 
-            MTRPumpConfigurationAndControlClusterTurbineOperationEvent * value =
-                [MTRPumpConfigurationAndControlClusterTurbineOperationEvent new];
+            __auto_type * value = [MTRPumpConfigurationAndControlClusterTurbineOperationEvent new];
 
             return value;
         }
@@ -2134,7 +2108,7 @@
                 return nil;
             }
 
-            MTRUnitTestingClusterTestEventEvent * value = [MTRUnitTestingClusterTestEventEvent new];
+            __auto_type * value = [MTRUnitTestingClusterTestEventEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
@@ -2227,7 +2201,7 @@
                 return nil;
             }
 
-            MTRUnitTestingClusterTestFabricScopedEventEvent * value = [MTRUnitTestingClusterTestFabricScopedEventEvent new];
+            __auto_type * value = [MTRUnitTestingClusterTestFabricScopedEventEvent new];
 
             do {
                 NSNumber * _Nonnull memberValue;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h
index 9d1a2aa..3fc7613 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h
@@ -189,7 +189,8 @@
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
 
-@interface MTROtaSoftwareUpdateRequestorClusterProviderLocation : NSObject <NSCopying>
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateRequestorClusterProviderLocation : NSObject <NSCopying>
 @property (nonatomic, copy) NSNumber * _Nonnull providerNodeID;
 @property (nonatomic, copy) NSNumber * _Nonnull endpoint;
 @property (nonatomic, copy) NSNumber * _Nonnull fabricIndex;
@@ -198,7 +199,12 @@
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
 
-@interface MTROtaSoftwareUpdateRequestorClusterStateTransitionEvent : NSObject <NSCopying>
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateRequestorClusterProviderLocation")
+@interface MTROtaSoftwareUpdateRequestorClusterProviderLocation : MTROTASoftwareUpdateRequestorClusterProviderLocation
+@end
+
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateRequestorClusterStateTransitionEvent : NSObject <NSCopying>
 @property (nonatomic, copy) NSNumber * _Nonnull previousState;
 @property (nonatomic, copy, getter=getNewState) NSNumber * _Nonnull newState;
 @property (nonatomic, copy) NSNumber * _Nonnull reason;
@@ -208,7 +214,12 @@
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
 
-@interface MTROtaSoftwareUpdateRequestorClusterVersionAppliedEvent : NSObject <NSCopying>
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateRequestorClusterStateTransitionEvent")
+@interface MTROtaSoftwareUpdateRequestorClusterStateTransitionEvent : MTROTASoftwareUpdateRequestorClusterStateTransitionEvent
+@end
+
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateRequestorClusterVersionAppliedEvent : NSObject <NSCopying>
 @property (nonatomic, copy) NSNumber * _Nonnull softwareVersion;
 @property (nonatomic, copy) NSNumber * _Nonnull productID;
 
@@ -216,7 +227,12 @@
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
 
-@interface MTROtaSoftwareUpdateRequestorClusterDownloadErrorEvent : NSObject <NSCopying>
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateRequestorClusterVersionAppliedEvent")
+@interface MTROtaSoftwareUpdateRequestorClusterVersionAppliedEvent : MTROTASoftwareUpdateRequestorClusterVersionAppliedEvent
+@end
+
+MTR_NEWLY_AVAILABLE
+@interface MTROTASoftwareUpdateRequestorClusterDownloadErrorEvent : NSObject <NSCopying>
 @property (nonatomic, copy) NSNumber * _Nonnull softwareVersion;
 @property (nonatomic, copy) NSNumber * _Nonnull bytesDownloaded;
 @property (nonatomic, copy) NSNumber * _Nullable progressPercent;
@@ -226,6 +242,10 @@
 - (id)copyWithZone:(NSZone * _Nullable)zone;
 @end
 
+MTR_NEWLY_DEPRECATED("Please use MTROTASoftwareUpdateRequestorClusterDownloadErrorEvent")
+@interface MTROtaSoftwareUpdateRequestorClusterDownloadErrorEvent : MTROTASoftwareUpdateRequestorClusterDownloadErrorEvent
+@end
+
 @interface MTRPowerSourceClusterBatChargeFaultChangeType : NSObject <NSCopying>
 @property (nonatomic, copy) NSArray * _Nonnull current;
 @property (nonatomic, copy) NSArray * _Nonnull previous;
diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm
index 38f32e6..78f3166 100644
--- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm
+++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.mm
@@ -661,7 +661,7 @@
 
 @end
 
-@implementation MTROtaSoftwareUpdateRequestorClusterProviderLocation
+@implementation MTROTASoftwareUpdateRequestorClusterProviderLocation
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -677,7 +677,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone
 {
-    auto other = [[MTROtaSoftwareUpdateRequestorClusterProviderLocation alloc] init];
+    auto other = [[MTROTASoftwareUpdateRequestorClusterProviderLocation alloc] init];
 
     other.providerNodeID = self.providerNodeID;
     other.endpoint = self.endpoint;
@@ -695,7 +695,10 @@
 
 @end
 
-@implementation MTROtaSoftwareUpdateRequestorClusterStateTransitionEvent
+@implementation MTROtaSoftwareUpdateRequestorClusterProviderLocation : MTROTASoftwareUpdateRequestorClusterProviderLocation
+@end
+
+@implementation MTROTASoftwareUpdateRequestorClusterStateTransitionEvent
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -713,7 +716,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone
 {
-    auto other = [[MTROtaSoftwareUpdateRequestorClusterStateTransitionEvent alloc] init];
+    auto other = [[MTROTASoftwareUpdateRequestorClusterStateTransitionEvent alloc] init];
 
     other.previousState = self.previousState;
     other.newState = self.newState;
@@ -733,7 +736,10 @@
 
 @end
 
-@implementation MTROtaSoftwareUpdateRequestorClusterVersionAppliedEvent
+@implementation MTROtaSoftwareUpdateRequestorClusterStateTransitionEvent : MTROTASoftwareUpdateRequestorClusterStateTransitionEvent
+@end
+
+@implementation MTROTASoftwareUpdateRequestorClusterVersionAppliedEvent
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -747,7 +753,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone
 {
-    auto other = [[MTROtaSoftwareUpdateRequestorClusterVersionAppliedEvent alloc] init];
+    auto other = [[MTROTASoftwareUpdateRequestorClusterVersionAppliedEvent alloc] init];
 
     other.softwareVersion = self.softwareVersion;
     other.productID = self.productID;
@@ -764,7 +770,10 @@
 
 @end
 
-@implementation MTROtaSoftwareUpdateRequestorClusterDownloadErrorEvent
+@implementation MTROtaSoftwareUpdateRequestorClusterVersionAppliedEvent : MTROTASoftwareUpdateRequestorClusterVersionAppliedEvent
+@end
+
+@implementation MTROTASoftwareUpdateRequestorClusterDownloadErrorEvent
 - (instancetype)init
 {
     if (self = [super init]) {
@@ -782,7 +791,7 @@
 
 - (id)copyWithZone:(NSZone * _Nullable)zone
 {
-    auto other = [[MTROtaSoftwareUpdateRequestorClusterDownloadErrorEvent alloc] init];
+    auto other = [[MTROTASoftwareUpdateRequestorClusterDownloadErrorEvent alloc] init];
 
     other.softwareVersion = self.softwareVersion;
     other.bytesDownloaded = self.bytesDownloaded;
@@ -802,6 +811,9 @@
 
 @end
 
+@implementation MTROtaSoftwareUpdateRequestorClusterDownloadErrorEvent : MTROTASoftwareUpdateRequestorClusterDownloadErrorEvent
+@end
+
 @implementation MTRPowerSourceClusterBatChargeFaultChangeType
 - (instancetype)init
 {
diff --git a/src/darwin/Framework/CHIPTests/MTRTestOTAProvider.m b/src/darwin/Framework/CHIPTests/MTRTestOTAProvider.m
index 28aeb68..444e2fd 100644
--- a/src/darwin/Framework/CHIPTests/MTRTestOTAProvider.m
+++ b/src/darwin/Framework/CHIPTests/MTRTestOTAProvider.m
@@ -22,21 +22,21 @@
 @implementation MTRTestOTAProvider
 - (void)handleQueryImageForNodeID:(NSNumber *)nodeID
                        controller:(MTRDeviceController *)controller
-                           params:(MTROtaSoftwareUpdateProviderClusterQueryImageParams *)params
+                           params:(MTROTASoftwareUpdateProviderClusterQueryImageParams *)params
                        completion:(MTRQueryImageCompletionHandler)completion
 {
 }
 
 - (void)handleApplyUpdateRequestForNodeID:(NSNumber *)nodeID
                                controller:(MTRDeviceController *)controller
-                                   params:(MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
+                                   params:(MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams *)params
                                completion:(MTRApplyUpdateRequestCompletionHandler)completion
 {
 }
 
 - (void)handleNotifyUpdateAppliedForNodeID:(NSNumber *)nodeID
                                 controller:(MTRDeviceController *)controller
-                                    params:(MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
+                                    params:(MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams *)params
                                 completion:(MTRStatusCompletion)completion
 {
 }
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
index 8b1fb53..6af5288 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h
@@ -144,9 +144,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -191,9 +189,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) command (0x00000040) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -238,9 +234,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Identify.IdentifyTime response %@", [value description]);
             if (error != nil) {
@@ -268,10 +262,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -305,10 +297,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -348,9 +338,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeIdentifyTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Identify.IdentifyType response %@", [value description]);
             if (error != nil) {
@@ -375,10 +363,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -418,9 +404,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Identify.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -445,10 +429,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -488,9 +470,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Identify.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -515,10 +495,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -558,9 +536,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Identify.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -585,10 +561,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -628,9 +602,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Identify.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -655,10 +627,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -698,9 +668,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Identify.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -725,10 +693,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000003) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -791,9 +757,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -841,9 +805,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -889,9 +851,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -946,9 +906,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -993,9 +951,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRGroupsClusterRemoveAllGroupsParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -1038,9 +994,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) command (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRGroupsClusterAddGroupIfIdentifyingParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -1087,9 +1041,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNameSupportWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Groups.NameSupport response %@", [value description]);
             if (error != nil) {
@@ -1114,10 +1066,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -1157,9 +1107,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Groups.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -1184,10 +1132,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -1227,9 +1173,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Groups.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -1254,10 +1198,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -1297,9 +1239,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Groups.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -1324,10 +1264,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -1367,9 +1305,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Groups.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -1394,10 +1330,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -1437,9 +1371,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Groups.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -1464,10 +1396,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000004) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -1543,9 +1473,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterAddSceneParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -1631,9 +1559,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterViewSceneParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -1680,9 +1606,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterRemoveSceneParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -1729,9 +1653,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterRemoveAllScenesParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -1778,9 +1700,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterStoreSceneParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -1829,9 +1749,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterRecallSceneParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -1885,9 +1803,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterGetSceneMembershipParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -1938,9 +1854,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000040) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterEnhancedAddSceneParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -2027,9 +1941,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000041) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterEnhancedViewSceneParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -2080,9 +1992,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) command (0x00000042) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRScenesClusterCopySceneParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -2131,9 +2041,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeSceneCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.SceneCount response %@", [value description]);
             if (error != nil) {
@@ -2158,10 +2066,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2201,9 +2107,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeCurrentSceneWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.CurrentScene response %@", [value description]);
             if (error != nil) {
@@ -2228,10 +2132,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2271,9 +2173,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeCurrentGroupWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.CurrentGroup response %@", [value description]);
             if (error != nil) {
@@ -2298,10 +2198,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2341,9 +2239,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeSceneValidWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.SceneValid response %@", [value description]);
             if (error != nil) {
@@ -2368,10 +2264,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2411,9 +2305,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNameSupportWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.NameSupport response %@", [value description]);
             if (error != nil) {
@@ -2438,10 +2330,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2481,9 +2371,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeLastConfiguredByWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.LastConfiguredBy response %@", [value description]);
             if (error != nil) {
@@ -2508,10 +2396,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2551,9 +2437,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -2578,10 +2462,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2621,9 +2503,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -2648,10 +2528,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2691,9 +2569,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -2718,10 +2594,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2761,9 +2635,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -2788,10 +2660,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2831,9 +2701,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Scenes.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -2858,10 +2726,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000005) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterScenes * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterScenes alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -2926,9 +2792,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTROnOffClusterOffParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -2969,9 +2833,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTROnOffClusterOnParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -3012,9 +2874,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTROnOffClusterToggleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -3057,9 +2917,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) command (0x00000040) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTROnOffClusterOffWithEffectParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -3103,9 +2961,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) command (0x00000041) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTROnOffClusterOnWithRecallGlobalSceneParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -3149,9 +3005,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) command (0x00000042) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTROnOffClusterOnWithTimedOffParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -3197,9 +3051,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.OnOff response %@", [value description]);
             if (error != nil) {
@@ -3224,10 +3076,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -3267,9 +3117,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x00004000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGlobalSceneControlWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.GlobalSceneControl response %@", [value description]);
             if (error != nil) {
@@ -3294,10 +3142,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x00004000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -3337,9 +3183,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x00004001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeOnTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.OnTime response %@", [value description]);
             if (error != nil) {
@@ -3367,10 +3211,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) WriteAttribute (0x00004001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -3404,10 +3246,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x00004001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -3447,9 +3287,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x00004002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeOffWaitTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.OffWaitTime response %@", [value description]);
             if (error != nil) {
@@ -3477,10 +3315,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) WriteAttribute (0x00004002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -3514,10 +3350,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x00004002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -3557,9 +3391,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x00004003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeStartUpOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.StartUpOnOff response %@", [value description]);
             if (error != nil) {
@@ -3587,10 +3419,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) WriteAttribute (0x00004003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -3624,10 +3454,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x00004003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -3667,9 +3495,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -3694,10 +3520,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -3737,9 +3561,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -3764,10 +3586,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -3807,9 +3627,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -3834,10 +3652,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -3877,9 +3693,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -3904,10 +3718,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -3947,9 +3759,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOff.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -3974,10 +3784,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000006) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -4034,8 +3842,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeSwitchTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOffSwitchConfiguration.SwitchType response %@", [value description]);
             if (error != nil) {
@@ -4060,9 +3869,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -4102,8 +3912,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeSwitchActionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOffSwitchConfiguration.SwitchActions response %@", [value description]);
             if (error != nil) {
@@ -4131,9 +3942,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) WriteAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -4167,9 +3979,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -4209,8 +4022,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOffSwitchConfiguration.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -4235,9 +4049,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -4277,8 +4092,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOffSwitchConfiguration.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -4303,9 +4119,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -4345,8 +4162,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOffSwitchConfiguration.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -4371,9 +4189,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -4413,8 +4232,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOffSwitchConfiguration.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -4439,9 +4259,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -4481,8 +4302,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OnOffSwitchConfiguration.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -4507,9 +4329,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000007) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOnOffSwitchConfiguration * cluster =
-            [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOnOffSwitchConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -4590,9 +4413,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -4646,9 +4469,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -4703,9 +4526,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRLevelControlClusterStepParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -4758,9 +4581,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRLevelControlClusterStopParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -4808,9 +4631,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelWithOnOffParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -4864,9 +4687,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) command (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRLevelControlClusterMoveWithOnOffParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -4921,9 +4744,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) command (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRLevelControlClusterStepWithOnOffParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -4976,9 +4799,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) command (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRLevelControlClusterStopWithOnOffParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -5023,9 +4846,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) command (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRLevelControlClusterMoveToClosestFrequencyParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -5069,9 +4892,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.CurrentLevel response %@", [value description]);
             if (error != nil) {
@@ -5096,10 +4919,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5139,9 +4962,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeRemainingTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.RemainingTime response %@", [value description]);
             if (error != nil) {
@@ -5166,10 +4989,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5209,9 +5032,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.MinLevel response %@", [value description]);
             if (error != nil) {
@@ -5236,10 +5059,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5279,9 +5102,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.MaxLevel response %@", [value description]);
             if (error != nil) {
@@ -5306,10 +5129,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5349,9 +5172,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeCurrentFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.CurrentFrequency response %@", [value description]);
             if (error != nil) {
@@ -5376,10 +5199,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5419,9 +5242,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeMinFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.MinFrequency response %@", [value description]);
             if (error != nil) {
@@ -5446,10 +5269,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5489,9 +5312,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeMaxFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.MaxFrequency response %@", [value description]);
             if (error != nil) {
@@ -5516,10 +5339,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5559,9 +5382,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.Options response %@", [value description]);
             if (error != nil) {
@@ -5589,10 +5412,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) WriteAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -5626,10 +5449,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5669,9 +5492,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.OnOffTransitionTime response %@", [value description]);
             if (error != nil) {
@@ -5699,10 +5522,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) WriteAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -5736,10 +5559,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5779,9 +5602,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.OnLevel response %@", [value description]);
             if (error != nil) {
@@ -5809,10 +5632,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) WriteAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -5846,10 +5669,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5889,9 +5712,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.OnTransitionTime response %@", [value description]);
             if (error != nil) {
@@ -5919,10 +5742,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) WriteAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -5956,10 +5779,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -5999,9 +5822,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.OffTransitionTime response %@", [value description]);
             if (error != nil) {
@@ -6029,10 +5852,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) WriteAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -6066,10 +5889,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6109,9 +5932,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.DefaultMoveRate response %@", [value description]);
             if (error != nil) {
@@ -6139,10 +5962,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) WriteAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -6176,10 +5999,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6219,9 +6042,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x00004000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.StartUpCurrentLevel response %@", [value description]);
             if (error != nil) {
@@ -6249,10 +6072,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) WriteAttribute (0x00004000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -6286,10 +6109,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x00004000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6329,9 +6152,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -6356,10 +6179,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6399,9 +6222,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -6426,10 +6249,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6469,9 +6292,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -6496,10 +6319,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6539,9 +6362,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -6566,10 +6389,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6609,9 +6432,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LevelControl.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -6636,10 +6459,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000008) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6703,9 +6526,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeActiveTextWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.ActiveText response %@", [value description]);
             if (error != nil) {
@@ -6733,10 +6556,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) WriteAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -6772,10 +6595,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6815,9 +6638,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x0000001C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.Description response %@", [value description]);
             if (error != nil) {
@@ -6845,10 +6668,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) WriteAttribute (0x0000001C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -6884,10 +6707,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x0000001C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -6927,9 +6750,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x0000002E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeInactiveTextWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.InactiveText response %@", [value description]);
             if (error != nil) {
@@ -6957,10 +6780,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) WriteAttribute (0x0000002E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -6996,10 +6819,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x0000002E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7039,9 +6862,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x00000051) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeOutOfServiceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.OutOfService response %@", [value description]);
             if (error != nil) {
@@ -7069,10 +6892,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) WriteAttribute (0x00000051) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -7106,10 +6929,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x00000051) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7149,9 +6972,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x00000054) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributePolarityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.Polarity response %@", [value description]);
             if (error != nil) {
@@ -7176,10 +6999,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x00000054) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7219,9 +7042,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x00000055) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributePresentValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.PresentValue response %@", [value description]);
             if (error != nil) {
@@ -7249,10 +7072,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) WriteAttribute (0x00000055) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -7286,10 +7109,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x00000055) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7329,9 +7152,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x00000067) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeReliabilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.Reliability response %@", [value description]);
             if (error != nil) {
@@ -7359,10 +7182,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) WriteAttribute (0x00000067) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -7396,10 +7219,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x00000067) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7439,9 +7262,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x0000006F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeStatusFlagsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.StatusFlags response %@", [value description]);
             if (error != nil) {
@@ -7466,10 +7289,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x0000006F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7509,9 +7332,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x00000100) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeApplicationTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.ApplicationType response %@", [value description]);
             if (error != nil) {
@@ -7536,10 +7359,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x00000100) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7579,9 +7402,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -7606,10 +7429,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7649,9 +7472,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -7676,10 +7499,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7719,9 +7542,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -7746,10 +7569,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7789,9 +7612,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -7816,10 +7639,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7859,9 +7682,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BinaryInputBasic.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -7886,10 +7709,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000000F) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinaryInputBasic * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinaryInputBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -7948,9 +7771,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeDeviceTypeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Descriptor.DeviceTypeList response %@", [value description]);
             if (error != nil) {
@@ -7975,10 +7798,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8018,9 +7841,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeServerListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Descriptor.ServerList response %@", [value description]);
             if (error != nil) {
@@ -8045,10 +7868,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8088,9 +7911,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeClientListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Descriptor.ClientList response %@", [value description]);
             if (error != nil) {
@@ -8115,10 +7938,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8158,9 +7981,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributePartsListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Descriptor.PartsList response %@", [value description]);
             if (error != nil) {
@@ -8185,10 +8008,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8228,9 +8051,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Descriptor.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -8255,10 +8078,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8298,9 +8121,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Descriptor.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -8325,10 +8148,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8368,9 +8191,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Descriptor.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -8395,10 +8218,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8438,9 +8261,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Descriptor.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -8465,10 +8288,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8508,9 +8331,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Descriptor.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -8535,10 +8358,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001D) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8594,10 +8417,8 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
             params.filterByFabric = mFabricFiltered.Value();
         }
@@ -8630,10 +8451,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -8698,10 +8517,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8741,9 +8558,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Binding.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -8768,10 +8583,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8811,9 +8624,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Binding.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -8838,10 +8649,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8881,9 +8690,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Binding.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -8908,10 +8715,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -8951,9 +8756,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Binding.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -8978,10 +8781,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9021,9 +8822,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Binding.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -9048,10 +8847,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001E) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9113,18 +8910,18 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
             params.filterByFabric = mFabricFiltered.Value();
         }
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                                     NSLog(@"AccessControl.Acl response %@", [value description]);
+                                     NSLog(@"AccessControl.ACL response %@", [value description]);
                                      if (error != nil) {
-                                         LogNSError("AccessControl Acl read Error", error);
+                                         LogNSError("AccessControl ACL read Error", error);
                                      }
                                      SetCommandExitStatus(error);
                                  }];
@@ -9149,10 +8946,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -9211,11 +9008,11 @@
             value = array_0;
         }
 
-        [cluster writeAttributeAclWithValue:value
+        [cluster writeAttributeACLWithValue:value
                                      params:params
                                  completion:^(NSError * _Nullable error) {
                                      if (error != nil) {
-                                         LogNSError("AccessControl Acl write Error", error);
+                                         LogNSError("AccessControl ACL write Error", error);
                                      }
                                      SetCommandExitStatus(error);
                                  }];
@@ -9241,10 +9038,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9254,12 +9051,12 @@
         if (mAutoResubscribe.HasValue()) {
             params.resubscribeIfLost = mAutoResubscribe.Value();
         }
-        [cluster subscribeAttributeAclWithParams:params
+        [cluster subscribeAttributeACLWithParams:params
             subscriptionEstablished:^() {
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"AccessControl.Acl response %@", [value description]);
+                NSLog(@"AccessControl.ACL response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -9284,10 +9081,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
             params.filterByFabric = mFabricFiltered.Value();
         }
@@ -9320,10 +9117,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) WriteAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -9370,10 +9167,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9413,9 +9210,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeSubjectsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccessControl.SubjectsPerAccessControlEntry response %@", [value description]);
             if (error != nil) {
@@ -9440,10 +9237,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9483,9 +9280,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeTargetsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccessControl.TargetsPerAccessControlEntry response %@", [value description]);
             if (error != nil) {
@@ -9510,10 +9307,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9553,9 +9350,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeAccessControlEntriesPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccessControl.AccessControlEntriesPerFabric response %@", [value description]);
             if (error != nil) {
@@ -9580,10 +9377,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9623,9 +9420,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccessControl.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -9650,10 +9447,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9693,9 +9490,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccessControl.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -9720,10 +9517,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9763,9 +9560,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccessControl.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -9790,10 +9587,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9833,9 +9630,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccessControl.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -9860,10 +9657,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -9903,9 +9700,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccessControl.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -9930,10 +9727,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000001F) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -10006,9 +9803,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterInstantActionParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10059,9 +9854,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterInstantActionWithTransitionParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10112,9 +9905,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterStartActionParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10165,9 +9956,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterStartActionWithDurationParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10218,9 +10007,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterStopActionParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10270,9 +10057,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterPauseActionParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10323,9 +10108,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterPauseActionWithDurationParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10376,9 +10159,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterResumeActionParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10428,9 +10209,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterEnableActionParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10481,9 +10260,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterEnableActionWithDurationParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10534,9 +10311,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterDisableActionParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10587,9 +10362,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) command (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRActionsClusterDisableActionWithDurationParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -10639,9 +10412,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeActionListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Actions.ActionList response %@", [value description]);
             if (error != nil) {
@@ -10666,10 +10437,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -10709,9 +10478,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeEndpointListsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Actions.EndpointLists response %@", [value description]);
             if (error != nil) {
@@ -10736,10 +10503,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -10779,9 +10544,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeSetupURLWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Actions.SetupURL response %@", [value description]);
             if (error != nil) {
@@ -10806,10 +10569,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -10849,9 +10610,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Actions.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -10876,10 +10635,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -10919,9 +10676,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Actions.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -10946,10 +10701,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -10989,9 +10742,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Actions.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -11016,10 +10767,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11059,9 +10808,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Actions.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -11086,10 +10833,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11129,9 +10874,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Actions.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -11156,10 +10899,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000025) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11238,9 +10979,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRBasicClusterMfgSpecificPingParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -11282,9 +11021,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.DataModelRevision response %@", [value description]);
             if (error != nil) {
@@ -11309,10 +11046,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11352,9 +11087,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeVendorNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.VendorName response %@", [value description]);
             if (error != nil) {
@@ -11379,10 +11112,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11422,9 +11153,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeVendorIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.VendorID response %@", [value description]);
             if (error != nil) {
@@ -11449,10 +11178,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11492,9 +11219,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeProductNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.ProductName response %@", [value description]);
             if (error != nil) {
@@ -11519,10 +11244,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11562,9 +11285,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeProductIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.ProductID response %@", [value description]);
             if (error != nil) {
@@ -11589,10 +11310,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11632,9 +11351,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.NodeLabel response %@", [value description]);
             if (error != nil) {
@@ -11662,10 +11379,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) WriteAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -11701,10 +11416,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11744,9 +11457,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeLocationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.Location response %@", [value description]);
             if (error != nil) {
@@ -11774,10 +11485,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) WriteAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -11813,10 +11522,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11856,9 +11563,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeHardwareVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.HardwareVersion response %@", [value description]);
             if (error != nil) {
@@ -11883,10 +11588,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11926,9 +11629,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeHardwareVersionStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.HardwareVersionString response %@", [value description]);
             if (error != nil) {
@@ -11953,10 +11654,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -11996,9 +11695,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeSoftwareVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.SoftwareVersion response %@", [value description]);
             if (error != nil) {
@@ -12023,10 +11720,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12066,9 +11761,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeSoftwareVersionStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.SoftwareVersionString response %@", [value description]);
             if (error != nil) {
@@ -12093,10 +11786,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12136,9 +11827,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeManufacturingDateWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.ManufacturingDate response %@", [value description]);
             if (error != nil) {
@@ -12163,10 +11852,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000000B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12206,9 +11893,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributePartNumberWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.PartNumber response %@", [value description]);
             if (error != nil) {
@@ -12233,10 +11918,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000000C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12276,9 +11959,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000000D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeProductURLWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.ProductURL response %@", [value description]);
             if (error != nil) {
@@ -12303,10 +11984,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000000D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12346,9 +12025,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000000E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeProductLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.ProductLabel response %@", [value description]);
             if (error != nil) {
@@ -12373,10 +12050,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000000E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12416,9 +12091,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeSerialNumberWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.SerialNumber response %@", [value description]);
             if (error != nil) {
@@ -12443,10 +12116,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12486,9 +12157,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.LocalConfigDisabled response %@", [value description]);
             if (error != nil) {
@@ -12516,10 +12185,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) WriteAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -12553,10 +12220,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12596,9 +12261,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeReachableWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.Reachable response %@", [value description]);
             if (error != nil) {
@@ -12623,10 +12286,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12666,9 +12327,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeUniqueIDWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.UniqueID response %@", [value description]);
             if (error != nil) {
@@ -12693,10 +12352,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12736,9 +12393,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeCapabilityMinimaWithCompletion:^(
             MTRBasicClusterCapabilityMinimaStruct * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.CapabilityMinima response %@", [value description]);
@@ -12764,10 +12419,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12807,9 +12460,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -12834,10 +12485,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12877,9 +12526,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -12904,10 +12551,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -12947,9 +12592,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -12974,10 +12617,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13017,9 +12658,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -13044,10 +12683,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13087,9 +12724,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Basic.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -13114,10 +12749,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000028) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device
-                                                                         endpointID:@(endpointId)
-                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13183,9 +12816,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        __auto_type * params = [[MTROtaSoftwareUpdateProviderClusterQueryImageParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTROTASoftwareUpdateProviderClusterQueryImageParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.vendorId = [NSNumber numberWithUnsignedShort:chip::to_underlying(mRequest.vendorId)];
@@ -13227,7 +12861,7 @@
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {
             [cluster queryImageWithParams:params
-                               completion:^(MTROtaSoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable values,
+                               completion:^(MTROTASoftwareUpdateProviderClusterQueryImageResponseParams * _Nullable values,
                                    NSError * _Nullable error) {
                                    NSLog(@"Values: %@", values);
                                    responsesNeeded--;
@@ -13267,9 +12901,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        __auto_type * params = [[MTROtaSoftwareUpdateProviderClusterApplyUpdateRequestParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTROTASoftwareUpdateProviderClusterApplyUpdateRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.updateToken = [NSData dataWithBytes:mRequest.updateToken.data() length:mRequest.updateToken.size()];
@@ -13278,7 +12913,7 @@
         uint16_t __block responsesNeeded = repeatCount;
         while (repeatCount--) {
             [cluster applyUpdateRequestWithParams:params
-                                       completion:^(MTROtaSoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable values,
+                                       completion:^(MTROTASoftwareUpdateProviderClusterApplyUpdateResponseParams * _Nullable values,
                                            NSError * _Nullable error) {
                                            NSLog(@"Values: %@", values);
                                            responsesNeeded--;
@@ -13316,9 +12951,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        __auto_type * params = [[MTROtaSoftwareUpdateProviderClusterNotifyUpdateAppliedParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTROTASoftwareUpdateProviderClusterNotifyUpdateAppliedParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.updateToken = [NSData dataWithBytes:mRequest.updateToken.data() length:mRequest.updateToken.size()];
@@ -13362,12 +12998,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateProvider.GeneratedCommandList response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateProvider.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateProvider GeneratedCommandList read Error", error);
+                LogNSError("OTASoftwareUpdateProvider GeneratedCommandList read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -13388,9 +13025,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13405,7 +13043,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateProvider.GeneratedCommandList response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateProvider.GeneratedCommandList response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -13430,12 +13068,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateProvider.AcceptedCommandList response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateProvider.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateProvider AcceptedCommandList read Error", error);
+                LogNSError("OTASoftwareUpdateProvider AcceptedCommandList read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -13456,9 +13095,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13473,7 +13113,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateProvider.AcceptedCommandList response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateProvider.AcceptedCommandList response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -13498,12 +13138,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateProvider.AttributeList response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateProvider.AttributeList response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateProvider AttributeList read Error", error);
+                LogNSError("OTASoftwareUpdateProvider AttributeList read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -13524,9 +13165,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13541,7 +13183,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateProvider.AttributeList response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateProvider.AttributeList response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -13566,12 +13208,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateProvider.FeatureMap response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateProvider.FeatureMap response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateProvider FeatureMap read Error", error);
+                LogNSError("OTASoftwareUpdateProvider FeatureMap read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -13592,9 +13235,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13609,7 +13253,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateProvider.FeatureMap response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateProvider.FeatureMap response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -13634,12 +13278,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateProvider.ClusterRevision response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateProvider.ClusterRevision response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateProvider ClusterRevision read Error", error);
+                LogNSError("OTASoftwareUpdateProvider ClusterRevision read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -13660,9 +13305,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000029) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateProvider * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateProvider alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateProvider alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13677,7 +13323,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateProvider.ClusterRevision response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateProvider.ClusterRevision response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -13729,9 +13375,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        __auto_type * params = [[MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.providerNodeId = [NSNumber numberWithUnsignedLongLong:mRequest.providerNodeId];
@@ -13783,19 +13430,20 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
             params.filterByFabric = mFabricFiltered.Value();
         }
         [cluster
             readAttributeDefaultOtaProvidersWithParams:params
                                             completion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                                                NSLog(@"OtaSoftwareUpdateRequestor.DefaultOtaProviders response %@",
+                                                NSLog(@"OTASoftwareUpdateRequestor.DefaultOtaProviders response %@",
                                                     [value description]);
                                                 if (error != nil) {
-                                                    LogNSError("OtaSoftwareUpdateRequestor DefaultOtaProviders read Error", error);
+                                                    LogNSError("OTASoftwareUpdateRequestor DefaultOtaProviders read Error", error);
                                                 }
                                                 SetCommandExitStatus(error);
                                             }];
@@ -13820,9 +13468,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -13830,8 +13479,8 @@
         { // Scope for our temporary variables
             auto * array_0 = [NSMutableArray new];
             for (auto & entry_0 : mValue) {
-                MTROtaSoftwareUpdateRequestorClusterProviderLocation * newElement_0;
-                newElement_0 = [MTROtaSoftwareUpdateRequestorClusterProviderLocation new];
+                MTROTASoftwareUpdateRequestorClusterProviderLocation * newElement_0;
+                newElement_0 = [MTROTASoftwareUpdateRequestorClusterProviderLocation new];
                 newElement_0.providerNodeID = [NSNumber numberWithUnsignedLongLong:entry_0.providerNodeID];
                 newElement_0.endpoint = [NSNumber numberWithUnsignedShort:entry_0.endpoint];
                 newElement_0.fabricIndex = [NSNumber numberWithUnsignedChar:entry_0.fabricIndex];
@@ -13845,7 +13494,7 @@
                                                 params:params
                                             completion:^(NSError * _Nullable error) {
                                                 if (error != nil) {
-                                                    LogNSError("OtaSoftwareUpdateRequestor DefaultOtaProviders write Error", error);
+                                                    LogNSError("OTASoftwareUpdateRequestor DefaultOtaProviders write Error", error);
                                                 }
                                                 SetCommandExitStatus(error);
                                             }];
@@ -13872,9 +13521,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13889,7 +13539,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateRequestor.DefaultOtaProviders response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateRequestor.DefaultOtaProviders response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -13914,12 +13564,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeUpdatePossibleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateRequestor.UpdatePossible response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateRequestor.UpdatePossible response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateRequestor UpdatePossible read Error", error);
+                LogNSError("OTASoftwareUpdateRequestor UpdatePossible read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -13940,9 +13591,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -13957,7 +13609,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateRequestor.UpdatePossible response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateRequestor.UpdatePossible response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -13982,12 +13634,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeUpdateStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateRequestor.UpdateState response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateRequestor.UpdateState response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateRequestor UpdateState read Error", error);
+                LogNSError("OTASoftwareUpdateRequestor UpdateState read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -14008,9 +13661,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14025,7 +13679,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateRequestor.UpdateState response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateRequestor.UpdateState response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -14050,12 +13704,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeUpdateStateProgressWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateRequestor.UpdateStateProgress response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateRequestor.UpdateStateProgress response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateRequestor UpdateStateProgress read Error", error);
+                LogNSError("OTASoftwareUpdateRequestor UpdateStateProgress read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -14076,9 +13731,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14093,7 +13749,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateRequestor.UpdateStateProgress response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateRequestor.UpdateStateProgress response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -14118,12 +13774,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateRequestor.GeneratedCommandList response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateRequestor.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateRequestor GeneratedCommandList read Error", error);
+                LogNSError("OTASoftwareUpdateRequestor GeneratedCommandList read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -14144,9 +13801,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14161,7 +13819,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateRequestor.GeneratedCommandList response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateRequestor.GeneratedCommandList response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -14186,12 +13844,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateRequestor.AcceptedCommandList response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateRequestor.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateRequestor AcceptedCommandList read Error", error);
+                LogNSError("OTASoftwareUpdateRequestor AcceptedCommandList read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -14212,9 +13871,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14229,7 +13889,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateRequestor.AcceptedCommandList response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateRequestor.AcceptedCommandList response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -14254,12 +13914,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateRequestor.AttributeList response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateRequestor.AttributeList response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateRequestor AttributeList read Error", error);
+                LogNSError("OTASoftwareUpdateRequestor AttributeList read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -14280,9 +13941,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14297,7 +13959,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateRequestor.AttributeList response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateRequestor.AttributeList response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -14322,12 +13984,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateRequestor.FeatureMap response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateRequestor.FeatureMap response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateRequestor FeatureMap read Error", error);
+                LogNSError("OTASoftwareUpdateRequestor FeatureMap read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -14348,9 +14011,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14365,7 +14029,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateRequestor.FeatureMap response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateRequestor.FeatureMap response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -14390,12 +14054,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OtaSoftwareUpdateRequestor.ClusterRevision response %@", [value description]);
+            NSLog(@"OTASoftwareUpdateRequestor.ClusterRevision response %@", [value description]);
             if (error != nil) {
-                LogNSError("OtaSoftwareUpdateRequestor ClusterRevision read Error", error);
+                LogNSError("OTASoftwareUpdateRequestor ClusterRevision read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -14416,9 +14081,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002A) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14433,7 +14099,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OtaSoftwareUpdateRequestor.ClusterRevision response %@", [value description]);
+                NSLog(@"OTASoftwareUpdateRequestor.ClusterRevision response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -14475,8 +14141,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeActiveLocaleWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LocalizationConfiguration.ActiveLocale response %@", [value description]);
             if (error != nil) {
@@ -14504,9 +14171,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -14542,9 +14210,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14584,8 +14253,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeSupportedLocalesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LocalizationConfiguration.SupportedLocales response %@", [value description]);
             if (error != nil) {
@@ -14610,9 +14280,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14652,8 +14323,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LocalizationConfiguration.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -14678,9 +14350,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14720,8 +14393,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LocalizationConfiguration.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -14746,9 +14420,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14788,8 +14463,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LocalizationConfiguration.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -14814,9 +14490,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14856,8 +14533,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LocalizationConfiguration.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -14882,9 +14560,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -14924,8 +14603,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LocalizationConfiguration.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -14950,9 +14630,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002B) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(endpointId)
+                                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15010,8 +14691,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeHourFormatWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TimeFormatLocalization.HourFormat response %@", [value description]);
             if (error != nil) {
@@ -15039,9 +14721,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -15075,9 +14758,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15117,8 +14801,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeActiveCalendarTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TimeFormatLocalization.ActiveCalendarType response %@", [value description]);
             if (error != nil) {
@@ -15146,9 +14831,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) WriteAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -15182,9 +14868,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15224,8 +14911,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeSupportedCalendarTypesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TimeFormatLocalization.SupportedCalendarTypes response %@", [value description]);
             if (error != nil) {
@@ -15250,9 +14938,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15292,8 +14981,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TimeFormatLocalization.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -15318,9 +15008,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15360,8 +15051,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TimeFormatLocalization.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -15386,9 +15078,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15428,8 +15121,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TimeFormatLocalization.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -15454,9 +15148,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15496,8 +15191,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TimeFormatLocalization.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -15522,9 +15218,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15564,8 +15261,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TimeFormatLocalization.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -15590,9 +15288,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002C) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15648,9 +15347,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeTemperatureUnitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitLocalization.TemperatureUnit response %@", [value description]);
             if (error != nil) {
@@ -15678,10 +15377,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -15715,10 +15414,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15758,9 +15457,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitLocalization.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -15785,10 +15484,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15828,9 +15527,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitLocalization.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -15855,10 +15554,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15898,9 +15597,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitLocalization.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -15925,10 +15624,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -15968,9 +15667,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitLocalization.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -15995,10 +15694,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16038,9 +15737,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitLocalization.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -16065,10 +15764,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002D) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16124,8 +15823,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeSourcesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSourceConfiguration.Sources response %@", [value description]);
             if (error != nil) {
@@ -16150,9 +15850,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16192,8 +15893,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSourceConfiguration.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -16218,9 +15920,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16260,8 +15963,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSourceConfiguration.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -16286,9 +15990,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16328,8 +16033,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSourceConfiguration.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -16354,9 +16060,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16396,8 +16103,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSourceConfiguration.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -16422,9 +16130,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16464,8 +16173,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSourceConfiguration.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -16490,9 +16200,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002E) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16578,9 +16289,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.Status response %@", [value description]);
             if (error != nil) {
@@ -16605,10 +16316,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16648,9 +16359,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeOrderWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.Order response %@", [value description]);
             if (error != nil) {
@@ -16675,10 +16386,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16718,9 +16429,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.Description response %@", [value description]);
             if (error != nil) {
@@ -16745,10 +16456,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16788,9 +16499,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeWiredAssessedInputVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.WiredAssessedInputVoltage response %@", [value description]);
             if (error != nil) {
@@ -16815,10 +16526,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16858,9 +16569,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeWiredAssessedInputFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.WiredAssessedInputFrequency response %@", [value description]);
             if (error != nil) {
@@ -16885,10 +16596,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16928,9 +16639,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeWiredCurrentTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.WiredCurrentType response %@", [value description]);
             if (error != nil) {
@@ -16955,10 +16666,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -16998,9 +16709,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeWiredAssessedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.WiredAssessedCurrent response %@", [value description]);
             if (error != nil) {
@@ -17025,10 +16736,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17068,9 +16779,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeWiredNominalVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.WiredNominalVoltage response %@", [value description]);
             if (error != nil) {
@@ -17095,10 +16806,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17138,9 +16849,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeWiredMaximumCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.WiredMaximumCurrent response %@", [value description]);
             if (error != nil) {
@@ -17165,10 +16876,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17208,9 +16919,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeWiredPresentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.WiredPresent response %@", [value description]);
             if (error != nil) {
@@ -17235,10 +16946,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17278,9 +16989,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeActiveWiredFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.ActiveWiredFaults response %@", [value description]);
             if (error != nil) {
@@ -17305,10 +17016,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17348,9 +17059,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatVoltage response %@", [value description]);
             if (error != nil) {
@@ -17375,10 +17086,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000000B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17418,9 +17129,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatPercentRemainingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatPercentRemaining response %@", [value description]);
             if (error != nil) {
@@ -17445,10 +17156,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000000C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17488,9 +17199,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000000D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatTimeRemainingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatTimeRemaining response %@", [value description]);
             if (error != nil) {
@@ -17515,10 +17226,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000000D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17558,9 +17269,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000000E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatChargeLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatChargeLevel response %@", [value description]);
             if (error != nil) {
@@ -17585,10 +17296,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000000E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17628,9 +17339,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatReplacementNeededWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatReplacementNeeded response %@", [value description]);
             if (error != nil) {
@@ -17655,10 +17366,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17698,9 +17409,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatReplaceabilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatReplaceability response %@", [value description]);
             if (error != nil) {
@@ -17725,10 +17436,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17768,9 +17479,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatPresentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatPresent response %@", [value description]);
             if (error != nil) {
@@ -17795,10 +17506,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17838,9 +17549,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeActiveBatFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.ActiveBatFaults response %@", [value description]);
             if (error != nil) {
@@ -17865,10 +17576,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17908,9 +17619,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatReplacementDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatReplacementDescription response %@", [value description]);
             if (error != nil) {
@@ -17935,10 +17646,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -17978,9 +17689,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatCommonDesignationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatCommonDesignation response %@", [value description]);
             if (error != nil) {
@@ -18005,10 +17716,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18048,9 +17759,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatANSIDesignationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatANSIDesignation response %@", [value description]);
             if (error != nil) {
@@ -18075,10 +17786,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18118,9 +17829,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000016) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatIECDesignationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatIECDesignation response %@", [value description]);
             if (error != nil) {
@@ -18145,10 +17856,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18188,9 +17899,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000017) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatApprovedChemistryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatApprovedChemistry response %@", [value description]);
             if (error != nil) {
@@ -18215,10 +17926,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18258,9 +17969,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000018) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatCapacity response %@", [value description]);
             if (error != nil) {
@@ -18285,10 +17996,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000018) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18328,9 +18039,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x00000019) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatQuantityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatQuantity response %@", [value description]);
             if (error != nil) {
@@ -18355,10 +18066,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x00000019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18398,9 +18109,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000001A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatChargeStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatChargeState response %@", [value description]);
             if (error != nil) {
@@ -18425,10 +18136,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000001A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18468,9 +18179,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000001B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatTimeToFullChargeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatTimeToFullCharge response %@", [value description]);
             if (error != nil) {
@@ -18495,10 +18206,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000001B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18538,9 +18249,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000001C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatFunctionalWhileChargingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatFunctionalWhileCharging response %@", [value description]);
             if (error != nil) {
@@ -18565,10 +18276,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000001C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18608,9 +18319,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000001D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBatChargingCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.BatChargingCurrent response %@", [value description]);
             if (error != nil) {
@@ -18635,10 +18346,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000001D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18678,9 +18389,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000001E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeActiveBatChargeFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.ActiveBatChargeFaults response %@", [value description]);
             if (error != nil) {
@@ -18705,10 +18416,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000001E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18748,9 +18459,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -18775,10 +18486,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18818,9 +18529,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -18845,10 +18556,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18888,9 +18599,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -18915,10 +18626,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -18958,9 +18669,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -18985,10 +18696,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19028,9 +18739,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PowerSource.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -19055,10 +18766,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000002F) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19122,9 +18833,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -19173,9 +18884,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         __auto_type * params = [[MTRGeneralCommissioningClusterSetRegulatoryConfigParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -19225,9 +18936,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         __auto_type * params = [[MTRGeneralCommissioningClusterCommissioningCompleteParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -19272,9 +18983,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.Breadcrumb response %@", [value description]);
             if (error != nil) {
@@ -19302,10 +19013,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -19339,10 +19050,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19382,9 +19093,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeBasicCommissioningInfoWithCompletion:^(
             MTRGeneralCommissioningClusterBasicCommissioningInfo * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.BasicCommissioningInfo response %@", [value description]);
@@ -19410,10 +19121,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19453,9 +19164,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeRegulatoryConfigWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.RegulatoryConfig response %@", [value description]);
             if (error != nil) {
@@ -19480,10 +19191,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19523,9 +19234,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLocationCapabilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.LocationCapability response %@", [value description]);
             if (error != nil) {
@@ -19550,10 +19261,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19593,9 +19304,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeSupportsConcurrentConnectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.SupportsConcurrentConnection response %@", [value description]);
             if (error != nil) {
@@ -19620,10 +19331,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19663,9 +19374,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -19690,10 +19401,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19733,9 +19444,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -19760,10 +19471,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19803,9 +19514,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -19830,10 +19541,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19873,9 +19584,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -19900,10 +19611,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -19943,9 +19654,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralCommissioning.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -19970,10 +19681,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000030) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -20043,9 +19754,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         __auto_type * params = [[MTRNetworkCommissioningClusterScanNetworksParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -20107,9 +19818,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         __auto_type * params = [[MTRNetworkCommissioningClusterAddOrUpdateWiFiNetworkParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -20163,9 +19874,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         __auto_type * params = [[MTRNetworkCommissioningClusterAddOrUpdateThreadNetworkParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -20219,9 +19930,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         __auto_type * params = [[MTRNetworkCommissioningClusterRemoveNetworkParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -20273,9 +19984,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) command (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         __auto_type * params = [[MTRNetworkCommissioningClusterConnectNetworkParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -20328,9 +20039,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) command (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         __auto_type * params = [[MTRNetworkCommissioningClusterReorderNetworkParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -20382,9 +20093,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeMaxNetworksWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.MaxNetworks response %@", [value description]);
             if (error != nil) {
@@ -20409,10 +20120,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -20452,9 +20163,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeNetworksWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.Networks response %@", [value description]);
             if (error != nil) {
@@ -20479,10 +20190,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -20522,9 +20233,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeScanMaxTimeSecondsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.ScanMaxTimeSeconds response %@", [value description]);
             if (error != nil) {
@@ -20549,10 +20260,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -20592,9 +20303,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeConnectMaxTimeSecondsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.ConnectMaxTimeSeconds response %@", [value description]);
             if (error != nil) {
@@ -20619,10 +20330,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -20662,9 +20373,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeInterfaceEnabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.InterfaceEnabled response %@", [value description]);
             if (error != nil) {
@@ -20692,10 +20403,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) WriteAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -20729,10 +20440,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -20772,9 +20483,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLastNetworkingStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.LastNetworkingStatus response %@", [value description]);
             if (error != nil) {
@@ -20799,10 +20510,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -20842,9 +20553,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLastNetworkIDWithCompletion:^(NSData * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.LastNetworkID response %@", [value description]);
             if (error != nil) {
@@ -20869,10 +20580,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -20912,9 +20623,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLastConnectErrorValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.LastConnectErrorValue response %@", [value description]);
             if (error != nil) {
@@ -20939,10 +20650,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -20982,9 +20693,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -21009,10 +20720,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21052,9 +20763,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -21079,10 +20790,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21122,9 +20833,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -21149,10 +20860,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21192,9 +20903,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -21219,10 +20930,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21262,9 +20973,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"NetworkCommissioning.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -21289,10 +21000,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000031) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterNetworkCommissioning * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterNetworkCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21350,9 +21061,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRDiagnosticLogsClusterRetrieveLogsRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -21401,9 +21112,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DiagnosticLogs.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -21428,10 +21139,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21471,9 +21182,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DiagnosticLogs.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -21498,10 +21209,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21541,9 +21252,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DiagnosticLogs.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -21568,10 +21279,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21611,9 +21322,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DiagnosticLogs.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -21638,10 +21349,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21681,9 +21392,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DiagnosticLogs.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -21708,10 +21419,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000032) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21781,9 +21492,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         __auto_type * params = [[MTRGeneralDiagnosticsClusterTestEventTriggerParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -21828,9 +21539,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeNetworkInterfacesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.NetworkInterfaces response %@", [value description]);
             if (error != nil) {
@@ -21855,10 +21566,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21898,9 +21609,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeRebootCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.RebootCount response %@", [value description]);
             if (error != nil) {
@@ -21925,10 +21636,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -21968,9 +21679,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeUpTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.UpTime response %@", [value description]);
             if (error != nil) {
@@ -21995,10 +21706,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22038,9 +21749,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeTotalOperationalHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.TotalOperationalHours response %@", [value description]);
             if (error != nil) {
@@ -22065,10 +21776,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22108,9 +21819,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeBootReasonsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.BootReasons response %@", [value description]);
             if (error != nil) {
@@ -22135,10 +21846,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22178,9 +21889,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeActiveHardwareFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.ActiveHardwareFaults response %@", [value description]);
             if (error != nil) {
@@ -22205,10 +21916,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22248,9 +21959,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeActiveRadioFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.ActiveRadioFaults response %@", [value description]);
             if (error != nil) {
@@ -22275,10 +21986,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22318,9 +22029,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeActiveNetworkFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.ActiveNetworkFaults response %@", [value description]);
             if (error != nil) {
@@ -22345,10 +22056,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22388,9 +22099,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeTestEventTriggersEnabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.TestEventTriggersEnabled response %@", [value description]);
             if (error != nil) {
@@ -22415,10 +22126,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22458,9 +22169,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -22485,10 +22196,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22528,9 +22239,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -22555,10 +22266,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22598,9 +22309,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -22625,10 +22336,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22668,9 +22379,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -22695,10 +22406,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22738,9 +22449,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GeneralDiagnostics.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -22765,10 +22476,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000033) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22828,9 +22539,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         __auto_type * params = [[MTRSoftwareDiagnosticsClusterResetWatermarksParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -22872,9 +22583,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeThreadMetricsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"SoftwareDiagnostics.ThreadMetrics response %@", [value description]);
             if (error != nil) {
@@ -22899,10 +22610,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -22942,9 +22653,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeCurrentHeapFreeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"SoftwareDiagnostics.CurrentHeapFree response %@", [value description]);
             if (error != nil) {
@@ -22969,10 +22680,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23012,9 +22723,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeCurrentHeapUsedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"SoftwareDiagnostics.CurrentHeapUsed response %@", [value description]);
             if (error != nil) {
@@ -23039,10 +22750,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23082,9 +22793,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeCurrentHeapHighWatermarkWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"SoftwareDiagnostics.CurrentHeapHighWatermark response %@", [value description]);
             if (error != nil) {
@@ -23109,10 +22820,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23152,9 +22863,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"SoftwareDiagnostics.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -23179,10 +22890,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23222,9 +22933,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"SoftwareDiagnostics.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -23249,10 +22960,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23292,9 +23003,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"SoftwareDiagnostics.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -23319,10 +23030,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23362,9 +23073,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"SoftwareDiagnostics.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -23389,10 +23100,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23432,9 +23143,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"SoftwareDiagnostics.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -23459,10 +23170,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000034) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23582,8 +23293,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         __auto_type * params = [[MTRThreadNetworkDiagnosticsClusterResetCountsParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -23625,8 +23337,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeChannelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.Channel response %@", [value description]);
             if (error != nil) {
@@ -23651,9 +23364,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23693,8 +23407,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRoutingRoleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RoutingRole response %@", [value description]);
             if (error != nil) {
@@ -23719,9 +23434,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23761,8 +23477,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeNetworkNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.NetworkName response %@", [value description]);
             if (error != nil) {
@@ -23787,9 +23504,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23829,8 +23547,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributePanIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.PanId response %@", [value description]);
             if (error != nil) {
@@ -23855,9 +23574,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23897,8 +23617,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeExtendedPanIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.ExtendedPanId response %@", [value description]);
             if (error != nil) {
@@ -23923,9 +23644,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -23965,8 +23687,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeMeshLocalPrefixWithCompletion:^(NSData * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.MeshLocalPrefix response %@", [value description]);
             if (error != nil) {
@@ -23991,9 +23714,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24033,8 +23757,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.OverrunCount response %@", [value description]);
             if (error != nil) {
@@ -24059,9 +23784,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24101,8 +23827,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeNeighborTableListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.NeighborTableList response %@", [value description]);
             if (error != nil) {
@@ -24127,9 +23854,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24169,8 +23897,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRouteTableListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RouteTableList response %@", [value description]);
             if (error != nil) {
@@ -24195,9 +23924,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24237,8 +23967,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributePartitionIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.PartitionId response %@", [value description]);
             if (error != nil) {
@@ -24263,9 +23994,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24305,8 +24037,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeWeightingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.Weighting response %@", [value description]);
             if (error != nil) {
@@ -24331,9 +24064,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24373,8 +24107,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeDataVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.DataVersion response %@", [value description]);
             if (error != nil) {
@@ -24399,9 +24134,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000000B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24441,8 +24177,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeStableDataVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.StableDataVersion response %@", [value description]);
             if (error != nil) {
@@ -24467,9 +24204,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000000C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24509,8 +24247,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000000D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeLeaderRouterIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.LeaderRouterId response %@", [value description]);
             if (error != nil) {
@@ -24535,9 +24274,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000000D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24577,8 +24317,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000000E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeDetachedRoleCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.DetachedRoleCount response %@", [value description]);
             if (error != nil) {
@@ -24603,9 +24344,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000000E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24645,8 +24387,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeChildRoleCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.ChildRoleCount response %@", [value description]);
             if (error != nil) {
@@ -24671,9 +24414,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24713,8 +24457,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRouterRoleCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RouterRoleCount response %@", [value description]);
             if (error != nil) {
@@ -24739,9 +24484,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24781,8 +24527,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeLeaderRoleCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.LeaderRoleCount response %@", [value description]);
             if (error != nil) {
@@ -24807,9 +24554,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24849,8 +24597,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeAttachAttemptCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.AttachAttemptCount response %@", [value description]);
             if (error != nil) {
@@ -24875,9 +24624,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24917,8 +24667,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributePartitionIdChangeCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.PartitionIdChangeCount response %@", [value description]);
             if (error != nil) {
@@ -24943,9 +24694,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -24985,8 +24737,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster
             readAttributeBetterPartitionAttachAttemptCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ThreadNetworkDiagnostics.BetterPartitionAttachAttemptCount response %@", [value description]);
@@ -25012,9 +24765,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25054,8 +24808,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeParentChangeCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.ParentChangeCount response %@", [value description]);
             if (error != nil) {
@@ -25080,9 +24835,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25122,8 +24878,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000016) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxTotalCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxTotalCount response %@", [value description]);
             if (error != nil) {
@@ -25148,9 +24905,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25190,8 +24948,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000017) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxUnicastCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxUnicastCount response %@", [value description]);
             if (error != nil) {
@@ -25216,9 +24975,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25258,8 +25018,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000018) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxBroadcastCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxBroadcastCount response %@", [value description]);
             if (error != nil) {
@@ -25284,9 +25045,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000018) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25326,8 +25088,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000019) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxAckRequestedCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxAckRequestedCount response %@", [value description]);
             if (error != nil) {
@@ -25352,9 +25115,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25394,8 +25158,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000001A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxAckedCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxAckedCount response %@", [value description]);
             if (error != nil) {
@@ -25420,9 +25185,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000001A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25462,8 +25228,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000001B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxNoAckRequestedCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxNoAckRequestedCount response %@", [value description]);
             if (error != nil) {
@@ -25488,9 +25255,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000001B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25530,8 +25298,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000001C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxDataCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxDataCount response %@", [value description]);
             if (error != nil) {
@@ -25556,9 +25325,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000001C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25598,8 +25368,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000001D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxDataPollCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxDataPollCount response %@", [value description]);
             if (error != nil) {
@@ -25624,9 +25395,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000001D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25666,8 +25438,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000001E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxBeaconCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxBeaconCount response %@", [value description]);
             if (error != nil) {
@@ -25692,9 +25465,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000001E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25734,8 +25508,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000001F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxBeaconRequestCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxBeaconRequestCount response %@", [value description]);
             if (error != nil) {
@@ -25760,9 +25535,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000001F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25802,8 +25578,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000020) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxOtherCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxOtherCount response %@", [value description]);
             if (error != nil) {
@@ -25828,9 +25605,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25870,8 +25648,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000021) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxRetryCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxRetryCount response %@", [value description]);
             if (error != nil) {
@@ -25896,9 +25675,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -25938,8 +25718,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000022) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxDirectMaxRetryExpiryCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxDirectMaxRetryExpiryCount response %@", [value description]);
             if (error != nil) {
@@ -25964,9 +25745,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000022) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26006,8 +25788,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000023) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxIndirectMaxRetryExpiryCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxIndirectMaxRetryExpiryCount response %@", [value description]);
             if (error != nil) {
@@ -26032,9 +25815,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000023) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26074,8 +25858,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000024) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxErrCcaCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxErrCcaCount response %@", [value description]);
             if (error != nil) {
@@ -26100,9 +25885,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26142,8 +25928,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000025) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxErrAbortCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxErrAbortCount response %@", [value description]);
             if (error != nil) {
@@ -26168,9 +25955,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26210,8 +25998,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000026) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeTxErrBusyChannelCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.TxErrBusyChannelCount response %@", [value description]);
             if (error != nil) {
@@ -26236,9 +26025,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000026) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26278,8 +26068,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000027) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxTotalCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxTotalCount response %@", [value description]);
             if (error != nil) {
@@ -26304,9 +26095,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000027) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26346,8 +26138,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000028) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxUnicastCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxUnicastCount response %@", [value description]);
             if (error != nil) {
@@ -26372,9 +26165,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000028) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26414,8 +26208,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000029) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxBroadcastCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxBroadcastCount response %@", [value description]);
             if (error != nil) {
@@ -26440,9 +26235,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000029) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26482,8 +26278,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000002A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxDataCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxDataCount response %@", [value description]);
             if (error != nil) {
@@ -26508,9 +26305,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000002A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26550,8 +26348,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000002B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxDataPollCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxDataPollCount response %@", [value description]);
             if (error != nil) {
@@ -26576,9 +26375,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000002B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26618,8 +26418,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000002C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxBeaconCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxBeaconCount response %@", [value description]);
             if (error != nil) {
@@ -26644,9 +26445,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000002C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26686,8 +26488,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000002D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxBeaconRequestCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxBeaconRequestCount response %@", [value description]);
             if (error != nil) {
@@ -26712,9 +26515,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000002D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26754,8 +26558,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000002E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxOtherCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxOtherCount response %@", [value description]);
             if (error != nil) {
@@ -26780,9 +26585,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000002E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26822,8 +26628,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000002F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxAddressFilteredCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxAddressFilteredCount response %@", [value description]);
             if (error != nil) {
@@ -26848,9 +26655,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000002F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26890,8 +26698,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000030) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxDestAddrFilteredCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxDestAddrFilteredCount response %@", [value description]);
             if (error != nil) {
@@ -26916,9 +26725,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -26958,8 +26768,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000031) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxDuplicatedCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxDuplicatedCount response %@", [value description]);
             if (error != nil) {
@@ -26984,9 +26795,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27026,8 +26838,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000032) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxErrNoFrameCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxErrNoFrameCount response %@", [value description]);
             if (error != nil) {
@@ -27052,9 +26865,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27094,8 +26908,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000033) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxErrUnknownNeighborCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxErrUnknownNeighborCount response %@", [value description]);
             if (error != nil) {
@@ -27120,9 +26935,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000033) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27162,8 +26978,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000034) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxErrInvalidSrcAddrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxErrInvalidSrcAddrCount response %@", [value description]);
             if (error != nil) {
@@ -27188,9 +27005,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000034) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27230,8 +27048,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000035) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxErrSecCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxErrSecCount response %@", [value description]);
             if (error != nil) {
@@ -27256,9 +27075,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000035) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27298,8 +27118,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000036) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxErrFcsCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxErrFcsCount response %@", [value description]);
             if (error != nil) {
@@ -27324,9 +27145,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000036) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27366,8 +27188,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000037) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeRxErrOtherCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.RxErrOtherCount response %@", [value description]);
             if (error != nil) {
@@ -27392,9 +27215,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000037) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27434,8 +27258,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000038) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeActiveTimestampWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.ActiveTimestamp response %@", [value description]);
             if (error != nil) {
@@ -27460,9 +27285,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000038) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27502,8 +27328,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x00000039) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributePendingTimestampWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.PendingTimestamp response %@", [value description]);
             if (error != nil) {
@@ -27528,9 +27355,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x00000039) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27570,8 +27398,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000003A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.Delay response %@", [value description]);
             if (error != nil) {
@@ -27596,9 +27425,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000003A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27638,8 +27468,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000003B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeSecurityPolicyWithCompletion:^(
             MTRThreadNetworkDiagnosticsClusterSecurityPolicy * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.SecurityPolicy response %@", [value description]);
@@ -27665,9 +27496,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000003B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27707,8 +27539,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000003C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeChannelPage0MaskWithCompletion:^(NSData * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.ChannelPage0Mask response %@", [value description]);
             if (error != nil) {
@@ -27733,9 +27566,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000003C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27775,8 +27609,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000003D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeOperationalDatasetComponentsWithCompletion:^(
             MTRThreadNetworkDiagnosticsClusterOperationalDatasetComponents * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.OperationalDatasetComponents response %@", [value description]);
@@ -27802,9 +27637,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000003D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27845,8 +27681,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000003E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeActiveNetworkFaultsListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.ActiveNetworkFaultsList response %@", [value description]);
             if (error != nil) {
@@ -27871,9 +27708,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000003E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27913,8 +27751,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -27939,9 +27778,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -27981,8 +27821,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -28007,9 +27848,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28049,8 +27891,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -28075,9 +27918,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28117,8 +27961,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -28143,9 +27988,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28185,8 +28031,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThreadNetworkDiagnostics.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -28211,9 +28058,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000035) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(endpointId)
+                                                                                         queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28284,8 +28132,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         __auto_type * params = [[MTRWiFiNetworkDiagnosticsClusterResetCountsParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -28327,8 +28176,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeBssidWithCompletion:^(NSData * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.Bssid response %@", [value description]);
             if (error != nil) {
@@ -28353,9 +28203,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28395,8 +28246,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeSecurityTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.SecurityType response %@", [value description]);
             if (error != nil) {
@@ -28421,9 +28273,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28463,8 +28316,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeWiFiVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.WiFiVersion response %@", [value description]);
             if (error != nil) {
@@ -28489,9 +28343,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28531,8 +28386,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeChannelNumberWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.ChannelNumber response %@", [value description]);
             if (error != nil) {
@@ -28557,9 +28413,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28599,8 +28456,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeRssiWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.Rssi response %@", [value description]);
             if (error != nil) {
@@ -28625,9 +28483,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28667,8 +28526,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeBeaconLostCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.BeaconLostCount response %@", [value description]);
             if (error != nil) {
@@ -28693,9 +28553,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28735,8 +28596,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeBeaconRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.BeaconRxCount response %@", [value description]);
             if (error != nil) {
@@ -28761,9 +28623,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28803,8 +28666,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributePacketMulticastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.PacketMulticastRxCount response %@", [value description]);
             if (error != nil) {
@@ -28829,9 +28693,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28871,8 +28736,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributePacketMulticastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.PacketMulticastTxCount response %@", [value description]);
             if (error != nil) {
@@ -28897,9 +28763,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -28939,8 +28806,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributePacketUnicastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.PacketUnicastRxCount response %@", [value description]);
             if (error != nil) {
@@ -28965,9 +28833,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29007,8 +28876,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributePacketUnicastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.PacketUnicastTxCount response %@", [value description]);
             if (error != nil) {
@@ -29033,9 +28903,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29075,8 +28946,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeCurrentMaxRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.CurrentMaxRate response %@", [value description]);
             if (error != nil) {
@@ -29101,9 +28973,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x0000000B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29143,8 +29016,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.OverrunCount response %@", [value description]);
             if (error != nil) {
@@ -29169,9 +29043,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x0000000C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29211,8 +29086,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -29237,9 +29113,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29279,8 +29156,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -29305,9 +29183,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29347,8 +29226,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -29373,9 +29253,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29415,8 +29296,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -29441,9 +29323,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29483,8 +29366,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WiFiNetworkDiagnostics.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -29509,9 +29393,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000036) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29575,8 +29460,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         __auto_type * params = [[MTREthernetNetworkDiagnosticsClusterResetCountsParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -29618,8 +29504,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.PHYRate response %@", [value description]);
             if (error != nil) {
@@ -29644,9 +29531,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29686,8 +29574,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeFullDuplexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.FullDuplex response %@", [value description]);
             if (error != nil) {
@@ -29712,9 +29601,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29754,8 +29644,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.PacketRxCount response %@", [value description]);
             if (error != nil) {
@@ -29780,9 +29671,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29822,8 +29714,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.PacketTxCount response %@", [value description]);
             if (error != nil) {
@@ -29848,9 +29741,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29890,8 +29784,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.TxErrCount response %@", [value description]);
             if (error != nil) {
@@ -29916,9 +29811,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -29958,8 +29854,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.CollisionCount response %@", [value description]);
             if (error != nil) {
@@ -29984,9 +29881,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30026,8 +29924,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.OverrunCount response %@", [value description]);
             if (error != nil) {
@@ -30052,9 +29951,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30094,8 +29994,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeCarrierDetectWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.CarrierDetect response %@", [value description]);
             if (error != nil) {
@@ -30120,9 +30021,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30162,8 +30064,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeTimeSinceResetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.TimeSinceReset response %@", [value description]);
             if (error != nil) {
@@ -30188,9 +30091,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30230,8 +30134,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -30256,9 +30161,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30298,8 +30204,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -30324,9 +30231,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30366,8 +30274,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -30392,9 +30301,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30434,8 +30344,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -30460,9 +30371,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30502,8 +30414,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"EthernetNetworkDiagnostics.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -30528,9 +30441,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000037) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30604,9 +30518,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeVendorNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.VendorName response %@", [value description]);
             if (error != nil) {
@@ -30631,10 +30545,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30674,9 +30588,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeVendorIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.VendorID response %@", [value description]);
             if (error != nil) {
@@ -30701,10 +30615,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30744,9 +30658,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeProductNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.ProductName response %@", [value description]);
             if (error != nil) {
@@ -30771,10 +30685,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30814,9 +30728,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.NodeLabel response %@", [value description]);
             if (error != nil) {
@@ -30844,10 +30758,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) WriteAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -30883,10 +30797,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30926,9 +30840,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeHardwareVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.HardwareVersion response %@", [value description]);
             if (error != nil) {
@@ -30953,10 +30867,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -30996,9 +30910,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeHardwareVersionStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.HardwareVersionString response %@", [value description]);
             if (error != nil) {
@@ -31023,10 +30937,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31066,9 +30980,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeSoftwareVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.SoftwareVersion response %@", [value description]);
             if (error != nil) {
@@ -31093,10 +31007,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31136,9 +31050,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeSoftwareVersionStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.SoftwareVersionString response %@", [value description]);
             if (error != nil) {
@@ -31163,10 +31077,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31206,9 +31120,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeManufacturingDateWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.ManufacturingDate response %@", [value description]);
             if (error != nil) {
@@ -31233,10 +31147,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000000B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31276,9 +31190,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributePartNumberWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.PartNumber response %@", [value description]);
             if (error != nil) {
@@ -31303,10 +31217,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000000C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31346,9 +31260,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000000D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeProductURLWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.ProductURL response %@", [value description]);
             if (error != nil) {
@@ -31373,10 +31287,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000000D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31416,9 +31330,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000000E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeProductLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.ProductLabel response %@", [value description]);
             if (error != nil) {
@@ -31443,10 +31357,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000000E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31486,9 +31400,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeSerialNumberWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.SerialNumber response %@", [value description]);
             if (error != nil) {
@@ -31513,10 +31427,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31556,9 +31470,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeReachableWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.Reachable response %@", [value description]);
             if (error != nil) {
@@ -31583,10 +31497,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31626,9 +31540,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeUniqueIDWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.UniqueID response %@", [value description]);
             if (error != nil) {
@@ -31653,10 +31567,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31696,9 +31610,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -31723,10 +31637,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31766,9 +31680,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -31793,10 +31707,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31836,9 +31750,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -31863,10 +31777,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31906,9 +31820,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -31933,10 +31847,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -31976,9 +31890,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BridgedDeviceBasic.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -32003,10 +31917,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000039) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBridgedDeviceBasic * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasic alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32071,9 +31985,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNumberOfPositionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Switch.NumberOfPositions response %@", [value description]);
             if (error != nil) {
@@ -32098,10 +32010,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32141,9 +32051,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeCurrentPositionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Switch.CurrentPosition response %@", [value description]);
             if (error != nil) {
@@ -32168,10 +32076,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32211,9 +32117,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeMultiPressMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Switch.MultiPressMax response %@", [value description]);
             if (error != nil) {
@@ -32238,10 +32142,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32281,9 +32183,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Switch.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -32308,10 +32208,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32351,9 +32249,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Switch.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -32378,10 +32274,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32421,9 +32315,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Switch.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -32448,10 +32340,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32491,9 +32381,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Switch.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -32518,10 +32406,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32561,9 +32447,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Switch.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -32588,10 +32472,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003B) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device
-                                                                           endpointID:@(endpointId)
-                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32656,8 +32538,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenCommissioningWindowParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -32705,8 +32588,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -32749,8 +32633,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRAdministratorCommissioningClusterRevokeCommissioningParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -32792,8 +32677,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AdministratorCommissioning.WindowStatus response %@", [value description]);
             if (error != nil) {
@@ -32818,9 +32704,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32860,8 +32747,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AdministratorCommissioning.AdminFabricIndex response %@", [value description]);
             if (error != nil) {
@@ -32886,9 +32774,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32928,8 +32817,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AdministratorCommissioning.AdminVendorId response %@", [value description]);
             if (error != nil) {
@@ -32954,9 +32844,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -32996,8 +32887,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AdministratorCommissioning.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -33022,9 +32914,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -33064,8 +32957,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AdministratorCommissioning.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -33090,9 +32984,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -33132,8 +33027,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AdministratorCommissioning.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -33158,9 +33054,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -33200,8 +33097,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AdministratorCommissioning.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -33226,9 +33124,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -33268,8 +33167,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AdministratorCommissioning.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -33294,9 +33194,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003C) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(endpointId)
+                                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -33365,8 +33266,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         __auto_type * params = [[MTROperationalCredentialsClusterAttestationRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -33412,8 +33314,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         __auto_type * params = [[MTROperationalCredentialsClusterCertificateChainRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -33461,8 +33364,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         __auto_type * params = [[MTROperationalCredentialsClusterCSRRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -33517,8 +33421,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) command (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         __auto_type * params = [[MTROperationalCredentialsClusterAddNOCParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -33573,8 +33478,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) command (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         __auto_type * params = [[MTROperationalCredentialsClusterUpdateNOCParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -33625,8 +33531,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) command (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         __auto_type * params = [[MTROperationalCredentialsClusterUpdateFabricLabelParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -33674,8 +33581,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) command (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -33721,8 +33629,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) command (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         __auto_type * params = [[MTROperationalCredentialsClusterAddTrustedRootCertificateParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -33766,9 +33675,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
             params.filterByFabric = mFabricFiltered.Value();
         }
@@ -33797,9 +33707,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -33839,9 +33750,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
             params.filterByFabric = mFabricFiltered.Value();
         }
@@ -33870,9 +33782,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -33912,8 +33825,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeSupportedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OperationalCredentials.SupportedFabrics response %@", [value description]);
             if (error != nil) {
@@ -33938,9 +33852,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -33980,8 +33895,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OperationalCredentials.CommissionedFabrics response %@", [value description]);
             if (error != nil) {
@@ -34006,9 +33922,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34048,8 +33965,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeTrustedRootCertificatesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OperationalCredentials.TrustedRootCertificates response %@", [value description]);
             if (error != nil) {
@@ -34074,9 +33992,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34116,8 +34035,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OperationalCredentials.CurrentFabricIndex response %@", [value description]);
             if (error != nil) {
@@ -34142,9 +34062,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34184,8 +34105,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OperationalCredentials.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -34210,9 +34132,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34252,8 +34175,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OperationalCredentials.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -34278,9 +34202,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34320,8 +34245,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OperationalCredentials.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -34346,9 +34272,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34388,8 +34315,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OperationalCredentials.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -34414,9 +34342,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34456,8 +34385,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OperationalCredentials.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -34482,9 +34412,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003E) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34548,9 +34479,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -34631,9 +34562,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -34679,9 +34610,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -34726,9 +34657,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadAllIndicesParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -34784,10 +34715,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
             params.filterByFabric = mFabricFiltered.Value();
         }
@@ -34820,10 +34751,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -34872,10 +34803,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34915,10 +34846,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
             params.filterByFabric = mFabricFiltered.Value();
         }
@@ -34947,10 +34878,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -34990,9 +34921,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeMaxGroupsPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GroupKeyManagement.MaxGroupsPerFabric response %@", [value description]);
             if (error != nil) {
@@ -35017,10 +34948,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35060,9 +34991,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeMaxGroupKeysPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GroupKeyManagement.MaxGroupKeysPerFabric response %@", [value description]);
             if (error != nil) {
@@ -35087,10 +35018,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35130,9 +35061,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GroupKeyManagement.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -35157,10 +35088,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35200,9 +35131,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GroupKeyManagement.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -35227,10 +35158,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35270,9 +35201,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GroupKeyManagement.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -35297,10 +35228,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35340,9 +35271,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GroupKeyManagement.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -35367,10 +35298,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35410,9 +35341,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"GroupKeyManagement.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -35437,10 +35368,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000003F) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(endpointId)
-                                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(endpointId)
+                                                                                   queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35496,9 +35427,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FixedLabel.LabelList response %@", [value description]);
             if (error != nil) {
@@ -35523,10 +35454,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35566,9 +35497,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FixedLabel.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -35593,10 +35524,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35636,9 +35567,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FixedLabel.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -35663,10 +35594,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35706,9 +35637,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FixedLabel.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -35733,10 +35664,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35776,9 +35707,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FixedLabel.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -35803,10 +35734,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35846,9 +35777,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FixedLabel.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -35873,10 +35804,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000040) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -35932,9 +35863,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UserLabel.LabelList response %@", [value description]);
             if (error != nil) {
@@ -35963,10 +35894,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -36016,10 +35947,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36059,9 +35990,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UserLabel.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -36086,10 +36017,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36129,9 +36060,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UserLabel.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -36156,10 +36087,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36199,9 +36130,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UserLabel.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -36226,10 +36157,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36269,9 +36200,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UserLabel.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -36296,10 +36227,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36339,9 +36270,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UserLabel.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -36366,10 +36297,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000041) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36426,9 +36357,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeStateValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BooleanState.StateValue response %@", [value description]);
             if (error != nil) {
@@ -36453,10 +36384,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36496,9 +36427,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BooleanState.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -36523,10 +36454,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36566,9 +36497,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BooleanState.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -36593,10 +36524,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36636,9 +36567,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BooleanState.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -36663,10 +36594,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36706,9 +36637,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BooleanState.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -36733,10 +36664,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36776,9 +36707,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BooleanState.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -36803,10 +36734,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000045) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36868,9 +36799,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -36914,9 +36845,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.Description response %@", [value description]);
             if (error != nil) {
@@ -36941,10 +36872,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -36984,9 +36915,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeStandardNamespaceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.StandardNamespace response %@", [value description]);
             if (error != nil) {
@@ -37011,10 +36942,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37054,9 +36985,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeSupportedModesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.SupportedModes response %@", [value description]);
             if (error != nil) {
@@ -37081,10 +37012,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37124,9 +37055,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.CurrentMode response %@", [value description]);
             if (error != nil) {
@@ -37151,10 +37082,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37194,9 +37125,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeStartUpModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.StartUpMode response %@", [value description]);
             if (error != nil) {
@@ -37224,10 +37155,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) WriteAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -37261,10 +37192,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37304,9 +37235,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeOnModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.OnMode response %@", [value description]);
             if (error != nil) {
@@ -37334,10 +37265,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) WriteAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -37371,10 +37302,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37414,9 +37345,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -37441,10 +37372,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37484,9 +37415,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -37511,10 +37442,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37554,9 +37485,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -37581,10 +37512,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37624,9 +37555,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -37651,10 +37582,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37694,9 +37625,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ModeSelect.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -37721,10 +37652,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000050) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -37838,9 +37769,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -37888,9 +37817,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -37939,9 +37866,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterUnlockWithTimeoutParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -37996,9 +37921,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38049,9 +37972,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38099,9 +38020,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x0000000D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38149,9 +38068,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x0000000E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38199,9 +38116,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38249,9 +38164,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38299,9 +38212,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38348,9 +38259,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38396,9 +38305,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38448,9 +38355,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x0000001A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38522,9 +38427,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x0000001B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38569,9 +38472,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x0000001D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38621,9 +38522,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000022) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38691,9 +38590,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000024) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38744,9 +38641,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) command (0x00000026) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -38799,9 +38694,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.LockState response %@", [value description]);
             if (error != nil) {
@@ -38826,10 +38719,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -38869,9 +38760,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeLockTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.LockType response %@", [value description]);
             if (error != nil) {
@@ -38896,10 +38785,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -38939,9 +38826,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeActuatorEnabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.ActuatorEnabled response %@", [value description]);
             if (error != nil) {
@@ -38966,10 +38851,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39009,9 +38892,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeDoorStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.DoorState response %@", [value description]);
             if (error != nil) {
@@ -39036,10 +38917,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39079,9 +38958,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeDoorOpenEventsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.DoorOpenEvents response %@", [value description]);
             if (error != nil) {
@@ -39109,10 +38986,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -39146,10 +39021,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39189,9 +39062,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeDoorClosedEventsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.DoorClosedEvents response %@", [value description]);
             if (error != nil) {
@@ -39219,10 +39090,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -39256,10 +39125,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39299,9 +39166,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeOpenPeriodWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.OpenPeriod response %@", [value description]);
             if (error != nil) {
@@ -39329,10 +39194,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -39366,10 +39229,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39409,9 +39270,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.NumberOfTotalUsersSupported response %@", [value description]);
             if (error != nil) {
@@ -39436,10 +39295,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39479,9 +39336,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNumberOfPINUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.NumberOfPINUsersSupported response %@", [value description]);
             if (error != nil) {
@@ -39506,10 +39361,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39549,9 +39402,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNumberOfRFIDUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.NumberOfRFIDUsersSupported response %@", [value description]);
             if (error != nil) {
@@ -39576,10 +39427,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39619,9 +39468,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.NumberOfWeekDaySchedulesSupportedPerUser response %@", [value description]);
@@ -39647,10 +39494,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39690,9 +39535,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNumberOfYearDaySchedulesSupportedPerUserWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.NumberOfYearDaySchedulesSupportedPerUser response %@", [value description]);
@@ -39718,10 +39561,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39761,9 +39602,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000016) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster
             readAttributeNumberOfHolidaySchedulesSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"DoorLock.NumberOfHolidaySchedulesSupported response %@", [value description]);
@@ -39789,10 +39628,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39832,9 +39669,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000017) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeMaxPINCodeLengthWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.MaxPINCodeLength response %@", [value description]);
             if (error != nil) {
@@ -39859,10 +39694,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39902,9 +39735,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000018) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeMinPINCodeLengthWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.MinPINCodeLength response %@", [value description]);
             if (error != nil) {
@@ -39929,10 +39760,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000018) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -39972,9 +39801,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000019) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeMaxRFIDCodeLengthWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.MaxRFIDCodeLength response %@", [value description]);
             if (error != nil) {
@@ -39999,10 +39826,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40042,9 +39867,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000001A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeMinRFIDCodeLengthWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.MinRFIDCodeLength response %@", [value description]);
             if (error != nil) {
@@ -40069,10 +39892,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000001A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40112,9 +39933,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000001B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeCredentialRulesSupportWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.CredentialRulesSupport response %@", [value description]);
             if (error != nil) {
@@ -40139,10 +39958,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000001B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40182,9 +39999,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000001C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeNumberOfCredentialsSupportedPerUserWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.NumberOfCredentialsSupportedPerUser response %@", [value description]);
@@ -40210,10 +40025,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000001C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40253,9 +40066,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000021) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeLanguageWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.Language response %@", [value description]);
             if (error != nil) {
@@ -40283,10 +40094,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -40322,10 +40131,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40365,9 +40172,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000022) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeLEDSettingsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.LEDSettings response %@", [value description]);
             if (error != nil) {
@@ -40395,10 +40200,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000022) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -40432,10 +40235,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000022) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40475,9 +40276,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000023) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAutoRelockTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.AutoRelockTime response %@", [value description]);
             if (error != nil) {
@@ -40505,10 +40304,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000023) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -40542,10 +40339,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000023) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40585,9 +40380,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000024) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeSoundVolumeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.SoundVolume response %@", [value description]);
             if (error != nil) {
@@ -40615,10 +40408,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -40652,10 +40443,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40695,9 +40484,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000025) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeOperatingModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.OperatingMode response %@", [value description]);
             if (error != nil) {
@@ -40725,10 +40512,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -40762,10 +40547,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40805,9 +40588,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000026) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeSupportedOperatingModesWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.SupportedOperatingModes response %@", [value description]);
             if (error != nil) {
@@ -40832,10 +40613,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000026) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40875,9 +40654,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000027) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeDefaultConfigurationRegisterWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.DefaultConfigurationRegister response %@", [value description]);
             if (error != nil) {
@@ -40902,10 +40679,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000027) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -40945,9 +40720,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000028) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeEnableLocalProgrammingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.EnableLocalProgramming response %@", [value description]);
             if (error != nil) {
@@ -40975,10 +40748,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000028) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -41012,10 +40783,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000028) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -41055,9 +40824,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000029) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeEnableOneTouchLockingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.EnableOneTouchLocking response %@", [value description]);
             if (error != nil) {
@@ -41085,10 +40852,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000029) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -41122,10 +40887,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000029) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -41165,9 +40928,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000002A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeEnableInsideStatusLEDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.EnableInsideStatusLED response %@", [value description]);
             if (error != nil) {
@@ -41195,10 +40956,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x0000002A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -41232,10 +40991,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000002A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -41275,9 +41032,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000002B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeEnablePrivacyModeButtonWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.EnablePrivacyModeButton response %@", [value description]);
             if (error != nil) {
@@ -41305,10 +41060,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x0000002B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -41342,10 +41095,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000002B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -41385,9 +41136,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000002C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeLocalProgrammingFeaturesWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.LocalProgrammingFeatures response %@", [value description]);
             if (error != nil) {
@@ -41415,10 +41164,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x0000002C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -41452,10 +41199,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000002C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -41495,9 +41240,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000030) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeWrongCodeEntryLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.WrongCodeEntryLimit response %@", [value description]);
             if (error != nil) {
@@ -41525,10 +41268,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -41562,10 +41303,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -41605,9 +41344,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000031) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.UserCodeTemporaryDisableTime response %@", [value description]);
             if (error != nil) {
@@ -41635,10 +41372,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -41673,10 +41408,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -41716,9 +41449,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000032) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeSendPINOverTheAirWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.SendPINOverTheAir response %@", [value description]);
             if (error != nil) {
@@ -41746,10 +41477,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -41783,10 +41512,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -41826,9 +41553,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000033) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.RequirePINforRemoteOperation response %@", [value description]);
             if (error != nil) {
@@ -41856,10 +41581,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000033) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -41894,10 +41617,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000033) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -41937,9 +41658,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x00000035) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeExpiringUserTimeoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.ExpiringUserTimeout response %@", [value description]);
             if (error != nil) {
@@ -41967,10 +41686,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) WriteAttribute (0x00000035) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -42004,10 +41721,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x00000035) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -42047,9 +41762,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -42074,10 +41787,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -42117,9 +41828,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -42144,10 +41853,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -42187,9 +41894,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -42214,10 +41919,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -42257,9 +41960,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -42284,10 +41985,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -42327,9 +42026,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"DoorLock.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -42354,10 +42051,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000101) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -42440,9 +42135,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRWindowCoveringClusterUpOrOpenParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -42483,9 +42178,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRWindowCoveringClusterDownOrCloseParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -42526,9 +42221,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRWindowCoveringClusterStopMotionParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -42570,9 +42265,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRWindowCoveringClusterGoToLiftValueParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -42616,9 +42311,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) command (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -42662,9 +42357,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) command (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRWindowCoveringClusterGoToTiltValueParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -42708,9 +42403,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) command (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -42754,9 +42449,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.Type response %@", [value description]);
             if (error != nil) {
@@ -42781,10 +42476,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -42824,9 +42519,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributePhysicalClosedLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.PhysicalClosedLimitLift response %@", [value description]);
             if (error != nil) {
@@ -42851,10 +42546,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -42894,9 +42589,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributePhysicalClosedLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.PhysicalClosedLimitTilt response %@", [value description]);
             if (error != nil) {
@@ -42921,10 +42616,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -42964,9 +42659,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeCurrentPositionLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.CurrentPositionLift response %@", [value description]);
             if (error != nil) {
@@ -42991,10 +42686,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43034,9 +42729,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeCurrentPositionTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.CurrentPositionTilt response %@", [value description]);
             if (error != nil) {
@@ -43061,10 +42756,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43104,9 +42799,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeNumberOfActuationsLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.NumberOfActuationsLift response %@", [value description]);
             if (error != nil) {
@@ -43131,10 +42826,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43174,9 +42869,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeNumberOfActuationsTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.NumberOfActuationsTilt response %@", [value description]);
             if (error != nil) {
@@ -43201,10 +42896,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43244,9 +42939,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.ConfigStatus response %@", [value description]);
             if (error != nil) {
@@ -43271,10 +42966,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43314,9 +43009,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.CurrentPositionLiftPercentage response %@", [value description]);
             if (error != nil) {
@@ -43341,10 +43036,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43384,9 +43079,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.CurrentPositionTiltPercentage response %@", [value description]);
             if (error != nil) {
@@ -43411,10 +43106,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43454,9 +43149,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.OperationalStatus response %@", [value description]);
             if (error != nil) {
@@ -43481,10 +43176,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43524,9 +43219,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster
             readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"WindowCovering.TargetPositionLiftPercent100ths response %@", [value description]);
@@ -43552,10 +43247,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000000B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43595,9 +43290,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster
             readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"WindowCovering.TargetPositionTiltPercent100ths response %@", [value description]);
@@ -43623,10 +43318,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000000C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43666,9 +43361,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000000D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeEndProductTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.EndProductType response %@", [value description]);
             if (error != nil) {
@@ -43693,10 +43388,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000000D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43736,9 +43431,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000000E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster
             readAttributeCurrentPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"WindowCovering.CurrentPositionLiftPercent100ths response %@", [value description]);
@@ -43764,10 +43459,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000000E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43807,9 +43502,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster
             readAttributeCurrentPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"WindowCovering.CurrentPositionTiltPercent100ths response %@", [value description]);
@@ -43835,10 +43530,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43878,9 +43573,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeInstalledOpenLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.InstalledOpenLimitLift response %@", [value description]);
             if (error != nil) {
@@ -43905,10 +43600,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -43948,9 +43643,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeInstalledClosedLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.InstalledClosedLimitLift response %@", [value description]);
             if (error != nil) {
@@ -43975,10 +43670,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44018,9 +43713,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeInstalledOpenLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.InstalledOpenLimitTilt response %@", [value description]);
             if (error != nil) {
@@ -44045,10 +43740,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44088,9 +43783,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeInstalledClosedLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.InstalledClosedLimitTilt response %@", [value description]);
             if (error != nil) {
@@ -44115,10 +43810,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44158,9 +43853,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x00000017) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.Mode response %@", [value description]);
             if (error != nil) {
@@ -44188,10 +43883,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) WriteAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -44225,10 +43920,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44268,9 +43963,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000001A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeSafetyStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.SafetyStatus response %@", [value description]);
             if (error != nil) {
@@ -44295,10 +43990,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000001A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44338,9 +44033,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -44365,10 +44060,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44408,9 +44103,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -44435,10 +44130,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44478,9 +44173,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -44505,10 +44200,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44548,9 +44243,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -44575,10 +44270,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44618,9 +44313,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"WindowCovering.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -44645,10 +44340,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000102) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44715,9 +44410,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRBarrierControlClusterBarrierControlGoToPercentParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -44760,9 +44455,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         __auto_type * params = [[MTRBarrierControlClusterBarrierControlStopParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -44804,9 +44499,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierMovingStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierMovingState response %@", [value description]);
             if (error != nil) {
@@ -44831,10 +44526,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44874,9 +44569,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierSafetyStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierSafetyStatus response %@", [value description]);
             if (error != nil) {
@@ -44901,10 +44596,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -44944,9 +44639,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierCapabilitiesWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierCapabilities response %@", [value description]);
             if (error != nil) {
@@ -44971,10 +44666,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45014,9 +44709,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierOpenEventsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierOpenEvents response %@", [value description]);
             if (error != nil) {
@@ -45044,10 +44739,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) WriteAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -45081,10 +44776,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45124,9 +44819,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierCloseEventsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierCloseEvents response %@", [value description]);
             if (error != nil) {
@@ -45154,10 +44849,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) WriteAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -45191,10 +44886,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45234,9 +44929,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierCommandOpenEventsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierCommandOpenEvents response %@", [value description]);
             if (error != nil) {
@@ -45264,10 +44959,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) WriteAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -45302,10 +44997,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45345,9 +45040,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierCommandCloseEventsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierCommandCloseEvents response %@", [value description]);
             if (error != nil) {
@@ -45375,10 +45070,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) WriteAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -45413,10 +45108,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45456,9 +45151,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierOpenPeriodWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierOpenPeriod response %@", [value description]);
             if (error != nil) {
@@ -45486,10 +45181,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) WriteAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -45523,10 +45218,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45566,9 +45261,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierClosePeriodWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierClosePeriod response %@", [value description]);
             if (error != nil) {
@@ -45596,10 +45291,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) WriteAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -45633,10 +45328,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45676,9 +45371,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeBarrierPositionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.BarrierPosition response %@", [value description]);
             if (error != nil) {
@@ -45703,10 +45398,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45746,9 +45441,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -45773,10 +45468,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45816,9 +45511,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -45843,10 +45538,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45886,9 +45581,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -45913,10 +45608,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -45956,9 +45651,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -45983,10 +45678,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46026,9 +45721,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BarrierControl.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -46053,10 +45748,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000103) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBarrierControl * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
-                                                                                           endpointID:@(endpointId)
-                                                                                                queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBarrierControl alloc] initWithDevice:device
+                                                                          endpointID:@(endpointId)
+                                                                               queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46151,8 +45846,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMaxPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MaxPressure response %@", [value description]);
             if (error != nil) {
@@ -46177,9 +45873,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46219,8 +45916,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMaxSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MaxSpeed response %@", [value description]);
             if (error != nil) {
@@ -46245,9 +45943,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46287,8 +45986,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMaxFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MaxFlow response %@", [value description]);
             if (error != nil) {
@@ -46313,9 +46013,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46355,8 +46056,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMinConstPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MinConstPressure response %@", [value description]);
             if (error != nil) {
@@ -46381,9 +46083,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46423,8 +46126,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMaxConstPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MaxConstPressure response %@", [value description]);
             if (error != nil) {
@@ -46449,9 +46153,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46491,8 +46196,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMinCompPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MinCompPressure response %@", [value description]);
             if (error != nil) {
@@ -46517,9 +46223,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46559,8 +46266,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMaxCompPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MaxCompPressure response %@", [value description]);
             if (error != nil) {
@@ -46585,9 +46293,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46627,8 +46336,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMinConstSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MinConstSpeed response %@", [value description]);
             if (error != nil) {
@@ -46653,9 +46363,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46695,8 +46406,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMaxConstSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MaxConstSpeed response %@", [value description]);
             if (error != nil) {
@@ -46721,9 +46433,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46763,8 +46476,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMinConstFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MinConstFlow response %@", [value description]);
             if (error != nil) {
@@ -46789,9 +46503,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46831,8 +46546,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMaxConstFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MaxConstFlow response %@", [value description]);
             if (error != nil) {
@@ -46857,9 +46573,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46899,8 +46616,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMinConstTempWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MinConstTemp response %@", [value description]);
             if (error != nil) {
@@ -46925,9 +46643,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x0000000B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -46967,8 +46686,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMaxConstTempWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.MaxConstTemp response %@", [value description]);
             if (error != nil) {
@@ -46993,9 +46713,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x0000000C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47035,8 +46756,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributePumpStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.PumpStatus response %@", [value description]);
             if (error != nil) {
@@ -47061,9 +46783,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47103,8 +46826,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.EffectiveOperationMode response %@", [value description]);
             if (error != nil) {
@@ -47129,9 +46853,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47171,8 +46896,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.EffectiveControlMode response %@", [value description]);
             if (error != nil) {
@@ -47197,9 +46923,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47239,8 +46966,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.Capacity response %@", [value description]);
             if (error != nil) {
@@ -47265,9 +46993,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47307,8 +47036,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.Speed response %@", [value description]);
             if (error != nil) {
@@ -47333,9 +47063,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47375,8 +47106,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.LifetimeRunningHours response %@", [value description]);
             if (error != nil) {
@@ -47404,9 +47136,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) WriteAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -47441,9 +47174,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47483,8 +47217,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000016) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributePowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.Power response %@", [value description]);
             if (error != nil) {
@@ -47509,9 +47244,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47551,8 +47287,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000017) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.LifetimeEnergyConsumed response %@", [value description]);
             if (error != nil) {
@@ -47580,9 +47317,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) WriteAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -47618,9 +47356,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47660,8 +47399,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000020) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.OperationMode response %@", [value description]);
             if (error != nil) {
@@ -47689,9 +47429,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) WriteAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -47725,9 +47466,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47767,8 +47509,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x00000021) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.ControlMode response %@", [value description]);
             if (error != nil) {
@@ -47796,9 +47539,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) WriteAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -47832,9 +47576,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47874,8 +47619,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -47900,9 +47646,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -47942,8 +47689,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -47968,9 +47716,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48010,8 +47759,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -48036,9 +47786,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48078,8 +47829,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -48104,9 +47856,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48146,8 +47899,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PumpConfigurationAndControl.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -48172,9 +47926,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000200) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48283,9 +48038,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRThermostatClusterSetpointRaiseLowerParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -48334,9 +48089,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRThermostatClusterSetWeeklyScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -48406,9 +48161,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRThermostatClusterGetWeeklyScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -48454,9 +48209,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRThermostatClusterClearWeeklyScheduleParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -48498,9 +48253,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeLocalTemperatureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.LocalTemperature response %@", [value description]);
             if (error != nil) {
@@ -48525,10 +48280,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48568,9 +48323,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeOutdoorTemperatureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.OutdoorTemperature response %@", [value description]);
             if (error != nil) {
@@ -48595,10 +48350,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48638,9 +48393,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeOccupancyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.Occupancy response %@", [value description]);
             if (error != nil) {
@@ -48665,10 +48420,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48708,9 +48463,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAbsMinHeatSetpointLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.AbsMinHeatSetpointLimit response %@", [value description]);
             if (error != nil) {
@@ -48735,10 +48490,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48778,9 +48533,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAbsMaxHeatSetpointLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.AbsMaxHeatSetpointLimit response %@", [value description]);
             if (error != nil) {
@@ -48805,10 +48560,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48848,9 +48603,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAbsMinCoolSetpointLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.AbsMinCoolSetpointLimit response %@", [value description]);
             if (error != nil) {
@@ -48875,10 +48630,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48918,9 +48673,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAbsMaxCoolSetpointLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.AbsMaxCoolSetpointLimit response %@", [value description]);
             if (error != nil) {
@@ -48945,10 +48700,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -48988,9 +48743,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributePICoolingDemandWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.PICoolingDemand response %@", [value description]);
             if (error != nil) {
@@ -49015,10 +48770,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -49058,9 +48813,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributePIHeatingDemandWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.PIHeatingDemand response %@", [value description]);
             if (error != nil) {
@@ -49085,10 +48840,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -49128,9 +48883,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeHVACSystemTypeConfigurationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.HVACSystemTypeConfiguration response %@", [value description]);
             if (error != nil) {
@@ -49158,10 +48913,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -49196,10 +48951,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -49239,9 +48994,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeLocalTemperatureCalibrationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.LocalTemperatureCalibration response %@", [value description]);
             if (error != nil) {
@@ -49269,10 +49024,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -49307,10 +49062,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -49350,9 +49105,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeOccupiedCoolingSetpointWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.OccupiedCoolingSetpoint response %@", [value description]);
             if (error != nil) {
@@ -49380,10 +49135,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -49417,10 +49172,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -49460,9 +49215,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeOccupiedHeatingSetpointWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.OccupiedHeatingSetpoint response %@", [value description]);
             if (error != nil) {
@@ -49490,10 +49245,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -49527,10 +49282,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -49570,9 +49325,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeUnoccupiedCoolingSetpointWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.UnoccupiedCoolingSetpoint response %@", [value description]);
             if (error != nil) {
@@ -49600,10 +49355,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -49638,10 +49393,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -49681,9 +49436,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeUnoccupiedHeatingSetpointWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.UnoccupiedHeatingSetpoint response %@", [value description]);
             if (error != nil) {
@@ -49711,10 +49466,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -49749,10 +49504,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -49792,9 +49547,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeMinHeatSetpointLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.MinHeatSetpointLimit response %@", [value description]);
             if (error != nil) {
@@ -49822,10 +49577,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -49859,10 +49614,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -49902,9 +49657,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000016) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeMaxHeatSetpointLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.MaxHeatSetpointLimit response %@", [value description]);
             if (error != nil) {
@@ -49932,10 +49687,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -49969,10 +49724,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50012,9 +49767,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000017) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeMinCoolSetpointLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.MinCoolSetpointLimit response %@", [value description]);
             if (error != nil) {
@@ -50042,10 +49797,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -50079,10 +49834,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50122,9 +49877,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000018) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeMaxCoolSetpointLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.MaxCoolSetpointLimit response %@", [value description]);
             if (error != nil) {
@@ -50152,10 +49907,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000018) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -50189,10 +49944,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000018) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50232,9 +49987,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000019) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeMinSetpointDeadBandWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.MinSetpointDeadBand response %@", [value description]);
             if (error != nil) {
@@ -50262,10 +50017,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -50299,10 +50054,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50342,9 +50097,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000001A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeRemoteSensingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.RemoteSensing response %@", [value description]);
             if (error != nil) {
@@ -50372,10 +50127,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x0000001A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -50409,10 +50164,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000001A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50452,9 +50207,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000001B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeControlSequenceOfOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ControlSequenceOfOperation response %@", [value description]);
             if (error != nil) {
@@ -50482,10 +50237,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x0000001B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -50520,10 +50275,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000001B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50563,9 +50318,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000001C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeSystemModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.SystemMode response %@", [value description]);
             if (error != nil) {
@@ -50593,10 +50348,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x0000001C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -50630,10 +50385,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000001C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50673,9 +50428,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000001E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeThermostatRunningModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ThermostatRunningMode response %@", [value description]);
             if (error != nil) {
@@ -50700,10 +50455,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000001E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50743,9 +50498,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000020) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeStartOfWeekWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.StartOfWeek response %@", [value description]);
             if (error != nil) {
@@ -50770,10 +50525,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50813,9 +50568,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000021) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeNumberOfWeeklyTransitionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.NumberOfWeeklyTransitions response %@", [value description]);
             if (error != nil) {
@@ -50840,10 +50595,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50883,9 +50638,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000022) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeNumberOfDailyTransitionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.NumberOfDailyTransitions response %@", [value description]);
             if (error != nil) {
@@ -50910,10 +50665,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000022) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -50953,9 +50708,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000023) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeTemperatureSetpointHoldWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.TemperatureSetpointHold response %@", [value description]);
             if (error != nil) {
@@ -50983,10 +50738,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000023) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -51020,10 +50775,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000023) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51063,9 +50818,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000024) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster
             readAttributeTemperatureSetpointHoldDurationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"Thermostat.TemperatureSetpointHoldDuration response %@", [value description]);
@@ -51094,10 +50849,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -51133,10 +50888,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51176,9 +50931,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000025) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster
             readAttributeThermostatProgrammingOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"Thermostat.ThermostatProgrammingOperationMode response %@", [value description]);
@@ -51207,10 +50962,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -51247,10 +51002,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51290,9 +51045,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000029) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeThermostatRunningStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ThermostatRunningState response %@", [value description]);
             if (error != nil) {
@@ -51317,10 +51072,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000029) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51360,9 +51115,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000030) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeSetpointChangeSourceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.SetpointChangeSource response %@", [value description]);
             if (error != nil) {
@@ -51387,10 +51142,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51430,9 +51185,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000031) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeSetpointChangeAmountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.SetpointChangeAmount response %@", [value description]);
             if (error != nil) {
@@ -51457,10 +51212,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51500,9 +51255,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000032) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeSetpointChangeSourceTimestampWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.SetpointChangeSourceTimestamp response %@", [value description]);
             if (error != nil) {
@@ -51527,10 +51282,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51570,9 +51325,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000034) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeOccupiedSetbackWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.OccupiedSetback response %@", [value description]);
             if (error != nil) {
@@ -51600,10 +51355,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000034) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -51637,10 +51392,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000034) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51680,9 +51435,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000035) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeOccupiedSetbackMinWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.OccupiedSetbackMin response %@", [value description]);
             if (error != nil) {
@@ -51707,10 +51462,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000035) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51750,9 +51505,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000036) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeOccupiedSetbackMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.OccupiedSetbackMax response %@", [value description]);
             if (error != nil) {
@@ -51777,10 +51532,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000036) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51820,9 +51575,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000037) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeUnoccupiedSetbackWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.UnoccupiedSetback response %@", [value description]);
             if (error != nil) {
@@ -51850,10 +51605,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000037) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -51887,10 +51642,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000037) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -51930,9 +51685,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000038) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeUnoccupiedSetbackMinWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.UnoccupiedSetbackMin response %@", [value description]);
             if (error != nil) {
@@ -51957,10 +51712,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000038) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52000,9 +51755,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000039) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeUnoccupiedSetbackMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.UnoccupiedSetbackMax response %@", [value description]);
             if (error != nil) {
@@ -52027,10 +51782,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000039) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52070,9 +51825,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000003A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeEmergencyHeatDeltaWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.EmergencyHeatDelta response %@", [value description]);
             if (error != nil) {
@@ -52100,10 +51855,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x0000003A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -52137,10 +51892,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000003A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52180,9 +51935,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000040) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeACTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ACType response %@", [value description]);
             if (error != nil) {
@@ -52210,10 +51965,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000040) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -52247,10 +52002,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000040) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52290,9 +52045,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000041) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeACCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ACCapacity response %@", [value description]);
             if (error != nil) {
@@ -52320,10 +52075,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000041) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -52357,10 +52112,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000041) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52400,9 +52155,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000042) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeACRefrigerantTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ACRefrigerantType response %@", [value description]);
             if (error != nil) {
@@ -52430,10 +52185,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000042) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -52467,10 +52222,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000042) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52510,9 +52265,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000043) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeACCompressorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ACCompressorType response %@", [value description]);
             if (error != nil) {
@@ -52540,10 +52295,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000043) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -52577,10 +52332,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000043) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52620,9 +52375,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000044) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeACErrorCodeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ACErrorCode response %@", [value description]);
             if (error != nil) {
@@ -52650,10 +52405,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000044) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -52687,10 +52442,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000044) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52730,9 +52485,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000045) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeACLouverPositionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ACLouverPosition response %@", [value description]);
             if (error != nil) {
@@ -52760,10 +52515,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000045) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -52797,10 +52552,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000045) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52840,9 +52595,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000046) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeACCoilTemperatureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ACCoilTemperature response %@", [value description]);
             if (error != nil) {
@@ -52867,10 +52622,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000046) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -52910,9 +52665,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x00000047) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeACCapacityformatWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ACCapacityformat response %@", [value description]);
             if (error != nil) {
@@ -52940,10 +52695,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) WriteAttribute (0x00000047) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -52977,10 +52732,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x00000047) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53020,9 +52775,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -53047,10 +52802,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53090,9 +52845,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -53117,10 +52872,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53160,9 +52915,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -53187,10 +52942,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53230,9 +52985,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -53257,10 +53012,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53300,9 +53055,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Thermostat.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -53327,10 +53082,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000201) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53396,9 +53151,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeFanModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.FanMode response %@", [value description]);
             if (error != nil) {
@@ -53426,10 +53181,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -53463,10 +53218,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53506,9 +53261,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeFanModeSequenceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.FanModeSequence response %@", [value description]);
             if (error != nil) {
@@ -53536,10 +53291,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) WriteAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -53573,10 +53328,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53616,9 +53371,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.PercentSetting response %@", [value description]);
             if (error != nil) {
@@ -53646,10 +53401,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) WriteAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -53683,10 +53438,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53726,9 +53481,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributePercentCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.PercentCurrent response %@", [value description]);
             if (error != nil) {
@@ -53753,10 +53508,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53796,9 +53551,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeSpeedMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.SpeedMax response %@", [value description]);
             if (error != nil) {
@@ -53823,10 +53578,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53866,9 +53621,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.SpeedSetting response %@", [value description]);
             if (error != nil) {
@@ -53896,10 +53651,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) WriteAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -53933,10 +53688,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -53976,9 +53731,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeSpeedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.SpeedCurrent response %@", [value description]);
             if (error != nil) {
@@ -54003,10 +53758,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54046,9 +53801,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeRockSupportWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.RockSupport response %@", [value description]);
             if (error != nil) {
@@ -54073,10 +53828,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54116,9 +53871,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeRockSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.RockSetting response %@", [value description]);
             if (error != nil) {
@@ -54146,10 +53901,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) WriteAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -54183,10 +53938,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54226,9 +53981,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeWindSupportWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.WindSupport response %@", [value description]);
             if (error != nil) {
@@ -54253,10 +54008,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54296,9 +54051,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeWindSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.WindSetting response %@", [value description]);
             if (error != nil) {
@@ -54326,10 +54081,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) WriteAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -54363,10 +54118,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54406,9 +54161,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -54433,10 +54188,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54476,9 +54231,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -54503,10 +54258,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54546,9 +54301,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -54573,10 +54328,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54616,9 +54371,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -54643,10 +54398,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54686,9 +54441,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FanControl.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -54713,10 +54468,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000202) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54774,10 +54529,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
         [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThermostatUserInterfaceConfiguration.TemperatureDisplayMode response %@", [value description]);
             if (error != nil) {
@@ -54805,11 +54559,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -54845,11 +54598,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -54889,10 +54641,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
         [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThermostatUserInterfaceConfiguration.KeypadLockout response %@", [value description]);
             if (error != nil) {
@@ -54920,11 +54671,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) WriteAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -54959,11 +54709,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -55003,10 +54752,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
         [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThermostatUserInterfaceConfiguration.ScheduleProgrammingVisibility response %@", [value description]);
             if (error != nil) {
@@ -55034,11 +54782,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) WriteAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -55074,11 +54821,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -55118,10 +54864,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThermostatUserInterfaceConfiguration.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -55146,11 +54891,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -55190,10 +54934,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThermostatUserInterfaceConfiguration.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -55218,11 +54961,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -55262,10 +55004,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThermostatUserInterfaceConfiguration.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -55290,11 +55031,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -55334,10 +55074,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThermostatUserInterfaceConfiguration.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -55362,11 +55101,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -55406,10 +55144,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ThermostatUserInterfaceConfiguration.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -55434,11 +55171,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000204) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
-                                                                            endpointID:@(endpointId)
-                                                                                 queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(endpointId)
+                                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -55568,9 +55304,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -55621,9 +55357,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -55674,9 +55410,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterStepHueParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -55727,9 +55463,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -55779,9 +55515,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -55832,9 +55568,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -55886,9 +55622,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterMoveToHueAndSaturationParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -55940,9 +55676,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -55993,9 +55729,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterMoveColorParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56046,9 +55782,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterStepColorParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56099,9 +55835,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterMoveToColorTemperatureParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56152,9 +55888,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000040) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56205,9 +55941,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000041) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterEnhancedMoveHueParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56258,9 +55994,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000042) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterEnhancedStepHueParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56312,9 +56048,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000043) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueAndSaturationParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56368,9 +56104,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000044) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterColorLoopSetParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56421,9 +56157,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x00000047) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterStopMoveStepParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56473,9 +56209,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x0000004B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterMoveColorTemperatureParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56530,9 +56266,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) command (0x0000004C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRColorControlClusterStepColorTemperatureParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -56582,9 +56318,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.CurrentHue response %@", [value description]);
             if (error != nil) {
@@ -56609,10 +56345,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -56652,9 +56388,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.CurrentSaturation response %@", [value description]);
             if (error != nil) {
@@ -56679,10 +56415,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -56722,9 +56458,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeRemainingTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.RemainingTime response %@", [value description]);
             if (error != nil) {
@@ -56749,10 +56485,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -56792,9 +56528,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.CurrentX response %@", [value description]);
             if (error != nil) {
@@ -56819,10 +56555,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -56862,9 +56598,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.CurrentY response %@", [value description]);
             if (error != nil) {
@@ -56889,10 +56625,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -56932,9 +56668,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeDriftCompensationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.DriftCompensation response %@", [value description]);
             if (error != nil) {
@@ -56959,10 +56695,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57002,9 +56738,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeCompensationTextWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.CompensationText response %@", [value description]);
             if (error != nil) {
@@ -57029,10 +56765,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57072,9 +56808,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorTemperatureMireds response %@", [value description]);
             if (error != nil) {
@@ -57099,10 +56835,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57142,9 +56878,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorMode response %@", [value description]);
             if (error != nil) {
@@ -57169,10 +56905,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57212,9 +56948,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Options response %@", [value description]);
             if (error != nil) {
@@ -57242,10 +56978,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -57279,10 +57015,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57322,9 +57058,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeNumberOfPrimariesWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.NumberOfPrimaries response %@", [value description]);
             if (error != nil) {
@@ -57349,10 +57085,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57392,9 +57128,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary1XWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary1X response %@", [value description]);
             if (error != nil) {
@@ -57419,10 +57155,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57462,9 +57198,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary1YWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary1Y response %@", [value description]);
             if (error != nil) {
@@ -57489,10 +57225,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57532,9 +57268,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary1IntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary1Intensity response %@", [value description]);
             if (error != nil) {
@@ -57559,10 +57295,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57602,9 +57338,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary2XWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary2X response %@", [value description]);
             if (error != nil) {
@@ -57629,10 +57365,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57672,9 +57408,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000016) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary2YWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary2Y response %@", [value description]);
             if (error != nil) {
@@ -57699,10 +57435,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57742,9 +57478,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000017) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary2IntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary2Intensity response %@", [value description]);
             if (error != nil) {
@@ -57769,10 +57505,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57812,9 +57548,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000019) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary3XWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary3X response %@", [value description]);
             if (error != nil) {
@@ -57839,10 +57575,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57882,9 +57618,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000001A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary3YWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary3Y response %@", [value description]);
             if (error != nil) {
@@ -57909,10 +57645,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000001A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -57952,9 +57688,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000001B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary3IntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary3Intensity response %@", [value description]);
             if (error != nil) {
@@ -57979,10 +57715,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000001B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58022,9 +57758,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000020) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary4XWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary4X response %@", [value description]);
             if (error != nil) {
@@ -58049,10 +57785,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58092,9 +57828,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000021) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary4YWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary4Y response %@", [value description]);
             if (error != nil) {
@@ -58119,10 +57855,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58162,9 +57898,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000022) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary4IntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary4Intensity response %@", [value description]);
             if (error != nil) {
@@ -58189,10 +57925,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000022) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58232,9 +57968,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000024) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary5XWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary5X response %@", [value description]);
             if (error != nil) {
@@ -58259,10 +57995,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58302,9 +58038,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000025) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary5YWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary5Y response %@", [value description]);
             if (error != nil) {
@@ -58329,10 +58065,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58372,9 +58108,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000026) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary5IntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary5Intensity response %@", [value description]);
             if (error != nil) {
@@ -58399,10 +58135,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000026) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58442,9 +58178,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000028) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary6XWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary6X response %@", [value description]);
             if (error != nil) {
@@ -58469,10 +58205,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000028) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58512,9 +58248,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000029) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary6YWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary6Y response %@", [value description]);
             if (error != nil) {
@@ -58539,10 +58275,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000029) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58582,9 +58318,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000002A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributePrimary6IntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.Primary6Intensity response %@", [value description]);
             if (error != nil) {
@@ -58609,10 +58345,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000002A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58652,9 +58388,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000030) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeWhitePointXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.WhitePointX response %@", [value description]);
             if (error != nil) {
@@ -58682,10 +58418,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -58719,10 +58455,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58762,9 +58498,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000031) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeWhitePointYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.WhitePointY response %@", [value description]);
             if (error != nil) {
@@ -58792,10 +58528,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -58829,10 +58565,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58872,9 +58608,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000032) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorPointRXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorPointRX response %@", [value description]);
             if (error != nil) {
@@ -58902,10 +58638,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -58939,10 +58675,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -58982,9 +58718,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000033) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorPointRYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorPointRY response %@", [value description]);
             if (error != nil) {
@@ -59012,10 +58748,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x00000033) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -59049,10 +58785,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000033) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -59092,9 +58828,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000034) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorPointRIntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorPointRIntensity response %@", [value description]);
             if (error != nil) {
@@ -59122,10 +58858,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x00000034) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -59159,10 +58895,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000034) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -59202,9 +58938,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000036) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorPointGXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorPointGX response %@", [value description]);
             if (error != nil) {
@@ -59232,10 +58968,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x00000036) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -59269,10 +59005,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000036) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -59312,9 +59048,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000037) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorPointGYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorPointGY response %@", [value description]);
             if (error != nil) {
@@ -59342,10 +59078,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x00000037) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -59379,10 +59115,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000037) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -59422,9 +59158,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00000038) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorPointGIntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorPointGIntensity response %@", [value description]);
             if (error != nil) {
@@ -59452,10 +59188,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x00000038) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -59489,10 +59225,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00000038) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -59532,9 +59268,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000003A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorPointBXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorPointBX response %@", [value description]);
             if (error != nil) {
@@ -59562,10 +59298,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x0000003A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -59599,10 +59335,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000003A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -59642,9 +59378,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000003B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorPointBYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorPointBY response %@", [value description]);
             if (error != nil) {
@@ -59672,10 +59408,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x0000003B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -59709,10 +59445,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000003B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -59752,9 +59488,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000003C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorPointBIntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorPointBIntensity response %@", [value description]);
             if (error != nil) {
@@ -59782,10 +59518,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x0000003C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -59819,10 +59555,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000003C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -59862,9 +59598,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00004000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.EnhancedCurrentHue response %@", [value description]);
             if (error != nil) {
@@ -59889,10 +59625,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00004000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -59932,9 +59668,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00004001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.EnhancedColorMode response %@", [value description]);
             if (error != nil) {
@@ -59959,10 +59695,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00004001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60002,9 +59738,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00004002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorLoopActiveWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorLoopActive response %@", [value description]);
             if (error != nil) {
@@ -60029,10 +59765,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00004002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60072,9 +59808,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00004003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorLoopDirectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorLoopDirection response %@", [value description]);
             if (error != nil) {
@@ -60099,10 +59835,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00004003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60142,9 +59878,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00004004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorLoopTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorLoopTime response %@", [value description]);
             if (error != nil) {
@@ -60169,10 +59905,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00004004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60212,9 +59948,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00004005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorLoopStartEnhancedHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorLoopStartEnhancedHue response %@", [value description]);
             if (error != nil) {
@@ -60239,10 +59975,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00004005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60282,9 +60018,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00004006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorLoopStoredEnhancedHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorLoopStoredEnhancedHue response %@", [value description]);
             if (error != nil) {
@@ -60309,10 +60045,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00004006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60352,9 +60088,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000400A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorCapabilitiesWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorCapabilities response %@", [value description]);
             if (error != nil) {
@@ -60379,10 +60115,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000400A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60422,9 +60158,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000400B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorTempPhysicalMinMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorTempPhysicalMinMireds response %@", [value description]);
             if (error != nil) {
@@ -60449,10 +60185,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000400B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60492,9 +60228,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000400C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeColorTempPhysicalMaxMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ColorTempPhysicalMaxMireds response %@", [value description]);
             if (error != nil) {
@@ -60519,10 +60255,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000400C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60562,9 +60298,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000400D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster
             readAttributeCoupleColorTempToLevelMinMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ColorControl.CoupleColorTempToLevelMinMireds response %@", [value description]);
@@ -60590,10 +60326,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000400D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60633,9 +60369,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x00004010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeStartUpColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.StartUpColorTemperatureMireds response %@", [value description]);
             if (error != nil) {
@@ -60663,10 +60399,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) WriteAttribute (0x00004010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -60702,10 +60438,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x00004010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60745,9 +60481,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -60772,10 +60508,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60815,9 +60551,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -60842,10 +60578,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60885,9 +60621,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -60912,10 +60648,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -60955,9 +60691,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -60982,10 +60718,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61025,9 +60761,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ColorControl.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -61052,10 +60788,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000300) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61124,9 +60860,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributePhysicalMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.PhysicalMinLevel response %@", [value description]);
             if (error != nil) {
@@ -61151,10 +60887,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61194,9 +60930,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributePhysicalMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.PhysicalMaxLevel response %@", [value description]);
             if (error != nil) {
@@ -61221,10 +60957,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61264,9 +61000,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeBallastStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.BallastStatus response %@", [value description]);
             if (error != nil) {
@@ -61291,10 +61027,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61334,9 +61070,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.MinLevel response %@", [value description]);
             if (error != nil) {
@@ -61364,10 +61100,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -61401,10 +61137,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61444,9 +61180,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.MaxLevel response %@", [value description]);
             if (error != nil) {
@@ -61474,10 +61210,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -61511,10 +61247,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61554,9 +61290,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeIntrinsicBalanceFactorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.IntrinsicBalanceFactor response %@", [value description]);
             if (error != nil) {
@@ -61584,10 +61320,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -61622,10 +61358,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61665,9 +61401,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeBallastFactorAdjustmentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.BallastFactorAdjustment response %@", [value description]);
             if (error != nil) {
@@ -61695,10 +61431,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -61733,10 +61469,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61776,9 +61512,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000020) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLampQuantityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.LampQuantity response %@", [value description]);
             if (error != nil) {
@@ -61803,10 +61539,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61846,9 +61582,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000030) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLampTypeWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.LampType response %@", [value description]);
             if (error != nil) {
@@ -61876,10 +61612,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -61915,10 +61651,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -61958,9 +61694,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000031) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLampManufacturerWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.LampManufacturer response %@", [value description]);
             if (error != nil) {
@@ -61988,10 +61724,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -62027,10 +61763,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62070,9 +61806,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000032) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLampRatedHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.LampRatedHours response %@", [value description]);
             if (error != nil) {
@@ -62100,10 +61836,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -62137,10 +61873,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62180,9 +61916,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000033) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLampBurnHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.LampBurnHours response %@", [value description]);
             if (error != nil) {
@@ -62210,10 +61946,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000033) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -62247,10 +61983,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000033) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62290,9 +62026,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000034) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLampAlarmModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.LampAlarmMode response %@", [value description]);
             if (error != nil) {
@@ -62320,10 +62056,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000034) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -62357,10 +62093,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000034) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62400,9 +62136,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x00000035) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeLampBurnHoursTripPointWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.LampBurnHoursTripPoint response %@", [value description]);
             if (error != nil) {
@@ -62430,10 +62166,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) WriteAttribute (0x00000035) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -62468,10 +62204,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x00000035) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62511,9 +62247,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -62538,10 +62274,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62581,9 +62317,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -62608,10 +62344,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62651,9 +62387,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -62678,10 +62414,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62721,9 +62457,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -62748,10 +62484,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62791,9 +62527,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"BallastConfiguration.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -62818,10 +62554,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000301) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterBallastConfiguration * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
-                                                                                                       endpointID:@(endpointId)
-                                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterBallastConfiguration alloc] initWithDevice:device
+                                                                                endpointID:@(endpointId)
+                                                                                     queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62881,8 +62617,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.MeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -62907,9 +62644,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -62949,8 +62687,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.MinMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -62975,9 +62714,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63017,8 +62757,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.MaxMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -63043,9 +62784,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63085,8 +62827,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.Tolerance response %@", [value description]);
             if (error != nil) {
@@ -63111,9 +62854,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63153,8 +62897,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeLightSensorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.LightSensorType response %@", [value description]);
             if (error != nil) {
@@ -63179,9 +62924,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63221,8 +62967,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -63247,9 +62994,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63289,8 +63037,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -63315,9 +63064,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63357,8 +63107,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -63383,9 +63134,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63425,8 +63177,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -63451,9 +63204,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63493,8 +63247,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"IlluminanceMeasurement.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -63519,9 +63274,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000400) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63580,8 +63336,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TemperatureMeasurement.MeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -63606,9 +63363,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63648,8 +63406,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TemperatureMeasurement.MinMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -63674,9 +63433,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63716,8 +63476,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TemperatureMeasurement.MaxMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -63742,9 +63503,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63784,8 +63546,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TemperatureMeasurement.Tolerance response %@", [value description]);
             if (error != nil) {
@@ -63810,9 +63573,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63852,8 +63616,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TemperatureMeasurement.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -63878,9 +63643,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63920,8 +63686,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TemperatureMeasurement.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -63946,9 +63713,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -63988,8 +63756,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TemperatureMeasurement.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -64014,9 +63783,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64056,8 +63826,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TemperatureMeasurement.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -64082,9 +63853,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64124,8 +63896,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TemperatureMeasurement.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -64150,9 +63923,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000402) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(endpointId)
+                                                                                       queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64216,9 +63990,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.MeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -64243,10 +64017,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64286,9 +64060,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.MinMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -64313,10 +64087,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64356,9 +64130,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.MaxMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -64383,10 +64157,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64426,9 +64200,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.Tolerance response %@", [value description]);
             if (error != nil) {
@@ -64453,10 +64227,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64496,9 +64270,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.ScaledValue response %@", [value description]);
             if (error != nil) {
@@ -64523,10 +64297,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64566,9 +64340,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeMinScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.MinScaledValue response %@", [value description]);
             if (error != nil) {
@@ -64593,10 +64367,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64636,9 +64410,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeMaxScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.MaxScaledValue response %@", [value description]);
             if (error != nil) {
@@ -64663,10 +64437,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64706,9 +64480,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeScaledToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.ScaledTolerance response %@", [value description]);
             if (error != nil) {
@@ -64733,10 +64507,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64776,9 +64550,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeScaleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.Scale response %@", [value description]);
             if (error != nil) {
@@ -64803,10 +64577,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64846,9 +64620,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -64873,10 +64647,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64916,9 +64690,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -64943,10 +64717,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -64986,9 +64760,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -65013,10 +64787,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65056,9 +64830,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -65083,10 +64857,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65126,9 +64900,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"PressureMeasurement.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -65153,10 +64927,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000403) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65215,9 +64989,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FlowMeasurement.MeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -65242,10 +65016,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65285,9 +65059,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FlowMeasurement.MinMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -65312,10 +65086,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65355,9 +65129,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FlowMeasurement.MaxMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -65382,10 +65156,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65425,9 +65199,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FlowMeasurement.Tolerance response %@", [value description]);
             if (error != nil) {
@@ -65452,10 +65226,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65495,9 +65269,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FlowMeasurement.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -65522,10 +65296,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65565,9 +65339,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FlowMeasurement.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -65592,10 +65366,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65635,9 +65409,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FlowMeasurement.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -65662,10 +65436,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65705,9 +65479,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FlowMeasurement.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -65732,10 +65506,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65775,9 +65549,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"FlowMeasurement.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -65802,10 +65576,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000404) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65864,8 +65638,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"RelativeHumidityMeasurement.MeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -65890,9 +65665,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -65932,8 +65708,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"RelativeHumidityMeasurement.MinMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -65958,9 +65735,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66000,8 +65778,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"RelativeHumidityMeasurement.MaxMeasuredValue response %@", [value description]);
             if (error != nil) {
@@ -66026,9 +65805,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66068,8 +65848,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"RelativeHumidityMeasurement.Tolerance response %@", [value description]);
             if (error != nil) {
@@ -66094,9 +65875,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66136,8 +65918,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"RelativeHumidityMeasurement.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -66162,9 +65945,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66204,8 +65988,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"RelativeHumidityMeasurement.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -66230,9 +66015,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66272,8 +66058,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"RelativeHumidityMeasurement.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -66298,9 +66085,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66340,8 +66128,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"RelativeHumidityMeasurement.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -66366,9 +66155,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66408,8 +66198,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"RelativeHumidityMeasurement.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -66434,9 +66225,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000405) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(endpointId)
+                                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66503,9 +66295,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeOccupancyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.Occupancy response %@", [value description]);
             if (error != nil) {
@@ -66530,10 +66322,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66573,9 +66365,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeOccupancySensorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.OccupancySensorType response %@", [value description]);
             if (error != nil) {
@@ -66600,10 +66392,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66643,9 +66435,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeOccupancySensorTypeBitmapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.OccupancySensorTypeBitmap response %@", [value description]);
             if (error != nil) {
@@ -66670,10 +66462,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66713,13 +66505,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        [cluster readAttributePirOccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OccupancySensing.PirOccupiedToUnoccupiedDelay response %@", [value description]);
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        [cluster readAttributePIROccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+            NSLog(@"OccupancySensing.PIROccupiedToUnoccupiedDelay response %@", [value description]);
             if (error != nil) {
-                LogNSError("OccupancySensing PirOccupiedToUnoccupiedDelay read Error", error);
+                LogNSError("OccupancySensing PIROccupiedToUnoccupiedDelay read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -66743,21 +66535,21 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) WriteAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
         NSNumber * _Nonnull value = [NSNumber numberWithUnsignedShort:mValue];
 
         [cluster
-            writeAttributePirOccupiedToUnoccupiedDelayWithValue:value
+            writeAttributePIROccupiedToUnoccupiedDelayWithValue:value
                                                          params:params
                                                      completion:^(NSError * _Nullable error) {
                                                          if (error != nil) {
-                                                             LogNSError("OccupancySensing PirOccupiedToUnoccupiedDelay write Error",
+                                                             LogNSError("OccupancySensing PIROccupiedToUnoccupiedDelay write Error",
                                                                  error);
                                                          }
                                                          SetCommandExitStatus(error);
@@ -66782,10 +66574,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66795,12 +66587,12 @@
         if (mAutoResubscribe.HasValue()) {
             params.resubscribeIfLost = mAutoResubscribe.Value();
         }
-        [cluster subscribeAttributePirOccupiedToUnoccupiedDelayWithParams:params
+        [cluster subscribeAttributePIROccupiedToUnoccupiedDelayWithParams:params
             subscriptionEstablished:^() {
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OccupancySensing.PirOccupiedToUnoccupiedDelay response %@", [value description]);
+                NSLog(@"OccupancySensing.PIROccupiedToUnoccupiedDelay response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -66825,13 +66617,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        [cluster readAttributePirUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"OccupancySensing.PirUnoccupiedToOccupiedDelay response %@", [value description]);
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        [cluster readAttributePIRUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+            NSLog(@"OccupancySensing.PIRUnoccupiedToOccupiedDelay response %@", [value description]);
             if (error != nil) {
-                LogNSError("OccupancySensing PirUnoccupiedToOccupiedDelay read Error", error);
+                LogNSError("OccupancySensing PIRUnoccupiedToOccupiedDelay read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -66855,21 +66647,21 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) WriteAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
         NSNumber * _Nonnull value = [NSNumber numberWithUnsignedShort:mValue];
 
         [cluster
-            writeAttributePirUnoccupiedToOccupiedDelayWithValue:value
+            writeAttributePIRUnoccupiedToOccupiedDelayWithValue:value
                                                          params:params
                                                      completion:^(NSError * _Nullable error) {
                                                          if (error != nil) {
-                                                             LogNSError("OccupancySensing PirUnoccupiedToOccupiedDelay write Error",
+                                                             LogNSError("OccupancySensing PIRUnoccupiedToOccupiedDelay write Error",
                                                                  error);
                                                          }
                                                          SetCommandExitStatus(error);
@@ -66894,10 +66686,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -66907,12 +66699,12 @@
         if (mAutoResubscribe.HasValue()) {
             params.resubscribeIfLost = mAutoResubscribe.Value();
         }
-        [cluster subscribeAttributePirUnoccupiedToOccupiedDelayWithParams:params
+        [cluster subscribeAttributePIRUnoccupiedToOccupiedDelayWithParams:params
             subscriptionEstablished:^() {
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OccupancySensing.PirUnoccupiedToOccupiedDelay response %@", [value description]);
+                NSLog(@"OccupancySensing.PIRUnoccupiedToOccupiedDelay response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -66937,14 +66729,14 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster
-            readAttributePirUnoccupiedToOccupiedThresholdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OccupancySensing.PirUnoccupiedToOccupiedThreshold response %@", [value description]);
+            readAttributePIRUnoccupiedToOccupiedThresholdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
+                NSLog(@"OccupancySensing.PIRUnoccupiedToOccupiedThreshold response %@", [value description]);
                 if (error != nil) {
-                    LogNSError("OccupancySensing PirUnoccupiedToOccupiedThreshold read Error", error);
+                    LogNSError("OccupancySensing PIRUnoccupiedToOccupiedThreshold read Error", error);
                 }
                 SetCommandExitStatus(error);
             }];
@@ -66968,21 +66760,21 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) WriteAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
         NSNumber * _Nonnull value = [NSNumber numberWithUnsignedChar:mValue];
 
-        [cluster writeAttributePirUnoccupiedToOccupiedThresholdWithValue:value
+        [cluster writeAttributePIRUnoccupiedToOccupiedThresholdWithValue:value
                                                                   params:params
                                                               completion:^(NSError * _Nullable error) {
                                                                   if (error != nil) {
                                                                       LogNSError("OccupancySensing "
-                                                                                 "PirUnoccupiedToOccupiedThreshold write Error",
+                                                                                 "PIRUnoccupiedToOccupiedThreshold write Error",
                                                                           error);
                                                                   }
                                                                   SetCommandExitStatus(error);
@@ -67007,10 +66799,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67020,12 +66812,12 @@
         if (mAutoResubscribe.HasValue()) {
             params.resubscribeIfLost = mAutoResubscribe.Value();
         }
-        [cluster subscribeAttributePirUnoccupiedToOccupiedThresholdWithParams:params
+        [cluster subscribeAttributePIRUnoccupiedToOccupiedThresholdWithParams:params
             subscriptionEstablished:^() {
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"OccupancySensing.PirUnoccupiedToOccupiedThreshold response %@", [value description]);
+                NSLog(@"OccupancySensing.PIRUnoccupiedToOccupiedThreshold response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -67050,9 +66842,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000020) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeUltrasonicOccupiedToUnoccupiedDelayWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.UltrasonicOccupiedToUnoccupiedDelay response %@", [value description]);
@@ -67081,10 +66873,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) WriteAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -67121,10 +66913,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67164,9 +66956,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000021) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeUltrasonicUnoccupiedToOccupiedDelayWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.UltrasonicUnoccupiedToOccupiedDelay response %@", [value description]);
@@ -67195,10 +66987,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) WriteAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -67235,10 +67027,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67278,9 +67070,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000022) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeUltrasonicUnoccupiedToOccupiedThresholdWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.UltrasonicUnoccupiedToOccupiedThreshold response %@", [value description]);
@@ -67309,10 +67101,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) WriteAttribute (0x00000022) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -67350,10 +67142,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000022) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67393,9 +67185,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000030) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributePhysicalContactOccupiedToUnoccupiedDelayWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.PhysicalContactOccupiedToUnoccupiedDelay response %@", [value description]);
@@ -67424,10 +67216,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) WriteAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -67465,10 +67257,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67508,9 +67300,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000031) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributePhysicalContactUnoccupiedToOccupiedDelayWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.PhysicalContactUnoccupiedToOccupiedDelay response %@", [value description]);
@@ -67539,10 +67331,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) WriteAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -67580,10 +67372,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67623,9 +67415,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x00000032) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributePhysicalContactUnoccupiedToOccupiedThresholdWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.PhysicalContactUnoccupiedToOccupiedThreshold response %@", [value description]);
@@ -67654,10 +67446,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) WriteAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -67694,10 +67486,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67737,9 +67529,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -67764,10 +67556,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67807,9 +67599,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -67834,10 +67626,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67877,9 +67669,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -67904,10 +67696,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -67947,9 +67739,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -67974,10 +67766,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68017,9 +67809,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"OccupancySensing.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -68044,10 +67836,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000406) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68103,13 +67895,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeMACAddressWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"WakeOnLan.MACAddress response %@", [value description]);
+            NSLog(@"WakeOnLAN.MACAddress response %@", [value description]);
             if (error != nil) {
-                LogNSError("WakeOnLan MACAddress read Error", error);
+                LogNSError("WakeOnLAN MACAddress read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -68130,10 +67922,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68148,7 +67940,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSString * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"WakeOnLan.MACAddress response %@", [value description]);
+                NSLog(@"WakeOnLAN.MACAddress response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -68173,13 +67965,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"WakeOnLan.GeneratedCommandList response %@", [value description]);
+            NSLog(@"WakeOnLAN.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
-                LogNSError("WakeOnLan GeneratedCommandList read Error", error);
+                LogNSError("WakeOnLAN GeneratedCommandList read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -68200,10 +67992,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68218,7 +68010,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"WakeOnLan.GeneratedCommandList response %@", [value description]);
+                NSLog(@"WakeOnLAN.GeneratedCommandList response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -68243,13 +68035,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"WakeOnLan.AcceptedCommandList response %@", [value description]);
+            NSLog(@"WakeOnLAN.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
-                LogNSError("WakeOnLan AcceptedCommandList read Error", error);
+                LogNSError("WakeOnLAN AcceptedCommandList read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -68270,10 +68062,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68288,7 +68080,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"WakeOnLan.AcceptedCommandList response %@", [value description]);
+                NSLog(@"WakeOnLAN.AcceptedCommandList response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -68313,13 +68105,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"WakeOnLan.AttributeList response %@", [value description]);
+            NSLog(@"WakeOnLAN.AttributeList response %@", [value description]);
             if (error != nil) {
-                LogNSError("WakeOnLan AttributeList read Error", error);
+                LogNSError("WakeOnLAN AttributeList read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -68340,10 +68132,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68358,7 +68150,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSArray * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"WakeOnLan.AttributeList response %@", [value description]);
+                NSLog(@"WakeOnLAN.AttributeList response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -68383,13 +68175,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"WakeOnLan.FeatureMap response %@", [value description]);
+            NSLog(@"WakeOnLAN.FeatureMap response %@", [value description]);
             if (error != nil) {
-                LogNSError("WakeOnLan FeatureMap read Error", error);
+                LogNSError("WakeOnLAN FeatureMap read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -68410,10 +68202,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68428,7 +68220,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"WakeOnLan.FeatureMap response %@", [value description]);
+                NSLog(@"WakeOnLAN.FeatureMap response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -68453,13 +68245,13 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-            NSLog(@"WakeOnLan.ClusterRevision response %@", [value description]);
+            NSLog(@"WakeOnLAN.ClusterRevision response %@", [value description]);
             if (error != nil) {
-                LogNSError("WakeOnLan ClusterRevision read Error", error);
+                LogNSError("WakeOnLAN ClusterRevision read Error", error);
             }
             SetCommandExitStatus(error);
         }];
@@ -68480,10 +68272,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000503) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(endpointId)
-                                                                                      queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device
+                                                                     endpointID:@(endpointId)
+                                                                          queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68498,7 +68290,7 @@
                 mSubscriptionEstablished = YES;
             }
             reportHandler:^(NSNumber * _Nullable value, NSError * _Nullable error) {
-                NSLog(@"WakeOnLan.ClusterRevision response %@", [value description]);
+                NSLog(@"WakeOnLAN.ClusterRevision response %@", [value description]);
                 SetCommandExitStatus(error);
             }];
 
@@ -68544,9 +68336,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRChannelClusterChangeChannelParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -68595,9 +68385,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRChannelClusterChangeChannelByNumberParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -68642,9 +68430,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRChannelClusterSkipChannelParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -68688,9 +68474,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Channel.ChannelList response %@", [value description]);
             if (error != nil) {
@@ -68715,10 +68499,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68758,9 +68540,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeLineupWithCompletion:^(MTRChannelClusterLineupInfo * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Channel.Lineup response %@", [value description]);
             if (error != nil) {
@@ -68785,10 +68565,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68828,9 +68606,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster
             readAttributeCurrentChannelWithCompletion:^(MTRChannelClusterChannelInfo * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"Channel.CurrentChannel response %@", [value description]);
@@ -68856,10 +68632,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68899,9 +68673,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Channel.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -68926,10 +68698,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -68969,9 +68739,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Channel.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -68996,10 +68764,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69039,9 +68805,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Channel.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -69066,10 +68830,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69109,9 +68871,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Channel.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -69136,10 +68896,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69179,9 +68937,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"Channel.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -69206,10 +68962,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000504) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(endpointId)
-                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69268,9 +69022,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         __auto_type * params = [[MTRTargetNavigatorClusterNavigateTargetParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -69323,9 +69077,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeTargetListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TargetNavigator.TargetList response %@", [value description]);
             if (error != nil) {
@@ -69350,10 +69104,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69393,9 +69147,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TargetNavigator.CurrentTarget response %@", [value description]);
             if (error != nil) {
@@ -69420,10 +69174,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69463,9 +69217,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TargetNavigator.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -69490,10 +69244,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69533,9 +69287,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TargetNavigator.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -69560,10 +69314,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69603,9 +69357,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TargetNavigator.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -69630,10 +69384,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69673,9 +69427,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TargetNavigator.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -69700,10 +69454,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69743,9 +69497,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"TargetNavigator.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -69770,10 +69524,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000505) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -69845,9 +69599,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterPlayParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -69889,9 +69643,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterPauseParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -69934,9 +69688,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterStopPlaybackParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -69979,9 +69733,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterStartOverParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -70024,9 +69778,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterPreviousParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -70069,9 +69823,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterNextParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -70113,9 +69867,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterRewindParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -70158,9 +69912,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterFastForwardParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -70204,9 +69958,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterSkipForwardParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -70252,9 +70006,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterSkipBackwardParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -70300,9 +70054,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) command (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -70347,9 +70101,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.CurrentState response %@", [value description]);
             if (error != nil) {
@@ -70374,10 +70128,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -70417,9 +70171,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeStartTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.StartTime response %@", [value description]);
             if (error != nil) {
@@ -70444,10 +70198,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -70487,9 +70241,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeDurationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.Duration response %@", [value description]);
             if (error != nil) {
@@ -70514,10 +70268,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -70557,9 +70311,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeSampledPositionWithCompletion:^(
             MTRMediaPlaybackClusterPlaybackPosition * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.SampledPosition response %@", [value description]);
@@ -70585,10 +70339,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -70628,9 +70382,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.PlaybackSpeed response %@", [value description]);
             if (error != nil) {
@@ -70655,10 +70409,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -70698,9 +70452,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeSeekRangeEndWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.SeekRangeEnd response %@", [value description]);
             if (error != nil) {
@@ -70725,10 +70479,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -70768,9 +70522,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeSeekRangeStartWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.SeekRangeStart response %@", [value description]);
             if (error != nil) {
@@ -70795,10 +70549,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -70838,9 +70592,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -70865,10 +70619,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -70908,9 +70662,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -70935,10 +70689,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -70978,9 +70732,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -71005,10 +70759,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71048,9 +70802,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -71075,10 +70829,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71118,9 +70872,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaPlayback.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -71145,10 +70899,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000506) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(endpointId)
-                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
+                                                                         endpointID:@(endpointId)
+                                                                              queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71209,9 +70963,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRMediaInputClusterSelectInputParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -71254,9 +71008,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRMediaInputClusterShowInputStatusParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -71297,9 +71051,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRMediaInputClusterHideInputStatusParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -71342,9 +71096,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         __auto_type * params = [[MTRMediaInputClusterRenameInputParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -71391,9 +71145,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaInput.InputList response %@", [value description]);
             if (error != nil) {
@@ -71418,10 +71172,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71461,9 +71215,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeCurrentInputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaInput.CurrentInput response %@", [value description]);
             if (error != nil) {
@@ -71488,10 +71242,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71531,9 +71285,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaInput.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -71558,10 +71312,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71601,9 +71355,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaInput.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -71628,10 +71382,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71671,9 +71425,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaInput.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -71698,10 +71452,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71741,9 +71495,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaInput.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -71768,10 +71522,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71811,9 +71565,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"MediaInput.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -71838,10 +71592,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000507) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(endpointId)
-                                                                                        queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
+                                                                      endpointID:@(endpointId)
+                                                                           queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -71896,9 +71650,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         __auto_type * params = [[MTRLowPowerClusterSleepParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -71940,9 +71692,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LowPower.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -71967,10 +71717,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72010,9 +71758,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LowPower.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -72037,10 +71783,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72080,9 +71824,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LowPower.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -72107,10 +71849,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72150,9 +71890,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LowPower.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -72177,10 +71915,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72220,9 +71956,7 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"LowPower.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -72247,10 +71981,8 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000508) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(endpointId)
-                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72306,9 +72038,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -72353,9 +72085,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"KeypadInput.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -72380,10 +72112,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72423,9 +72155,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"KeypadInput.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -72450,10 +72182,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72493,9 +72225,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"KeypadInput.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -72520,10 +72252,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72563,9 +72295,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"KeypadInput.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -72590,10 +72322,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72633,9 +72365,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"KeypadInput.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -72660,10 +72392,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000509) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -72725,9 +72457,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         __auto_type * params = [[MTRContentLauncherClusterLaunchContentParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -72817,9 +72549,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         __auto_type * params = [[MTRContentLauncherClusterLaunchURLParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -73050,9 +72782,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeAcceptHeaderWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ContentLauncher.AcceptHeader response %@", [value description]);
             if (error != nil) {
@@ -73077,10 +72809,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73120,9 +72852,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeSupportedStreamingProtocolsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ContentLauncher.SupportedStreamingProtocols response %@", [value description]);
             if (error != nil) {
@@ -73150,10 +72882,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) WriteAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -73189,10 +72921,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73232,9 +72964,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ContentLauncher.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -73259,10 +72991,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73302,9 +73034,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ContentLauncher.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -73329,10 +73061,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73372,9 +73104,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ContentLauncher.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -73399,10 +73131,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73442,9 +73174,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ContentLauncher.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -73469,10 +73201,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73512,9 +73244,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ContentLauncher.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -73539,10 +73271,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050A) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(endpointId)
-                                                                                                  queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
+                                                                           endpointID:@(endpointId)
+                                                                                queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73601,9 +73333,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRAudioOutputClusterSelectOutputParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -73648,9 +73380,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRAudioOutputClusterRenameOutputParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -73697,9 +73429,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AudioOutput.OutputList response %@", [value description]);
             if (error != nil) {
@@ -73724,10 +73456,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73767,9 +73499,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeCurrentOutputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AudioOutput.CurrentOutput response %@", [value description]);
             if (error != nil) {
@@ -73794,10 +73526,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73837,9 +73569,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AudioOutput.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -73864,10 +73596,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73907,9 +73639,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AudioOutput.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -73934,10 +73666,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -73977,9 +73709,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AudioOutput.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -74004,10 +73736,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74047,9 +73779,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AudioOutput.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -74074,10 +73806,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74117,9 +73849,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AudioOutput.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -74144,10 +73876,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050B) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74209,9 +73941,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         __auto_type * params = [[MTRApplicationLauncherClusterLaunchAppParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -74268,9 +74000,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         __auto_type * params = [[MTRApplicationLauncherClusterStopAppParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -74322,9 +74054,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         __auto_type * params = [[MTRApplicationLauncherClusterHideAppParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -74375,9 +74107,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeCatalogListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationLauncher.CatalogList response %@", [value description]);
             if (error != nil) {
@@ -74402,10 +74134,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74445,9 +74177,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeCurrentAppWithCompletion:^(
             MTRApplicationLauncherClusterApplicationEP * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationLauncher.CurrentApp response %@", [value description]);
@@ -74477,10 +74209,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) WriteAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -74531,10 +74263,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74574,9 +74306,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationLauncher.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -74601,10 +74333,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74644,9 +74376,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationLauncher.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -74671,10 +74403,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74714,9 +74446,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationLauncher.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -74741,10 +74473,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74784,9 +74516,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationLauncher.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -74811,10 +74543,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74854,9 +74586,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationLauncher.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -74881,10 +74613,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050C) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(endpointId)
-                                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(endpointId)
+                                                                                    queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -74947,9 +74679,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeVendorNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.VendorName response %@", [value description]);
             if (error != nil) {
@@ -74974,10 +74706,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75017,9 +74749,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeVendorIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.VendorID response %@", [value description]);
             if (error != nil) {
@@ -75044,10 +74776,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75087,9 +74819,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeApplicationNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.ApplicationName response %@", [value description]);
             if (error != nil) {
@@ -75114,10 +74846,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75157,9 +74889,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeProductIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.ProductID response %@", [value description]);
             if (error != nil) {
@@ -75184,10 +74916,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75227,9 +74959,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeApplicationWithCompletion:^(
             MTRApplicationBasicClusterApplicationBasicApplication * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.Application response %@", [value description]);
@@ -75255,10 +74987,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75298,9 +75030,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.Status response %@", [value description]);
             if (error != nil) {
@@ -75325,10 +75057,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75368,9 +75100,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeApplicationVersionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.ApplicationVersion response %@", [value description]);
             if (error != nil) {
@@ -75395,10 +75127,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75438,9 +75170,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeAllowedVendorListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.AllowedVendorList response %@", [value description]);
             if (error != nil) {
@@ -75465,10 +75197,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75508,9 +75240,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -75535,10 +75267,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75578,9 +75310,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -75605,10 +75337,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75648,9 +75380,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -75675,10 +75407,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75718,9 +75450,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -75745,10 +75477,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75788,9 +75520,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ApplicationBasic.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -75815,10 +75547,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050D) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(endpointId)
-                                                                                                    queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
+                                                                            endpointID:@(endpointId)
+                                                                                 queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -75876,9 +75608,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRAccountLoginClusterGetSetupPINParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -75927,9 +75659,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRAccountLoginClusterLoginParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -75977,9 +75709,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         __auto_type * params = [[MTRAccountLoginClusterLogoutParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -76021,9 +75753,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccountLogin.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -76048,10 +75780,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76091,9 +75823,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccountLogin.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -76118,10 +75850,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76161,9 +75893,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccountLogin.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -76188,10 +75920,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76231,9 +75963,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccountLogin.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -76258,10 +75990,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76301,9 +76033,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"AccountLogin.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -76328,10 +76060,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x0000050E) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(endpointId)
-                                                                                            queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
+                                                                        endpointID:@(endpointId)
+                                                                             queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76515,9 +76247,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         __auto_type * params = [[MTRElectricalMeasurementClusterGetProfileInfoCommandParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -76561,9 +76293,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         __auto_type * params = [[MTRElectricalMeasurementClusterGetMeasurementProfileCommandParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -76609,9 +76341,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeMeasurementTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.MeasurementType response %@", [value description]);
             if (error != nil) {
@@ -76636,10 +76368,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76679,9 +76411,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000100) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcVoltage response %@", [value description]);
             if (error != nil) {
@@ -76706,10 +76438,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000100) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76749,9 +76481,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000101) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcVoltageMinWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcVoltageMin response %@", [value description]);
             if (error != nil) {
@@ -76776,10 +76508,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000101) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76819,9 +76551,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000102) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcVoltageMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcVoltageMax response %@", [value description]);
             if (error != nil) {
@@ -76846,10 +76578,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000102) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76889,9 +76621,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000103) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcCurrent response %@", [value description]);
             if (error != nil) {
@@ -76916,10 +76648,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000103) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -76959,9 +76691,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000104) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcCurrentMinWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcCurrentMin response %@", [value description]);
             if (error != nil) {
@@ -76986,10 +76718,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000104) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77029,9 +76761,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000105) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcCurrentMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcCurrentMax response %@", [value description]);
             if (error != nil) {
@@ -77056,10 +76788,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000105) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77099,9 +76831,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000106) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcPowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcPower response %@", [value description]);
             if (error != nil) {
@@ -77126,10 +76858,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000106) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77169,9 +76901,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000107) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcPowerMinWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcPowerMin response %@", [value description]);
             if (error != nil) {
@@ -77196,10 +76928,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000107) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77239,9 +76971,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000108) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcPowerMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcPowerMax response %@", [value description]);
             if (error != nil) {
@@ -77266,10 +76998,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000108) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77309,9 +77041,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000200) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcVoltageMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcVoltageMultiplier response %@", [value description]);
             if (error != nil) {
@@ -77336,10 +77068,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000200) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77379,9 +77111,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000201) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcVoltageDivisorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcVoltageDivisor response %@", [value description]);
             if (error != nil) {
@@ -77406,10 +77138,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000201) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77449,9 +77181,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000202) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcCurrentMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcCurrentMultiplier response %@", [value description]);
             if (error != nil) {
@@ -77476,10 +77208,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000202) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77519,9 +77251,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000203) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcCurrentDivisorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcCurrentDivisor response %@", [value description]);
             if (error != nil) {
@@ -77546,10 +77278,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000203) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77589,9 +77321,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000204) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcPowerMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcPowerMultiplier response %@", [value description]);
             if (error != nil) {
@@ -77616,10 +77348,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000204) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77659,9 +77391,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000205) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeDcPowerDivisorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.DcPowerDivisor response %@", [value description]);
             if (error != nil) {
@@ -77686,10 +77418,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000205) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77729,9 +77461,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000300) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcFrequency response %@", [value description]);
             if (error != nil) {
@@ -77756,10 +77488,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000300) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77799,9 +77531,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000301) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcFrequencyMinWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcFrequencyMin response %@", [value description]);
             if (error != nil) {
@@ -77826,10 +77558,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000301) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77869,9 +77601,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000302) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcFrequencyMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcFrequencyMax response %@", [value description]);
             if (error != nil) {
@@ -77896,10 +77628,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000302) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -77939,9 +77671,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000303) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeNeutralCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.NeutralCurrent response %@", [value description]);
             if (error != nil) {
@@ -77966,10 +77698,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000303) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78009,9 +77741,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000304) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeTotalActivePowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.TotalActivePower response %@", [value description]);
             if (error != nil) {
@@ -78036,10 +77768,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000304) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78079,9 +77811,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000305) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeTotalReactivePowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.TotalReactivePower response %@", [value description]);
             if (error != nil) {
@@ -78106,10 +77838,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000305) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78149,9 +77881,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000306) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeTotalApparentPowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.TotalApparentPower response %@", [value description]);
             if (error != nil) {
@@ -78176,10 +77908,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000306) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78219,9 +77951,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000307) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeMeasured1stHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.Measured1stHarmonicCurrent response %@", [value description]);
             if (error != nil) {
@@ -78246,10 +77978,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000307) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78289,9 +78021,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000308) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeMeasured3rdHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.Measured3rdHarmonicCurrent response %@", [value description]);
             if (error != nil) {
@@ -78316,10 +78048,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000308) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78359,9 +78091,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000309) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeMeasured5thHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.Measured5thHarmonicCurrent response %@", [value description]);
             if (error != nil) {
@@ -78386,10 +78118,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000309) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78429,9 +78161,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000030A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeMeasured7thHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.Measured7thHarmonicCurrent response %@", [value description]);
             if (error != nil) {
@@ -78456,10 +78188,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000030A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78499,9 +78231,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000030B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeMeasured9thHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.Measured9thHarmonicCurrent response %@", [value description]);
             if (error != nil) {
@@ -78526,10 +78258,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000030B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78569,9 +78301,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000030C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeMeasured11thHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.Measured11thHarmonicCurrent response %@", [value description]);
             if (error != nil) {
@@ -78596,10 +78328,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000030C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78639,9 +78371,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000030D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeMeasuredPhase1stHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.MeasuredPhase1stHarmonicCurrent response %@", [value description]);
@@ -78667,10 +78399,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000030D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78710,9 +78442,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000030E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeMeasuredPhase3rdHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.MeasuredPhase3rdHarmonicCurrent response %@", [value description]);
@@ -78738,10 +78470,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000030E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78781,9 +78513,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000030F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeMeasuredPhase5thHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.MeasuredPhase5thHarmonicCurrent response %@", [value description]);
@@ -78809,10 +78541,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000030F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78852,9 +78584,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000310) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeMeasuredPhase7thHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.MeasuredPhase7thHarmonicCurrent response %@", [value description]);
@@ -78880,10 +78612,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000310) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78923,9 +78655,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000311) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeMeasuredPhase9thHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.MeasuredPhase9thHarmonicCurrent response %@", [value description]);
@@ -78951,10 +78683,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000311) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -78994,9 +78726,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000312) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeMeasuredPhase11thHarmonicCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.MeasuredPhase11thHarmonicCurrent response %@", [value description]);
@@ -79022,10 +78754,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000312) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79065,9 +78797,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000400) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcFrequencyMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcFrequencyMultiplier response %@", [value description]);
             if (error != nil) {
@@ -79092,10 +78824,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000400) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79135,9 +78867,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000401) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcFrequencyDivisorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcFrequencyDivisor response %@", [value description]);
             if (error != nil) {
@@ -79162,10 +78894,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000401) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79205,9 +78937,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000402) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributePowerMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.PowerMultiplier response %@", [value description]);
             if (error != nil) {
@@ -79232,10 +78964,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000402) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79275,9 +79007,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000403) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributePowerDivisorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.PowerDivisor response %@", [value description]);
             if (error != nil) {
@@ -79302,10 +79034,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000403) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79345,9 +79077,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000404) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeHarmonicCurrentMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.HarmonicCurrentMultiplier response %@", [value description]);
             if (error != nil) {
@@ -79372,10 +79104,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000404) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79415,9 +79147,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000405) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributePhaseHarmonicCurrentMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.PhaseHarmonicCurrentMultiplier response %@", [value description]);
@@ -79443,10 +79175,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000405) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79486,9 +79218,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000500) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeInstantaneousVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.InstantaneousVoltage response %@", [value description]);
             if (error != nil) {
@@ -79513,10 +79245,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000500) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79556,9 +79288,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000501) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeInstantaneousLineCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.InstantaneousLineCurrent response %@", [value description]);
             if (error != nil) {
@@ -79583,10 +79315,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000501) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79626,9 +79358,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000502) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeInstantaneousActiveCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.InstantaneousActiveCurrent response %@", [value description]);
             if (error != nil) {
@@ -79653,10 +79385,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000502) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79696,9 +79428,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000503) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeInstantaneousReactiveCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.InstantaneousReactiveCurrent response %@", [value description]);
             if (error != nil) {
@@ -79723,10 +79455,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000503) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79766,9 +79498,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000504) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeInstantaneousPowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.InstantaneousPower response %@", [value description]);
             if (error != nil) {
@@ -79793,10 +79525,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000504) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79836,9 +79568,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000505) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltage response %@", [value description]);
             if (error != nil) {
@@ -79863,10 +79595,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000505) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79906,9 +79638,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000506) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageMinWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageMin response %@", [value description]);
             if (error != nil) {
@@ -79933,10 +79665,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000506) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -79976,9 +79708,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000507) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageMax response %@", [value description]);
             if (error != nil) {
@@ -80003,10 +79735,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000507) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80046,9 +79778,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000508) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsCurrent response %@", [value description]);
             if (error != nil) {
@@ -80073,10 +79805,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000508) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80116,9 +79848,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000509) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsCurrentMinWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsCurrentMin response %@", [value description]);
             if (error != nil) {
@@ -80143,10 +79875,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000509) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80186,9 +79918,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000050A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsCurrentMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsCurrentMax response %@", [value description]);
             if (error != nil) {
@@ -80213,10 +79945,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000050A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80256,9 +79988,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000050B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActivePowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActivePower response %@", [value description]);
             if (error != nil) {
@@ -80283,10 +80015,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000050B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80326,9 +80058,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000050C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActivePowerMinWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActivePowerMin response %@", [value description]);
             if (error != nil) {
@@ -80353,10 +80085,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000050C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80396,9 +80128,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000050D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActivePowerMaxWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActivePowerMax response %@", [value description]);
             if (error != nil) {
@@ -80423,10 +80155,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000050D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80466,9 +80198,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000050E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeReactivePowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ReactivePower response %@", [value description]);
             if (error != nil) {
@@ -80493,10 +80225,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000050E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80536,9 +80268,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000050F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeApparentPowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ApparentPower response %@", [value description]);
             if (error != nil) {
@@ -80563,10 +80295,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000050F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80606,9 +80338,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000510) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributePowerFactorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.PowerFactor response %@", [value description]);
             if (error != nil) {
@@ -80633,10 +80365,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000510) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80676,9 +80408,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000511) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeAverageRmsVoltageMeasurementPeriodWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.AverageRmsVoltageMeasurementPeriod response %@", [value description]);
@@ -80707,10 +80439,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) WriteAttribute (0x00000511) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -80746,10 +80478,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000511) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80789,9 +80521,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000513) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAverageRmsUnderVoltageCounterWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AverageRmsUnderVoltageCounter response %@", [value description]);
             if (error != nil) {
@@ -80819,10 +80551,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) WriteAttribute (0x00000513) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -80859,10 +80591,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000513) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -80902,9 +80634,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000514) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsExtremeOverVoltagePeriodWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsExtremeOverVoltagePeriod response %@", [value description]);
             if (error != nil) {
@@ -80932,10 +80664,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) WriteAttribute (0x00000514) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -80972,10 +80704,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000514) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81015,9 +80747,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000515) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsExtremeUnderVoltagePeriodWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsExtremeUnderVoltagePeriod response %@", [value description]);
             if (error != nil) {
@@ -81045,10 +80777,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) WriteAttribute (0x00000515) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -81085,10 +80817,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000515) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81128,9 +80860,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000516) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageSagPeriodWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageSagPeriod response %@", [value description]);
             if (error != nil) {
@@ -81158,10 +80890,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) WriteAttribute (0x00000516) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -81195,10 +80927,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000516) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81238,9 +80970,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000517) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageSwellPeriodWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageSwellPeriod response %@", [value description]);
             if (error != nil) {
@@ -81268,10 +81000,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) WriteAttribute (0x00000517) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -81306,10 +81038,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000517) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81349,9 +81081,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000600) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcVoltageMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcVoltageMultiplier response %@", [value description]);
             if (error != nil) {
@@ -81376,10 +81108,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000600) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81419,9 +81151,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000601) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcVoltageDivisorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcVoltageDivisor response %@", [value description]);
             if (error != nil) {
@@ -81446,10 +81178,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000601) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81489,9 +81221,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000602) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcCurrentMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcCurrentMultiplier response %@", [value description]);
             if (error != nil) {
@@ -81516,10 +81248,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000602) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81559,9 +81291,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000603) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcCurrentDivisorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcCurrentDivisor response %@", [value description]);
             if (error != nil) {
@@ -81586,10 +81318,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000603) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81629,9 +81361,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000604) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcPowerMultiplierWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcPowerMultiplier response %@", [value description]);
             if (error != nil) {
@@ -81656,10 +81388,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000604) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81699,9 +81431,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000605) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcPowerDivisorWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcPowerDivisor response %@", [value description]);
             if (error != nil) {
@@ -81726,10 +81458,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000605) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81769,9 +81501,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000700) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeOverloadAlarmsMaskWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.OverloadAlarmsMask response %@", [value description]);
             if (error != nil) {
@@ -81799,10 +81531,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) WriteAttribute (0x00000700) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -81836,10 +81568,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000700) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81879,9 +81611,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000701) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeVoltageOverloadWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.VoltageOverload response %@", [value description]);
             if (error != nil) {
@@ -81906,10 +81638,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000701) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -81949,9 +81681,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000702) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeCurrentOverloadWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.CurrentOverload response %@", [value description]);
             if (error != nil) {
@@ -81976,10 +81708,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000702) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82019,9 +81751,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000800) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcOverloadAlarmsMaskWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcOverloadAlarmsMask response %@", [value description]);
             if (error != nil) {
@@ -82049,10 +81781,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) WriteAttribute (0x00000800) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -82087,10 +81819,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000800) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82130,9 +81862,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000801) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcVoltageOverloadWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcVoltageOverload response %@", [value description]);
             if (error != nil) {
@@ -82157,10 +81889,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000801) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82200,9 +81932,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000802) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcCurrentOverloadWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcCurrentOverload response %@", [value description]);
             if (error != nil) {
@@ -82227,10 +81959,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000802) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82270,9 +82002,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000803) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcActivePowerOverloadWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcActivePowerOverload response %@", [value description]);
             if (error != nil) {
@@ -82297,10 +82029,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000803) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82340,9 +82072,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000804) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcReactivePowerOverloadWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcReactivePowerOverload response %@", [value description]);
             if (error != nil) {
@@ -82367,10 +82099,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000804) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82410,9 +82142,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000805) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAverageRmsOverVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AverageRmsOverVoltage response %@", [value description]);
             if (error != nil) {
@@ -82437,10 +82169,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000805) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82480,9 +82212,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000806) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAverageRmsUnderVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AverageRmsUnderVoltage response %@", [value description]);
             if (error != nil) {
@@ -82507,10 +82239,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000806) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82550,9 +82282,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000807) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsExtremeOverVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsExtremeOverVoltage response %@", [value description]);
             if (error != nil) {
@@ -82577,10 +82309,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000807) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82620,9 +82352,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000808) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsExtremeUnderVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsExtremeUnderVoltage response %@", [value description]);
             if (error != nil) {
@@ -82647,10 +82379,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000808) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82690,9 +82422,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000809) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageSagWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageSag response %@", [value description]);
             if (error != nil) {
@@ -82717,10 +82449,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000809) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82760,9 +82492,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000080A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageSwellWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageSwell response %@", [value description]);
             if (error != nil) {
@@ -82787,10 +82519,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000080A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82830,9 +82562,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000901) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeLineCurrentPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.LineCurrentPhaseB response %@", [value description]);
             if (error != nil) {
@@ -82857,10 +82589,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000901) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82900,9 +82632,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000902) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActiveCurrentPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActiveCurrentPhaseB response %@", [value description]);
             if (error != nil) {
@@ -82927,10 +82659,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000902) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -82970,9 +82702,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000903) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeReactiveCurrentPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ReactiveCurrentPhaseB response %@", [value description]);
             if (error != nil) {
@@ -82997,10 +82729,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000903) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83040,9 +82772,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000905) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltagePhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltagePhaseB response %@", [value description]);
             if (error != nil) {
@@ -83067,10 +82799,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000905) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83110,9 +82842,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000906) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageMinPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageMinPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83137,10 +82869,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000906) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83180,9 +82912,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000907) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageMaxPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageMaxPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83207,10 +82939,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000907) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83250,9 +82982,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000908) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsCurrentPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsCurrentPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83277,10 +83009,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000908) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83320,9 +83052,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000909) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsCurrentMinPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsCurrentMinPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83347,10 +83079,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000909) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83390,9 +83122,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000090A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsCurrentMaxPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsCurrentMaxPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83417,10 +83149,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000090A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83460,9 +83192,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000090B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActivePowerPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActivePowerPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83487,10 +83219,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000090B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83530,9 +83262,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000090C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActivePowerMinPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActivePowerMinPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83557,10 +83289,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000090C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83600,9 +83332,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000090D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActivePowerMaxPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActivePowerMaxPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83627,10 +83359,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000090D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83670,9 +83402,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000090E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeReactivePowerPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ReactivePowerPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83697,10 +83429,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000090E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83740,9 +83472,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000090F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeApparentPowerPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ApparentPowerPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83767,10 +83499,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000090F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83810,9 +83542,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000910) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributePowerFactorPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.PowerFactorPhaseB response %@", [value description]);
             if (error != nil) {
@@ -83837,10 +83569,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000910) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83880,9 +83612,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000911) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAverageRmsVoltageMeasurementPeriodPhaseBWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AverageRmsVoltageMeasurementPeriodPhaseB response %@", [value description]);
@@ -83908,10 +83640,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000911) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -83951,9 +83683,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000912) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeAverageRmsOverVoltageCounterPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.AverageRmsOverVoltageCounterPhaseB response %@", [value description]);
@@ -83979,10 +83711,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000912) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84022,9 +83754,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000913) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAverageRmsUnderVoltageCounterPhaseBWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AverageRmsUnderVoltageCounterPhaseB response %@", [value description]);
@@ -84050,10 +83782,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000913) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84093,9 +83825,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000914) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeRmsExtremeOverVoltagePeriodPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.RmsExtremeOverVoltagePeriodPhaseB response %@", [value description]);
@@ -84121,10 +83853,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000914) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84164,9 +83896,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000915) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeRmsExtremeUnderVoltagePeriodPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.RmsExtremeUnderVoltagePeriodPhaseB response %@", [value description]);
@@ -84192,10 +83924,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000915) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84235,9 +83967,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000916) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageSagPeriodPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageSagPeriodPhaseB response %@", [value description]);
             if (error != nil) {
@@ -84262,10 +83994,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000916) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84305,9 +84037,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000917) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageSwellPeriodPhaseBWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageSwellPeriodPhaseB response %@", [value description]);
             if (error != nil) {
@@ -84332,10 +84064,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000917) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84375,9 +84107,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A01) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeLineCurrentPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.LineCurrentPhaseC response %@", [value description]);
             if (error != nil) {
@@ -84402,10 +84134,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A01) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84445,9 +84177,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A02) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActiveCurrentPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActiveCurrentPhaseC response %@", [value description]);
             if (error != nil) {
@@ -84472,10 +84204,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A02) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84515,9 +84247,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A03) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeReactiveCurrentPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ReactiveCurrentPhaseC response %@", [value description]);
             if (error != nil) {
@@ -84542,10 +84274,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A03) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84585,9 +84317,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A05) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltagePhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltagePhaseC response %@", [value description]);
             if (error != nil) {
@@ -84612,10 +84344,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A05) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84655,9 +84387,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A06) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageMinPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageMinPhaseC response %@", [value description]);
             if (error != nil) {
@@ -84682,10 +84414,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A06) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84725,9 +84457,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A07) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageMaxPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageMaxPhaseC response %@", [value description]);
             if (error != nil) {
@@ -84752,10 +84484,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A07) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84795,9 +84527,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A08) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsCurrentPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsCurrentPhaseC response %@", [value description]);
             if (error != nil) {
@@ -84822,10 +84554,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A08) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84865,9 +84597,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A09) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsCurrentMinPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsCurrentMinPhaseC response %@", [value description]);
             if (error != nil) {
@@ -84892,10 +84624,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A09) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -84935,9 +84667,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A0A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsCurrentMaxPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsCurrentMaxPhaseC response %@", [value description]);
             if (error != nil) {
@@ -84962,10 +84694,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A0A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85005,9 +84737,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A0B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActivePowerPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActivePowerPhaseC response %@", [value description]);
             if (error != nil) {
@@ -85032,10 +84764,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A0B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85075,9 +84807,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A0C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActivePowerMinPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActivePowerMinPhaseC response %@", [value description]);
             if (error != nil) {
@@ -85102,10 +84834,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A0C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85145,9 +84877,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A0D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeActivePowerMaxPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ActivePowerMaxPhaseC response %@", [value description]);
             if (error != nil) {
@@ -85172,10 +84904,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A0D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85215,9 +84947,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A0E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeReactivePowerPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ReactivePowerPhaseC response %@", [value description]);
             if (error != nil) {
@@ -85242,10 +84974,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A0E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85285,9 +85017,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A0F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeApparentPowerPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ApparentPowerPhaseC response %@", [value description]);
             if (error != nil) {
@@ -85312,10 +85044,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A0F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85355,9 +85087,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A10) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributePowerFactorPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.PowerFactorPhaseC response %@", [value description]);
             if (error != nil) {
@@ -85382,10 +85114,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A10) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85425,9 +85157,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A11) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAverageRmsVoltageMeasurementPeriodPhaseCWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AverageRmsVoltageMeasurementPeriodPhaseC response %@", [value description]);
@@ -85453,10 +85185,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A11) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85496,9 +85228,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A12) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeAverageRmsOverVoltageCounterPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.AverageRmsOverVoltageCounterPhaseC response %@", [value description]);
@@ -85524,10 +85256,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A12) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85567,9 +85299,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A13) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAverageRmsUnderVoltageCounterPhaseCWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AverageRmsUnderVoltageCounterPhaseC response %@", [value description]);
@@ -85595,10 +85327,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A13) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85638,9 +85370,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A14) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeRmsExtremeOverVoltagePeriodPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.RmsExtremeOverVoltagePeriodPhaseC response %@", [value description]);
@@ -85666,10 +85398,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A14) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85709,9 +85441,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A15) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster
             readAttributeRmsExtremeUnderVoltagePeriodPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"ElectricalMeasurement.RmsExtremeUnderVoltagePeriodPhaseC response %@", [value description]);
@@ -85737,10 +85469,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A15) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85780,9 +85512,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A16) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageSagPeriodPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageSagPeriodPhaseC response %@", [value description]);
             if (error != nil) {
@@ -85807,10 +85539,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A16) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85850,9 +85582,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x00000A17) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeRmsVoltageSwellPeriodPhaseCWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.RmsVoltageSwellPeriodPhaseC response %@", [value description]);
             if (error != nil) {
@@ -85877,10 +85609,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x00000A17) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85920,9 +85652,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -85947,10 +85679,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -85990,9 +85722,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -86017,10 +85749,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -86060,9 +85792,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -86087,10 +85819,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -86130,9 +85862,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -86157,10 +85889,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -86200,9 +85932,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"ElectricalMeasurement.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -86227,10 +85959,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0x00000B04) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterElectricalMeasurement * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
-                                                                                                         endpointID:@(endpointId)
-                                                                                                              queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterElectricalMeasurement alloc] initWithDevice:device
+                                                                                 endpointID:@(endpointId)
+                                                                                      queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -86390,9 +86122,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -86433,9 +86165,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestNotHandledParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -86476,9 +86208,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestSpecificParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -86521,9 +86253,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestUnknownCommandParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -86566,9 +86298,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -86615,9 +86347,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestSimpleArgumentRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -86672,9 +86404,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestStructArrayArgumentRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -86835,9 +86567,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestStructArgumentRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -86895,9 +86627,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestNestedStructArgumentRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -86958,9 +86690,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestListStructArgumentRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87027,9 +86759,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestListInt8UArgumentRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87085,9 +86817,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestNestedStructListArgumentRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87194,9 +86926,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestListNestedStructListArgumentRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87313,9 +87045,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x0000000D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestListInt8UReverseRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87372,9 +87104,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x0000000E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestEnumsRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87421,9 +87153,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestNullableOptionalRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87495,9 +87227,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestComplexNullableOptionalRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87703,9 +87435,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterSimpleStructEchoRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87761,9 +87493,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTimedInvokeRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87805,9 +87537,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestSimpleOptionalArgumentRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87857,9 +87589,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestEmitTestEventRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87907,9 +87639,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) command (0x00000015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         __auto_type * params = [[MTRUnitTestingClusterTestEmitTestFabricScopedEventRequestParams alloc] init];
         params.timedInvokeTimeoutMs
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
@@ -87957,9 +87689,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Boolean response %@", [value description]);
             if (error != nil) {
@@ -87987,10 +87719,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -88024,10 +87756,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -88067,9 +87799,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Bitmap8 response %@", [value description]);
             if (error != nil) {
@@ -88097,10 +87829,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -88134,10 +87866,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -88177,9 +87909,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Bitmap16 response %@", [value description]);
             if (error != nil) {
@@ -88207,10 +87939,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -88244,10 +87976,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -88287,9 +88019,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Bitmap32 response %@", [value description]);
             if (error != nil) {
@@ -88317,10 +88049,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -88354,10 +88086,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -88397,9 +88129,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Bitmap64 response %@", [value description]);
             if (error != nil) {
@@ -88427,10 +88159,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -88464,10 +88196,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -88507,9 +88239,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int8u response %@", [value description]);
             if (error != nil) {
@@ -88537,10 +88269,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -88574,10 +88306,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -88617,9 +88349,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int16u response %@", [value description]);
             if (error != nil) {
@@ -88647,10 +88379,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -88684,10 +88416,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -88727,9 +88459,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt24uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int24u response %@", [value description]);
             if (error != nil) {
@@ -88757,10 +88489,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -88794,10 +88526,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -88837,9 +88569,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int32u response %@", [value description]);
             if (error != nil) {
@@ -88867,10 +88599,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -88904,10 +88636,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -88947,9 +88679,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt40uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int40u response %@", [value description]);
             if (error != nil) {
@@ -88977,10 +88709,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -89014,10 +88746,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -89057,9 +88789,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000000A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt48uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int48u response %@", [value description]);
             if (error != nil) {
@@ -89087,10 +88819,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -89124,10 +88856,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000000A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -89167,9 +88899,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000000B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt56uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int56u response %@", [value description]);
             if (error != nil) {
@@ -89197,10 +88929,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000000B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -89234,10 +88966,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000000B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -89277,9 +89009,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000000C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int64u response %@", [value description]);
             if (error != nil) {
@@ -89307,10 +89039,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000000C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -89344,10 +89076,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000000C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -89387,9 +89119,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000000D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int8s response %@", [value description]);
             if (error != nil) {
@@ -89417,10 +89149,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000000D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -89454,10 +89186,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000000D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -89497,9 +89229,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000000E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int16s response %@", [value description]);
             if (error != nil) {
@@ -89527,10 +89259,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000000E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -89564,10 +89296,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000000E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -89607,9 +89339,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000000F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt24sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int24s response %@", [value description]);
             if (error != nil) {
@@ -89637,10 +89369,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -89674,10 +89406,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000000F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -89717,9 +89449,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int32s response %@", [value description]);
             if (error != nil) {
@@ -89747,10 +89479,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -89784,10 +89516,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -89827,9 +89559,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt40sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int40s response %@", [value description]);
             if (error != nil) {
@@ -89857,10 +89589,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -89894,10 +89626,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -89937,9 +89669,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt48sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int48s response %@", [value description]);
             if (error != nil) {
@@ -89967,10 +89699,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -90004,10 +89736,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -90047,9 +89779,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt56sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int56s response %@", [value description]);
             if (error != nil) {
@@ -90077,10 +89809,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -90114,10 +89846,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -90157,9 +89889,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Int64s response %@", [value description]);
             if (error != nil) {
@@ -90187,10 +89919,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -90224,10 +89956,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -90267,9 +89999,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Enum8 response %@", [value description]);
             if (error != nil) {
@@ -90297,10 +90029,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -90334,10 +90066,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -90377,9 +90109,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000016) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Enum16 response %@", [value description]);
             if (error != nil) {
@@ -90407,10 +90139,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -90444,10 +90176,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -90487,9 +90219,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000017) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.FloatSingle response %@", [value description]);
             if (error != nil) {
@@ -90517,10 +90249,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -90554,10 +90286,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -90597,9 +90329,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000018) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.FloatDouble response %@", [value description]);
             if (error != nil) {
@@ -90627,10 +90359,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000018) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -90664,10 +90396,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000018) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -90707,9 +90439,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000019) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.OctetString response %@", [value description]);
             if (error != nil) {
@@ -90737,10 +90469,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -90774,10 +90506,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -90817,9 +90549,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000001A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.ListInt8u response %@", [value description]);
             if (error != nil) {
@@ -90848,10 +90580,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000001A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -90895,10 +90627,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000001A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -90938,9 +90670,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000001B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeListOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.ListOctetString response %@", [value description]);
             if (error != nil) {
@@ -90969,10 +90701,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000001B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -91016,10 +90748,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000001B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -91059,9 +90791,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000001C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeListStructOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.ListStructOctetString response %@", [value description]);
             if (error != nil) {
@@ -91090,10 +90822,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000001C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -91140,10 +90872,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000001C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -91183,9 +90915,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000001D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeLongOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.LongOctetString response %@", [value description]);
             if (error != nil) {
@@ -91213,10 +90945,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000001D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -91250,10 +90982,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000001D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -91293,9 +91025,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000001E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.CharString response %@", [value description]);
             if (error != nil) {
@@ -91323,10 +91055,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000001E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -91362,10 +91094,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000001E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -91405,9 +91137,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000001F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeLongCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.LongCharString response %@", [value description]);
             if (error != nil) {
@@ -91435,10 +91167,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000001F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -91474,10 +91206,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000001F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -91517,9 +91249,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000020) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.EpochUs response %@", [value description]);
             if (error != nil) {
@@ -91547,10 +91279,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -91584,10 +91316,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000020) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -91627,9 +91359,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000021) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.EpochS response %@", [value description]);
             if (error != nil) {
@@ -91657,10 +91389,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -91694,10 +91426,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000021) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -91737,9 +91469,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000022) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.VendorId response %@", [value description]);
             if (error != nil) {
@@ -91767,10 +91499,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000022) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -91804,10 +91536,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000022) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -91847,9 +91579,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000023) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster
             readAttributeListNullablesAndOptionalsStructWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
                 NSLog(@"UnitTesting.ListNullablesAndOptionalsStruct response %@", [value description]);
@@ -91879,10 +91611,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000023) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -92081,10 +91813,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000023) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -92124,9 +91856,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000024) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.EnumAttr response %@", [value description]);
             if (error != nil) {
@@ -92154,10 +91886,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -92191,10 +91923,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -92234,9 +91966,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000025) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeStructAttrWithCompletion:^(
             MTRUnitTestingClusterSimpleStruct * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.StructAttr response %@", [value description]);
@@ -92266,10 +91998,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -92313,10 +92045,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -92356,9 +92088,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000026) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.RangeRestrictedInt8u response %@", [value description]);
             if (error != nil) {
@@ -92386,10 +92118,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000026) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -92423,10 +92155,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000026) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -92466,9 +92198,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000027) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.RangeRestrictedInt8s response %@", [value description]);
             if (error != nil) {
@@ -92496,10 +92228,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000027) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -92533,10 +92265,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000027) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -92576,9 +92308,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000028) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.RangeRestrictedInt16u response %@", [value description]);
             if (error != nil) {
@@ -92606,10 +92338,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000028) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -92643,10 +92375,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000028) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -92686,9 +92418,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000029) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.RangeRestrictedInt16s response %@", [value description]);
             if (error != nil) {
@@ -92716,10 +92448,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000029) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -92753,10 +92485,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000029) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -92796,9 +92528,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000002A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeListLongOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.ListLongOctetString response %@", [value description]);
             if (error != nil) {
@@ -92827,10 +92559,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000002A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -92874,10 +92606,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000002A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -92917,10 +92649,10 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000002B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
             params.filterByFabric = mFabricFiltered.Value();
         }
@@ -92953,10 +92685,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000002B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -93050,10 +92782,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000002B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -93093,9 +92825,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000030) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeTimedWriteBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.TimedWriteBoolean response %@", [value description]);
             if (error != nil) {
@@ -93123,10 +92855,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -93160,10 +92892,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000030) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -93203,9 +92935,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000031) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeGeneralErrorBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.GeneralErrorBoolean response %@", [value description]);
             if (error != nil) {
@@ -93233,10 +92965,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -93270,10 +93002,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000031) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -93313,9 +93045,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00000032) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeClusterErrorBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.ClusterErrorBoolean response %@", [value description]);
             if (error != nil) {
@@ -93343,10 +93075,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -93380,10 +93112,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00000032) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -93423,9 +93155,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x000000FF) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeUnsupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.Unsupported response %@", [value description]);
             if (error != nil) {
@@ -93453,10 +93185,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x000000FF) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -93490,10 +93222,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x000000FF) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -93533,9 +93265,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004000) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableBoolean response %@", [value description]);
             if (error != nil) {
@@ -93563,10 +93295,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -93600,10 +93332,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004000) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -93643,9 +93375,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004001) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableBitmap8 response %@", [value description]);
             if (error != nil) {
@@ -93673,10 +93405,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -93710,10 +93442,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004001) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -93753,9 +93485,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004002) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableBitmap16 response %@", [value description]);
             if (error != nil) {
@@ -93783,10 +93515,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -93820,10 +93552,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004002) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -93863,9 +93595,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004003) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableBitmap32 response %@", [value description]);
             if (error != nil) {
@@ -93893,10 +93625,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -93930,10 +93662,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004003) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -93973,9 +93705,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004004) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableBitmap64 response %@", [value description]);
             if (error != nil) {
@@ -94003,10 +93735,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -94040,10 +93772,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004004) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -94083,9 +93815,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004005) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt8u response %@", [value description]);
             if (error != nil) {
@@ -94113,10 +93845,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -94150,10 +93882,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004005) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -94193,9 +93925,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004006) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt16u response %@", [value description]);
             if (error != nil) {
@@ -94223,10 +93955,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -94260,10 +93992,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004006) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -94303,9 +94035,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004007) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt24uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt24u response %@", [value description]);
             if (error != nil) {
@@ -94333,10 +94065,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -94370,10 +94102,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004007) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -94413,9 +94145,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004008) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt32u response %@", [value description]);
             if (error != nil) {
@@ -94443,10 +94175,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -94480,10 +94212,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004008) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -94523,9 +94255,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004009) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt40uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt40u response %@", [value description]);
             if (error != nil) {
@@ -94553,10 +94285,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -94590,10 +94322,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004009) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -94633,9 +94365,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000400A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt48uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt48u response %@", [value description]);
             if (error != nil) {
@@ -94663,10 +94395,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000400A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -94700,10 +94432,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000400A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -94743,9 +94475,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000400B) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt56uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt56u response %@", [value description]);
             if (error != nil) {
@@ -94773,10 +94505,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000400B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -94810,10 +94542,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000400B) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -94853,9 +94585,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000400C) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt64u response %@", [value description]);
             if (error != nil) {
@@ -94883,10 +94615,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000400C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -94920,10 +94652,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000400C) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -94963,9 +94695,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000400D) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt8s response %@", [value description]);
             if (error != nil) {
@@ -94993,10 +94725,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000400D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -95030,10 +94762,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000400D) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -95073,9 +94805,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000400E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt16s response %@", [value description]);
             if (error != nil) {
@@ -95103,10 +94835,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000400E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -95140,10 +94872,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000400E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -95183,9 +94915,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000400F) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt24sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt24s response %@", [value description]);
             if (error != nil) {
@@ -95213,10 +94945,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000400F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -95250,10 +94982,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000400F) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -95293,9 +95025,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004010) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt32s response %@", [value description]);
             if (error != nil) {
@@ -95323,10 +95055,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -95360,10 +95092,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004010) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -95403,9 +95135,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004011) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt40sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt40s response %@", [value description]);
             if (error != nil) {
@@ -95433,10 +95165,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -95470,10 +95202,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004011) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -95513,9 +95245,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004012) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt48sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt48s response %@", [value description]);
             if (error != nil) {
@@ -95543,10 +95275,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -95580,10 +95312,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004012) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -95623,9 +95355,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004013) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt56sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt56s response %@", [value description]);
             if (error != nil) {
@@ -95653,10 +95385,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -95690,10 +95422,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004013) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -95733,9 +95465,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004014) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableInt64s response %@", [value description]);
             if (error != nil) {
@@ -95763,10 +95495,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -95800,10 +95532,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004014) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -95843,9 +95575,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004015) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableEnum8 response %@", [value description]);
             if (error != nil) {
@@ -95873,10 +95605,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -95910,10 +95642,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004015) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -95953,9 +95685,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004016) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableEnum16 response %@", [value description]);
             if (error != nil) {
@@ -95983,10 +95715,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -96020,10 +95752,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004016) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -96063,9 +95795,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004017) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableFloatSingle response %@", [value description]);
             if (error != nil) {
@@ -96093,10 +95825,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -96130,10 +95862,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004017) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -96173,9 +95905,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004018) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableFloatDouble response %@", [value description]);
             if (error != nil) {
@@ -96203,10 +95935,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004018) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -96240,10 +95972,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004018) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -96283,9 +96015,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004019) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableOctetString response %@", [value description]);
             if (error != nil) {
@@ -96313,10 +96045,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -96350,10 +96082,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004019) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -96393,9 +96125,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000401E) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableCharString response %@", [value description]);
             if (error != nil) {
@@ -96423,10 +96155,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000401E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -96462,10 +96194,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000401E) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -96505,9 +96237,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004024) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableEnumAttr response %@", [value description]);
             if (error != nil) {
@@ -96535,10 +96267,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -96572,10 +96304,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004024) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -96615,9 +96347,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004025) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableStructWithCompletion:^(
             MTRUnitTestingClusterSimpleStruct * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableStruct response %@", [value description]);
@@ -96647,10 +96379,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -96700,10 +96432,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004025) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -96743,9 +96475,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004026) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableRangeRestrictedInt8u response %@", [value description]);
             if (error != nil) {
@@ -96773,10 +96505,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004026) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -96811,10 +96543,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004026) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -96854,9 +96586,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004027) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableRangeRestrictedInt8s response %@", [value description]);
             if (error != nil) {
@@ -96884,10 +96616,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004027) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -96922,10 +96654,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004027) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -96965,9 +96697,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004028) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableRangeRestrictedInt16u response %@", [value description]);
             if (error != nil) {
@@ -96995,10 +96727,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004028) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -97034,10 +96766,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004028) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -97077,9 +96809,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x00004029) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.NullableRangeRestrictedInt16s response %@", [value description]);
             if (error != nil) {
@@ -97107,10 +96839,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x00004029) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -97146,10 +96878,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x00004029) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -97189,9 +96921,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000402A) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeWriteOnlyInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.WriteOnlyInt8u response %@", [value description]);
             if (error != nil) {
@@ -97219,10 +96951,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) WriteAttribute (0x0000402A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRWriteParams * params = [[MTRWriteParams alloc] init];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRWriteParams alloc] init];
         params.timedWriteTimeout
             = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil;
         params.dataVersion = mDataVersion.HasValue() ? [NSNumber numberWithUnsignedInt:mDataVersion.Value()] : nil;
@@ -97256,10 +96988,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000402A) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -97299,9 +97031,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000FFF8) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.GeneratedCommandList response %@", [value description]);
             if (error != nil) {
@@ -97326,10 +97058,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000FFF8) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -97369,9 +97101,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000FFF9) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.AcceptedCommandList response %@", [value description]);
             if (error != nil) {
@@ -97396,10 +97128,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000FFF9) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -97439,9 +97171,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000FFFB) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.AttributeList response %@", [value description]);
             if (error != nil) {
@@ -97466,10 +97198,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000FFFB) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -97509,9 +97241,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000FFFC) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.FeatureMap response %@", [value description]);
             if (error != nil) {
@@ -97536,10 +97268,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000FFFC) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
@@ -97579,9 +97311,9 @@
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReadAttribute (0x0000FFFD) on endpoint %u", endpointId);
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable error) {
             NSLog(@"UnitTesting.ClusterRevision response %@", [value description]);
             if (error != nil) {
@@ -97606,10 +97338,10 @@
     {
         ChipLogProgress(chipTool, "Sending cluster (0xFFF1FC05) ReportAttribute (0x0000FFFD) on endpoint %u", endpointId);
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL);
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(endpointId)
-                                                                                          queue:callbackQueue];
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
+                                                                       endpointID:@(endpointId)
+                                                                            queue:callbackQueue];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(mMinInterval) maxInterval:@(mMaxInterval)];
         if (mKeepSubscriptions.HasValue()) {
             params.replaceExistingSubscriptions = !mKeepSubscriptions.Value();
         }
diff --git a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
index 2b90c66..8bc08e4 100644
--- a/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
+++ b/zzz_generated/darwin-framework-tool/zap-generated/test/Commands.h
@@ -481,6 +481,7 @@
 
     CHIP_ERROR TestWaitForCommissionee_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -488,10 +489,9 @@
 
     CHIP_ERROR TestWriteEntries_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -588,7 +588,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write entries Error: %@", err);
 
@@ -602,15 +602,14 @@
 
     CHIP_ERROR TestVerify_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -897,10 +896,9 @@
 
     CHIP_ERROR TestWriteEntriesEmptyLists_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -928,7 +926,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write entries empty lists Error: %@", err);
 
@@ -942,15 +940,14 @@
 
     CHIP_ERROR TestVerify_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -989,10 +986,9 @@
 
     CHIP_ERROR TestWriteEntryInvalidPrivilege_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -1014,7 +1010,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write entry invalid privilege Error: %@", err);
 
@@ -1031,15 +1027,14 @@
 
     CHIP_ERROR TestVerify_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -1068,10 +1063,9 @@
 
     CHIP_ERROR TestWriteEntryInvalidAuthMode_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -1093,7 +1087,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write entry invalid auth mode Error: %@", err);
 
@@ -1110,15 +1104,14 @@
 
     CHIP_ERROR TestVerify_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -1147,10 +1140,9 @@
 
     CHIP_ERROR TestWriteEntryInvalidSubject_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -1176,7 +1168,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write entry invalid subject Error: %@", err);
 
@@ -1193,15 +1185,14 @@
 
     CHIP_ERROR TestVerify_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -1230,10 +1221,9 @@
 
     CHIP_ERROR TestWriteEntryInvalidTarget_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -1263,7 +1253,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write entry invalid target Error: %@", err);
 
@@ -1280,15 +1270,14 @@
 
     CHIP_ERROR TestVerify_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -1317,10 +1306,9 @@
 
     CHIP_ERROR TestWriteEntryTooManySubjects_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -1365,7 +1353,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write entry too many subjects Error: %@", err);
 
@@ -1382,15 +1370,14 @@
 
     CHIP_ERROR TestVerify_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -1419,10 +1406,9 @@
 
     CHIP_ERROR TestWriteEntryTooManyTargets_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -1547,7 +1533,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write entry too many targets Error: %@", err);
 
@@ -1564,15 +1550,14 @@
 
     CHIP_ERROR TestVerify_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -1601,10 +1586,9 @@
 
     CHIP_ERROR TestWriteTooManyEntries_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -1733,7 +1717,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Write too many entries Error: %@", err);
 
@@ -1750,15 +1734,14 @@
 
     CHIP_ERROR TestVerify_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -2045,10 +2028,9 @@
 
     CHIP_ERROR TestRestoreAcl_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -2063,7 +2045,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Restore ACL Error: %@", err);
 
@@ -2077,15 +2059,14 @@
 
     CHIP_ERROR TestVerify_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
-        [cluster readAttributeAclWithParams:params
+        [cluster readAttributeACLWithParams:params
                                  completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
                                      NSLog(@"Verify Error: %@", err);
 
@@ -2114,10 +2095,9 @@
 
     CHIP_ERROR TestValidateResourceMinimaSubjectsPerAccessControlEntry_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSubjectsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2135,10 +2115,9 @@
 
     CHIP_ERROR TestValidateResourceMinimaTargetsPerAccessControlEntry_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2156,10 +2135,9 @@
 
     CHIP_ERROR TestValidateResourceMinimaAccessControlEntriesPerFabric_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAccessControlEntriesPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2300,6 +2278,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -2307,10 +2286,9 @@
 
     CHIP_ERROR TestThReadsClusterRevisionAttributeFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2332,10 +2310,9 @@
 
     CHIP_ERROR TestThReadsFeatureMapAttributeFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2357,10 +2334,9 @@
 
     CHIP_ERROR TestThReadsAttributeListAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -2387,10 +2363,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeExtensionInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -2409,10 +2384,9 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -2434,10 +2408,9 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -2569,6 +2542,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -2576,10 +2550,9 @@
 
     CHIP_ERROR TestThReadsSubjectsPerAccessControlEntryAttributeFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSubjectsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2599,10 +2572,9 @@
 
     CHIP_ERROR TestThReadsTargetsPerAccessControlEntryAttributeFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetsPerAccessControlEntryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2622,10 +2594,9 @@
 
     CHIP_ERROR TestThReadsAccessControlEntriesPerFabricAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAccessControlEntriesPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2742,6 +2713,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -2749,10 +2721,9 @@
 
     CHIP_ERROR TestTh1ReadsDutDescriptorClusterServerListAttributeFromEndpoint0_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeServerListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -2771,6 +2742,7 @@
 
     CHIP_ERROR TestTh1ReadsDutDescriptorClusterServerListAttributeFromEveryEndpointExcept0_2()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Factory Reset the DUT and enter 'y' after successgarbage: not in length on purpose", 49);
@@ -2893,6 +2865,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -2900,10 +2873,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2925,10 +2897,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -2950,10 +2921,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -2977,10 +2947,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -3002,10 +2971,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -3115,6 +3083,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -3122,10 +3091,9 @@
 
     CHIP_ERROR TestReadMandatoryNonGlobalAttributeStateValue_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBooleanState * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBooleanState alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStateValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -3265,6 +3233,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -3272,10 +3241,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -3297,10 +3265,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -3322,10 +3289,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -3350,10 +3316,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeSetupURLInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -3372,10 +3337,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -3393,10 +3357,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterActions * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterActions alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -3530,6 +3493,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -3537,10 +3501,9 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -3562,10 +3525,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -3587,10 +3549,9 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -3614,10 +3575,9 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -3639,10 +3599,9 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4248,6 +4207,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -4255,10 +4215,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -4280,10 +4239,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -4305,10 +4263,9 @@
 
     CHIP_ERROR TestGivenCcsf00hsEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -4325,10 +4282,9 @@
 
     CHIP_ERROR TestGivenCCSF01EHueEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -4345,10 +4301,9 @@
 
     CHIP_ERROR TestGivenCcsf02clEnsureFeaturemapHasTheCorrectBitSet_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -4365,10 +4320,9 @@
 
     CHIP_ERROR TestGivenCcsf03xyEnsureFeaturemapHasTheCorrectBitSet_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -4385,10 +4339,9 @@
 
     CHIP_ERROR TestGivenCcsf04ctEnsureFeaturemapHasTheCorrectBitSet_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -4405,10 +4358,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4435,10 +4387,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCurrentHueInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4457,10 +4408,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCurrentSaturationInAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4479,10 +4429,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeRemainingTimeInAttributeList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4501,10 +4450,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCurrentXInAttributeList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4523,10 +4471,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCurrentYInAttributeList_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4545,10 +4492,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeDriftCompensationInAttributeList_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4567,10 +4513,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCompensationTextInAttributeList_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4589,10 +4534,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeColorTemperatureMiredsInAttributeList_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4611,10 +4555,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeEnhancedCurrentHueInAttributeList_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4633,10 +4576,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeColorLoopActiveInAttributeList_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4655,10 +4597,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeColorLoopDirectionInAttributeList_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4677,10 +4618,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeColorLoopTimeInAttributeList_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4699,10 +4639,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeColorLoopStartEnhancedHueInAttributeList_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4721,10 +4660,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeColorLoopStoredEnhancedHueInAttributeList_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4743,10 +4681,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeColorTempPhysicalMinMiredsInAttributeList_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4765,10 +4702,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeColorTempPhysicalMaxMiredsInAttributeList_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4787,10 +4723,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCoupleColorTempToLevelMinMiredsInAttributeList_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4809,10 +4744,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeStartUpColorTemperatureMiredsInAttributeList_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4831,10 +4765,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandMoveToHueInAcceptedCommandList_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4853,10 +4786,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandMoveHueInAcceptedCommandList_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4875,10 +4807,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandStepHueInAcceptedCommandList_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4897,10 +4828,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandMoveToSaturationInAcceptedCommandList_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4919,10 +4849,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandMoveSaturationInAcceptedCommandList_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4941,10 +4870,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandStepSaturationInAcceptedCommandList_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4963,10 +4891,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandMoveToHueAndSaturationInAcceptedCommandList_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -4985,10 +4912,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandMoveToColorInAcceptedCommandList_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5007,10 +4933,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandMoveColorInAcceptedCommandList_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5029,10 +4954,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandStepColorInAcceptedCommandList_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5051,10 +4975,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandMoveToColorTemperatureInAcceptedCommandList_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5073,10 +4996,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandEnhancedMoveToHueInAcceptedCommandList_38()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5095,10 +5017,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandEnhancedMoveHueInAcceptedCommandList_39()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5117,10 +5038,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandEnhancedStepHueInAcceptedCommandList_40()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5139,10 +5059,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandEnhancedMoveToHueAndSaturationInAcceptedCommandList_41()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5161,10 +5080,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandColorLoopSetInAcceptedCommandList_42()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5183,10 +5101,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandStopMoveStepInAcceptedCommandList_43()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5205,10 +5122,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandMoveColorTemperatureInAcceptedCommandList_44()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5227,10 +5143,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandStepColorTemperatureInAcceptedCommandList_45()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5249,10 +5164,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_46()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -5967,6 +5881,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -5974,10 +5889,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -5997,10 +5911,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6020,10 +5933,9 @@
 
     CHIP_ERROR TestThReadsRemainingTimeAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRemainingTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6043,10 +5955,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6066,10 +5977,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6089,10 +5999,9 @@
 
     CHIP_ERROR TestThReadsDriftCompensationAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDriftCompensationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6112,10 +6021,9 @@
 
     CHIP_ERROR TestThReadsCompensationTextAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCompensationTextWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -6133,10 +6041,9 @@
 
     CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6156,10 +6063,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6179,10 +6085,9 @@
 
     CHIP_ERROR TestThReadsOptionsAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6202,10 +6107,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6225,10 +6129,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6248,10 +6151,9 @@
 
     CHIP_ERROR TestThReadsColorLoopActiveAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorLoopActiveWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6271,10 +6173,9 @@
 
     CHIP_ERROR TestThReadsColorLoopDirectionAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorLoopDirectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6294,10 +6195,9 @@
 
     CHIP_ERROR TestThReadsColorLoopTimeAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorLoopTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6317,10 +6217,9 @@
 
     CHIP_ERROR TestThReadsColorLoopStartEnhancedHueAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorLoopStartEnhancedHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6340,10 +6239,9 @@
 
     CHIP_ERROR TestThReadsColorLoopStoredEnhancedHueAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorLoopStoredEnhancedHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6364,10 +6262,9 @@
 
     CHIP_ERROR TestSavingForComparisionInStep19ReadsFeatureMapAttributeFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6387,10 +6284,9 @@
 
     CHIP_ERROR TestThReadsColorCapabilitiesAttributeFromDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorCapabilitiesWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6415,10 +6311,9 @@
 
     CHIP_ERROR TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTempPhysicalMinMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6438,10 +6333,9 @@
 
     CHIP_ERROR TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTempPhysicalMaxMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6461,10 +6355,9 @@
 
     CHIP_ERROR TestThReadsCoupleColorTempToLevelMinMiredsAttributeFromDut_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCoupleColorTempToLevelMinMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6485,10 +6378,9 @@
 
     CHIP_ERROR TestThReadsStartUpColorTemperatureMiredsAttributeFromDut_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStartUpColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6512,10 +6404,9 @@
 
     CHIP_ERROR TestThReadsNumberOfPrimariesAttributeFromDut_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfPrimariesWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6539,6 +6430,7 @@
     CHIP_ERROR
     TestThReadsPrimary1XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs1OrMore_25()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6549,6 +6441,7 @@
     CHIP_ERROR
     TestThReadsPrimary1YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs1OrMore_26()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6559,6 +6452,7 @@
     CHIP_ERROR
     TestThReadsPrimary1IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs1OrMore_27()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6569,6 +6463,7 @@
     CHIP_ERROR
     TestThReadsPrimary2XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs2OrMore_28()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6579,6 +6474,7 @@
     CHIP_ERROR
     TestThReadsPrimary2YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs2OrMore_29()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6589,6 +6485,7 @@
     CHIP_ERROR
     TestThReadsPrimary2IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs2OrMore_30()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6599,6 +6496,7 @@
     CHIP_ERROR
     TestThReadsPrimary3XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs3OrMore_31()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6609,6 +6507,7 @@
     CHIP_ERROR
     TestThReadsPrimary3YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs3OrMore_32()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6619,6 +6518,7 @@
     CHIP_ERROR
     TestThReadsPrimary3IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs3OrMore_33()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6629,6 +6529,7 @@
     CHIP_ERROR
     TestThReadsPrimary4XAttributeFromDutVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs4OrMore_34()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6639,6 +6540,7 @@
     CHIP_ERROR
     TestThReadsPrimary4YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs4OrMore_35()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6649,6 +6551,7 @@
     CHIP_ERROR
     TestThReadsPrimary4IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs4OrMore_36()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6659,6 +6562,7 @@
     CHIP_ERROR
     TestThReadsPrimary5XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs5OrMore_37()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6669,6 +6573,7 @@
     CHIP_ERROR
     TestThReadsPrimary5YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs5OrMore_38()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6679,6 +6584,7 @@
     CHIP_ERROR
     TestThReadsPrimary5IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs5OrMore_39()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6689,6 +6595,7 @@
     CHIP_ERROR
     TestThReadsPrimary6XAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs6OrMore_40()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6699,6 +6606,7 @@
     CHIP_ERROR
     TestThReadsPrimary6YAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint16Min0Max0xfeffIfNumberOfPrimariesIs6OrMore_41()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6709,6 +6617,7 @@
     CHIP_ERROR
     TestThReadsPrimary6IntensityAttributeFromDutAndVerifyThatTheDutResponseContainsAnUint8IfNumberOfPrimariesIs6OrMore_42()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -6718,10 +6627,9 @@
 
     CHIP_ERROR TestThReadsWhitePointXAttributeFromDut_43()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWhitePointXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6741,10 +6649,9 @@
 
     CHIP_ERROR TestThReadsWhitePointYAttributeFromDut_44()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWhitePointYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6764,10 +6671,9 @@
 
     CHIP_ERROR TestThReadsColorPointRXAttributeFromDut_45()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorPointRXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6787,10 +6693,9 @@
 
     CHIP_ERROR TestThReadsColorPointRYAttributeFromDut_46()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorPointRYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6810,10 +6715,9 @@
 
     CHIP_ERROR TestThReadsColorPointRIntensityAttributeFromDut_47()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorPointRIntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6836,10 +6740,9 @@
 
     CHIP_ERROR TestThReadsColorPointGXAttributeFromDut_48()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorPointGXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6859,10 +6762,9 @@
 
     CHIP_ERROR TestThReadsColorPointGYAttributeFromDut_49()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorPointGYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6882,10 +6784,9 @@
 
     CHIP_ERROR TestThReadsColorPointGIntensityAttributeFromDut_50()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorPointGIntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6908,10 +6809,9 @@
 
     CHIP_ERROR TestThReadsColorPointBXAttributeFromDut_51()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorPointBXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6931,10 +6831,9 @@
 
     CHIP_ERROR TestThReadsColorPointBYAttributeFromDut_52()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorPointBYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -6954,10 +6853,9 @@
 
     CHIP_ERROR TestThReadsColorPointBIntensityAttributeFromDut_53()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorPointBIntensityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7355,6 +7253,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -7362,10 +7261,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -7384,8 +7282,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -7401,10 +7300,9 @@
 
     CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue200Direction0x00ShortestDistanceAndTransitionTime0Immediately_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
@@ -7429,6 +7327,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -7436,10 +7335,9 @@
 
     CHIP_ERROR TestThSendsMoveHueCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
@@ -7461,6 +7359,7 @@
 
     CHIP_ERROR TestWait10s_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -7468,10 +7367,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7490,6 +7388,7 @@
 
     CHIP_ERROR TestWait10s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -7497,10 +7396,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7519,6 +7417,7 @@
 
     CHIP_ERROR TestWait10s_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -7526,10 +7425,9 @@
 
     CHIP_ERROR TestThSendsMoveHueCommandToDutWithMoveMode0x00StopAndRate5UnitsS_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
@@ -7551,10 +7449,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7573,6 +7470,7 @@
 
     CHIP_ERROR TestWait2s_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 2000UL;
         return WaitForMs("alpha", value);
@@ -7580,10 +7478,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7602,10 +7499,9 @@
 
     CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue60Direction0x00ShortestDistanceAndTransitionTime0Immediately_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
@@ -7630,6 +7526,7 @@
 
     CHIP_ERROR TestWait100ms_16()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -7637,10 +7534,9 @@
 
     CHIP_ERROR TestThSendsMoveHueCommandToDutWithMoveMode0x03DownAndRate5UnitsS_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
@@ -7662,6 +7558,7 @@
 
     CHIP_ERROR TestWait10s_18()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -7669,10 +7566,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7691,6 +7587,7 @@
 
     CHIP_ERROR TestWait10s_20()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -7698,10 +7595,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7720,6 +7616,7 @@
 
     CHIP_ERROR TestWait10s_22()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -7727,10 +7624,9 @@
 
     CHIP_ERROR TestThSendsMoveHueCommandToDutWithMoveMode0x00StopAndRate5UnitsS_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveHueParams alloc] init];
@@ -7752,10 +7648,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7774,6 +7669,7 @@
 
     CHIP_ERROR TestWait2s_25()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 2000UL;
         return WaitForMs("alpha", value);
@@ -7781,10 +7677,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7803,10 +7698,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7830,10 +7724,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -7857,8 +7750,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -7874,8 +7768,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8213,6 +8108,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -8220,10 +8116,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -8242,8 +8137,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -8259,10 +8155,9 @@
 
     CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue200Direction0x00ShortestDistanceAndTransitionTime0Immediately_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
@@ -8287,6 +8182,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -8294,10 +8190,9 @@
 
     CHIP_ERROR TestThSendsStepHueCommandToDutWithStepMode0x01UpStepSize60AndTransitionTime20020s_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterStepHueParams alloc] init];
@@ -8322,6 +8217,7 @@
 
     CHIP_ERROR TestWait10s_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -8329,10 +8225,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8351,6 +8246,7 @@
 
     CHIP_ERROR TestWait10s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -8358,10 +8254,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8380,6 +8275,7 @@
 
     CHIP_ERROR TestWait5s_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -8387,10 +8283,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8409,10 +8304,9 @@
 
     CHIP_ERROR TestThSendsMoveToHueCommandToDutWithHue50Direction0x00ShortestDistanceAndTransitionTime0Immediately_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToHueParams alloc] init];
@@ -8437,6 +8331,7 @@
 
     CHIP_ERROR TestWait100ms_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -8444,10 +8339,9 @@
 
     CHIP_ERROR TestThSendsStepHueCommandToDutWithStepMode0x03DownStepSize60AndTransitionTime20020s_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterStepHueParams alloc] init];
@@ -8472,6 +8366,7 @@
 
     CHIP_ERROR TestWait10s_15()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -8479,10 +8374,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8501,6 +8395,7 @@
 
     CHIP_ERROR TestWait10s_17()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -8508,10 +8403,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8530,6 +8424,7 @@
 
     CHIP_ERROR TestWait5s_19()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -8537,10 +8432,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8559,10 +8453,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8586,10 +8479,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8613,8 +8505,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -8630,8 +8523,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -8901,6 +8795,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -8908,10 +8803,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -8930,8 +8824,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -8947,10 +8842,9 @@
 
     CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation60AndTransitionTime0Immediately_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
@@ -8974,6 +8868,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -8981,10 +8876,9 @@
 
     CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime30030s_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
@@ -9008,6 +8902,7 @@
 
     CHIP_ERROR TestWait10s_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -9015,10 +8910,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9037,6 +8931,7 @@
 
     CHIP_ERROR TestWait10s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -9044,10 +8939,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9066,6 +8960,7 @@
 
     CHIP_ERROR TestWait10s_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -9073,10 +8968,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9095,6 +8989,7 @@
 
     CHIP_ERROR TestWait5s_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -9102,10 +8997,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9124,10 +9018,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9151,10 +9044,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9178,8 +9070,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -9195,8 +9088,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9623,6 +9517,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -9630,10 +9525,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -9652,8 +9546,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -9669,10 +9564,9 @@
 
     CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
@@ -9696,6 +9590,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -9703,10 +9598,9 @@
 
     CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
@@ -9731,6 +9625,7 @@
 
     CHIP_ERROR TestWait10s_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -9738,10 +9633,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9760,6 +9654,7 @@
 
     CHIP_ERROR TestWait10s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -9767,10 +9662,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9789,6 +9683,7 @@
 
     CHIP_ERROR TestWait5s_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -9796,10 +9691,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9818,10 +9712,9 @@
 
     CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation120AndTransitionTime0Immediately_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
@@ -9845,6 +9738,7 @@
 
     CHIP_ERROR TestWait100ms_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -9852,10 +9746,9 @@
 
     CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x03DownAndRate5UnitsS_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
@@ -9879,6 +9772,7 @@
 
     CHIP_ERROR TestWait10s_15()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -9886,10 +9780,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9908,6 +9801,7 @@
 
     CHIP_ERROR TestWait10s_17()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -9915,10 +9809,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9937,6 +9830,7 @@
 
     CHIP_ERROR TestWait10s_19()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -9944,10 +9838,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -9966,10 +9859,9 @@
 
     CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation150AndTransitionTime0Immediately_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
@@ -9993,6 +9885,7 @@
 
     CHIP_ERROR TestWait100ms_22()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -10000,10 +9893,9 @@
 
     CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x01UpAndRate5UnitsS_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
@@ -10028,6 +9920,7 @@
 
     CHIP_ERROR TestWait10s_24()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -10035,10 +9928,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10057,10 +9949,9 @@
 
     CHIP_ERROR TestThSendsMoveSaturationCommandToDutWithMoveMode0x00StopAndRate5UnitsS_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveSaturationParams alloc] init];
@@ -10084,10 +9975,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10106,6 +9996,7 @@
 
     CHIP_ERROR TestWait2s_28()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 2000UL;
         return WaitForMs("alpha", value);
@@ -10113,10 +10004,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10135,10 +10025,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10162,10 +10051,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10189,8 +10077,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -10206,8 +10095,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10607,6 +10497,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -10614,10 +10505,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -10636,8 +10526,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -10653,10 +10544,9 @@
 
     CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation200AndTransitionTime0Immediately_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
@@ -10680,6 +10570,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -10687,10 +10578,9 @@
 
     CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize40AndTransitionTime20020s_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
@@ -10715,6 +10605,7 @@
 
     CHIP_ERROR TestWait10s_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -10722,10 +10613,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10744,6 +10634,7 @@
 
     CHIP_ERROR TestWait10s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -10751,10 +10642,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10773,6 +10663,7 @@
 
     CHIP_ERROR TestWait5s_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -10780,10 +10671,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10802,10 +10692,9 @@
 
     CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x01UpStepSize20AndTransitionTime10010s_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
@@ -10830,6 +10719,7 @@
 
     CHIP_ERROR TestWait10s_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -10837,10 +10727,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10859,10 +10748,9 @@
 
     CHIP_ERROR TestThSendsMoveToSaturationCommandToDutWithSaturation50AndTransitionTime0Immediately_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToSaturationParams alloc] init];
@@ -10886,6 +10774,7 @@
 
     CHIP_ERROR TestWait100ms_16()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -10893,10 +10782,9 @@
 
     CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize40AndTransitionTime20020s_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
@@ -10921,6 +10809,7 @@
 
     CHIP_ERROR TestWait10s_18()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -10928,10 +10817,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10950,6 +10838,7 @@
 
     CHIP_ERROR TestWait10s_20()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -10957,10 +10846,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -10979,6 +10867,7 @@
 
     CHIP_ERROR TestWait5s_22()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -10986,10 +10875,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11008,10 +10896,9 @@
 
     CHIP_ERROR TestThSendsStepSaturationCommandToDutWithStepMode0x03DownStepSize20AndTransitionTime10010S_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterStepSaturationParams alloc] init];
@@ -11036,6 +10923,7 @@
 
     CHIP_ERROR TestWait10s_25()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -11043,10 +10931,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11067,10 +10954,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11094,10 +10980,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11121,8 +11006,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -11138,8 +11024,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11445,6 +11332,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -11452,10 +11340,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -11474,8 +11361,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -11491,10 +11379,9 @@
 
     CHIP_ERROR TestThSendsMoveToHueAndSaturationCommandToDutWithHue200Saturation50AndTransitionTime0Immediately_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToHueAndSaturationParams alloc] init];
@@ -11519,6 +11406,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -11526,10 +11414,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11548,10 +11435,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11570,10 +11456,9 @@
 
     CHIP_ERROR TestThSendsMoveToHueAndSaturationCommandToDutWithHue160Saturation80AndTransitionTime20020s_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToHueAndSaturationParams alloc] init];
@@ -11598,6 +11483,7 @@
 
     CHIP_ERROR TestWait10s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -11605,10 +11491,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11627,10 +11512,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11649,6 +11533,7 @@
 
     CHIP_ERROR TestWait10s_11()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -11656,10 +11541,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11678,10 +11562,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11701,6 +11584,7 @@
 
     CHIP_ERROR TestWait5s_14()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -11708,10 +11592,9 @@
 
     CHIP_ERROR TestThReadsCurrentHueAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11730,10 +11613,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11752,10 +11634,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11779,10 +11660,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -11806,8 +11686,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -11823,8 +11704,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12532,6 +12414,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -12539,10 +12422,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -12561,8 +12443,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -12578,10 +12461,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -12606,6 +12488,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -12613,10 +12496,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12635,10 +12517,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12657,10 +12538,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime20020s_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -12685,6 +12565,7 @@
 
     CHIP_ERROR TestWait10s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -12692,10 +12573,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12714,10 +12594,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12736,6 +12615,7 @@
 
     CHIP_ERROR TestWait10s_11()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -12743,10 +12623,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12765,10 +12644,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12787,6 +12665,7 @@
 
     CHIP_ERROR TestWait5s_14()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -12794,10 +12673,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12816,10 +12694,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12838,10 +12715,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -12860,10 +12736,9 @@
 
     CHIP_ERROR TestThReadOptionsAttribute_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12884,8 +12759,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -12901,10 +12777,9 @@
 
     CHIP_ERROR TestThSendsAMoveToColorCommandToTheDutWithColorX327680x8000X05PurpleColorY196600x4CCCY03TransitionTime0Immediate_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -12929,6 +12804,7 @@
 
     CHIP_ERROR TestWait100ms_21()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -12936,10 +12812,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12958,10 +12833,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -12980,8 +12854,9 @@
 
     CHIP_ERROR TestThSendsOffCommandToDut_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -12997,10 +12872,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -13025,6 +12899,7 @@
 
     CHIP_ERROR TestWait100ms_26()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -13032,10 +12907,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13056,10 +12930,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13080,10 +12953,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -13108,6 +12980,7 @@
 
     CHIP_ERROR TestWait100ms_30()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -13115,10 +12988,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13139,10 +13011,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13163,10 +13034,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -13191,6 +13061,7 @@
 
     CHIP_ERROR TestWait100ms_34()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -13198,10 +13069,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13220,10 +13090,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13242,10 +13111,9 @@
 
     CHIP_ERROR TestThWrites1ToTheOptionsAttribute_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -13264,10 +13132,9 @@
 
     CHIP_ERROR TestThReadOptionsAttribute_38()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13288,8 +13155,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_39()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -13305,10 +13173,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX327680x8000ColorY196600x4CCCTransitionTime0Immediate_40()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -13333,6 +13200,7 @@
 
     CHIP_ERROR TestWait100ms_41()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -13340,10 +13208,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_42()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13362,10 +13229,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_43()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13384,8 +13250,9 @@
 
     CHIP_ERROR TestThSendsOffCommandToDut_44()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -13401,10 +13268,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY131070x3333TransitionTime0Immediate_45()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -13429,6 +13295,7 @@
 
     CHIP_ERROR TestWait100ms_46()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -13436,10 +13303,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_47()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13458,10 +13324,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_48()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13480,10 +13345,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX131070x3333ColorY327680x8000TransitionTime0Immediate_49()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -13508,6 +13372,7 @@
 
     CHIP_ERROR TestWait100ms_50()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -13515,10 +13380,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_51()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13539,10 +13403,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_52()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13563,10 +13426,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX262140x6666ColorY327680x8000TransitionTime0Immediate_53()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -13591,6 +13453,7 @@
 
     CHIP_ERROR TestWait100ms_54()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -13598,10 +13461,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_55()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13620,10 +13482,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_56()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13642,10 +13503,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_57()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13669,10 +13529,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_58()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -13990,6 +13849,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -13997,10 +13857,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -14019,8 +13878,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -14036,10 +13896,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX33000ColorY26000TransitionTime0Immediate_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -14064,6 +13923,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -14071,10 +13931,9 @@
 
     CHIP_ERROR TestThSendsMoveColorCommandToDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveColorParams alloc] init];
@@ -14096,6 +13955,7 @@
 
     CHIP_ERROR TestWait10s_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -14103,10 +13963,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14125,10 +13984,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14147,6 +14005,7 @@
 
     CHIP_ERROR TestWait10s_9()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -14154,10 +14013,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14176,10 +14034,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14198,6 +14055,7 @@
 
     CHIP_ERROR TestWait10s_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -14206,10 +14064,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14232,10 +14089,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14257,10 +14113,9 @@
 
     CHIP_ERROR TestThSendsStopMoveStepCommandToDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterStopMoveStepParams alloc] init];
@@ -14280,10 +14135,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14302,10 +14156,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14324,10 +14177,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14351,10 +14203,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14378,8 +14229,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -14395,8 +14247,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14680,6 +14533,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -14687,10 +14541,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -14709,8 +14562,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -14726,10 +14580,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorCommandToDutWithColorX33000ColorY20000TransitionTime0Immediate_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorParams alloc] init];
@@ -14754,6 +14607,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -14761,10 +14615,9 @@
 
     CHIP_ERROR TestThSendsStepColorCommandToDutWithStepX20000StepY6000TransitionTime20020s_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterStepColorParams alloc] init];
@@ -14789,6 +14642,7 @@
 
     CHIP_ERROR TestWait10s_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -14796,10 +14650,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14818,10 +14671,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14840,6 +14692,7 @@
 
     CHIP_ERROR TestWait10s_9()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -14847,10 +14700,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14869,10 +14721,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14891,6 +14742,7 @@
 
     CHIP_ERROR TestWait5s_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -14898,10 +14750,9 @@
 
     CHIP_ERROR TestThReadsCurrentXAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentXWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14920,10 +14771,9 @@
 
     CHIP_ERROR TestThReadsCurrentYAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentYWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14942,10 +14792,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14969,10 +14818,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -14996,8 +14844,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -15013,8 +14862,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15316,6 +15166,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -15323,10 +15174,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -15345,8 +15195,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -15363,10 +15214,9 @@
 
     CHIP_ERROR TestThReadsColorTempPhysicalMinMiredsAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTempPhysicalMinMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15390,10 +15240,9 @@
 
     CHIP_ERROR TestThReadsColorTempPhysicalMaxMiredsAttributeFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTempPhysicalMaxMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15416,10 +15265,9 @@
 
     CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15441,10 +15289,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorTemperatureCommandToDutWithColorTemperatureMireds310AndTransitionTime0Immediately_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorTemperatureParams alloc] init];
@@ -15468,6 +15315,7 @@
 
     CHIP_ERROR TestWait100ms_7()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -15475,10 +15323,9 @@
 
     CHIP_ERROR TestThSendsMoveToColorTemperaturCommandToDutWithColorTemperatureMireds250AndTransitionTime30030s_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterMoveToColorTemperatureParams alloc] init];
@@ -15502,6 +15349,7 @@
 
     CHIP_ERROR TestWait10s_9()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -15509,10 +15357,9 @@
 
     CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15531,6 +15378,7 @@
 
     CHIP_ERROR TestWait10s_11()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -15538,10 +15386,9 @@
 
     CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15560,6 +15407,7 @@
 
     CHIP_ERROR TestWait10s_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -15567,10 +15415,9 @@
 
     CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15589,6 +15436,7 @@
 
     CHIP_ERROR TestWait5s_15()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -15596,10 +15444,9 @@
 
     CHIP_ERROR TestThReadsColorTemperatureMiredsAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorTemperatureMiredsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15618,10 +15465,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15645,10 +15491,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -15672,8 +15517,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -15689,8 +15535,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16064,6 +15911,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -16071,10 +15919,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -16093,8 +15940,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -16111,10 +15959,9 @@
     CHIP_ERROR
     TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue6000Direction0x00ShortestDistanceAndTransitionTime0Immediately_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueParams alloc] init];
@@ -16139,6 +15986,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -16146,10 +15994,9 @@
 
     CHIP_ERROR TestThSendsEnhancedStepHueCommandToDutWithStepMode0x01UpStepSize6000AndTransitionTime30030s_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterEnhancedStepHueParams alloc] init];
@@ -16174,6 +16021,7 @@
 
     CHIP_ERROR TestWait10s_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -16181,10 +16029,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16203,6 +16050,7 @@
 
     CHIP_ERROR TestWait10s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -16210,10 +16058,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16232,6 +16079,7 @@
 
     CHIP_ERROR TestWait10s_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -16239,10 +16087,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16261,6 +16108,7 @@
 
     CHIP_ERROR TestWait5s_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -16268,10 +16116,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16291,10 +16138,9 @@
     CHIP_ERROR
     TestThSendsEnhancedMoveToHueCommandToDutWithEnhancedHue12000Direction0x00ShortestDistanceAndTransitionTime0Immediately_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueParams alloc] init];
@@ -16319,6 +16165,7 @@
 
     CHIP_ERROR TestWait100ms_15()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -16326,10 +16173,9 @@
 
     CHIP_ERROR TestThSendsEnhancedStepHueCommandToDutWithStepMode0x03DownStepSize6000AndTransitionTime30030s_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterEnhancedStepHueParams alloc] init];
@@ -16354,6 +16200,7 @@
 
     CHIP_ERROR TestWait10s_17()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -16361,10 +16208,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16383,6 +16229,7 @@
 
     CHIP_ERROR TestWait10s_19()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -16390,10 +16237,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16412,6 +16258,7 @@
 
     CHIP_ERROR TestWait10s_21()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -16419,10 +16266,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16441,6 +16287,7 @@
 
     CHIP_ERROR TestWait5s_23()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -16448,10 +16295,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16470,10 +16316,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16497,10 +16342,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16524,8 +16368,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -16541,8 +16386,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16848,6 +16694,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -16855,10 +16702,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -16877,8 +16723,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -16895,10 +16742,9 @@
     CHIP_ERROR
     TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue20000Saturation50AndTransitionTime0Immediately_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueAndSaturationParams alloc] init];
@@ -16925,6 +16771,7 @@
 
     CHIP_ERROR TestWait100ms_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -16932,10 +16779,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16954,10 +16800,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -16976,10 +16821,9 @@
 
     CHIP_ERROR TestThSendsEnhancedMoveToHueAndSaturationCommandToDutWithEnhancedHue16000Saturation80AndTransitionTime20020s_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRColorControlClusterEnhancedMoveToHueAndSaturationParams alloc] init];
@@ -17004,6 +16848,7 @@
 
     CHIP_ERROR TestWait10s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -17011,10 +16856,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17034,10 +16878,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17056,6 +16899,7 @@
 
     CHIP_ERROR TestWait10s_11()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -17063,10 +16907,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17086,10 +16929,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17108,6 +16950,7 @@
 
     CHIP_ERROR TestWait5s_14()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -17115,10 +16958,9 @@
 
     CHIP_ERROR TestThReadsEnhancedCurrentHueAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedCurrentHueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17139,10 +16981,9 @@
 
     CHIP_ERROR TestThReadsCurrentSaturationAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentSaturationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17163,10 +17004,9 @@
 
     CHIP_ERROR TestThReadsColorModeAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17190,10 +17030,9 @@
 
     CHIP_ERROR TestThReadsEnhancedColorModeAttributeFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterColorControl * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterColorControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnhancedColorModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17217,8 +17056,9 @@
 
     CHIP_ERROR TestTurnOffLightThatWeTurnedOn_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -17234,8 +17074,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17368,6 +17209,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -17375,9 +17217,11 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17399,9 +17243,11 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17423,9 +17269,11 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17454,9 +17302,11 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17482,9 +17332,11 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17706,6 +17558,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -17713,8 +17566,9 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17736,8 +17590,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -17759,8 +17614,9 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17795,8 +17651,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeManufacturingDateInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17815,8 +17672,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePartNumberInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17835,8 +17693,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeProductURLInAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17855,8 +17714,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeProductLabelInAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17875,8 +17735,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeSerialNumberInAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17895,8 +17756,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeLocalConfigDisabledInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17915,8 +17777,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeReachableInAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17935,8 +17798,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeUniqueIDInAttributeList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17955,8 +17819,9 @@
 
     CHIP_ERROR TestTh1ReadsAcceptedCommandListFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -17978,8 +17843,9 @@
 
     CHIP_ERROR TestTh1ReadsGeneratedCommandListFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18183,6 +18049,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -18190,10 +18057,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -18215,10 +18081,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -18240,10 +18105,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18270,10 +18134,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18295,10 +18158,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18432,6 +18294,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -18439,10 +18302,9 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(0)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -18464,10 +18326,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(0)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -18489,10 +18350,9 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(0)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18515,10 +18375,9 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(0)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18541,10 +18400,9 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDiagnosticLogs * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device
-                                                                                           endpointID:@(0)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDiagnosticLogs alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18829,6 +18687,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -18836,9 +18695,11 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -18860,9 +18721,11 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -18884,9 +18747,11 @@
 
     CHIP_ERROR TestGivenDgethsf00EnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -18903,9 +18768,11 @@
 
     CHIP_ERROR TestGivenDgethsf01EnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -18922,9 +18789,11 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18947,9 +18816,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePHYRateInAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18968,9 +18839,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeFullDuplexInAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -18989,9 +18862,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19012,9 +18887,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF00PKTCNTInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19035,9 +18912,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19058,9 +18937,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19081,9 +18962,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePacketRxCountAndFeatureDependentDGETHSF01ERRCNTInAttributeList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19104,9 +18987,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeCarrierDetectInAttributeList_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19125,9 +19010,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTimeSinceResetInAttributeList_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19146,9 +19033,11 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19167,9 +19056,11 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19191,9 +19082,11 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -19482,6 +19375,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -19489,9 +19383,11 @@
 
     CHIP_ERROR TestReadPHYRateAttributeConstraints_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -19514,9 +19410,11 @@
 
     CHIP_ERROR TestReadFullDuplexAttributeConstraints_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFullDuplexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -19537,9 +19435,11 @@
 
     CHIP_ERROR TestReadPacketRxCountAttributeConstraints_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -19556,6 +19456,7 @@
 
     CHIP_ERROR TestReadPacketRxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_4()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -19565,9 +19466,11 @@
 
     CHIP_ERROR TestReadPacketTxCountAttributeConstraints_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -19584,6 +19487,7 @@
 
     CHIP_ERROR TestReadPacketTxCountValueFromDutAndVerifyTheNumberOfPacketsReceivedOnEthernetNetworkInterface_6()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -19593,9 +19497,11 @@
 
     CHIP_ERROR TestReadTxErrCountAttributeConstraints_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -19613,6 +19519,7 @@
     CHIP_ERROR
     TestReadTxErrCountValueFromDutAndVerifyValueIndicatesTheNumberOfFailedPacketTransmissionOnEthernetNetworkInterface_8()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -19622,9 +19529,11 @@
 
     CHIP_ERROR TestReadCollisionCountAttributeConstraints_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -19642,6 +19551,7 @@
     CHIP_ERROR
     TestReadCollisionCountValueFromDutAndVerifyValueIndicatesTheNumberOfCollisionOccurredWhileTransmittingPacketsOnEthernetNetworkInterface_10()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -19651,9 +19561,11 @@
 
     CHIP_ERROR TestReadOverrunCountAttributeConstraints_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -19671,6 +19583,7 @@
     CHIP_ERROR
     TestReadOverrunCountValueFromDutAndVerifyValueIndicatesTheNumberOfPacketsDroppedDueToLackOfBufferMemoryOnEthernetNetworkInterface_12()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -19680,9 +19593,11 @@
 
     CHIP_ERROR TestReadCarrierDetectAttributeConstraints_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCarrierDetectWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -19704,6 +19619,7 @@
     CHIP_ERROR
     TestReadCarrierDetectValueFromDutAndVerifyValueIndicatesThePresenceOfCarrierDetectControlSignalOnEthernetNetworkInterface_14()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -19713,9 +19629,11 @@
 
     CHIP_ERROR TestReadTimeSinceResetAttributeConstraints_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTimeSinceResetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -19732,6 +19650,7 @@
 
     CHIP_ERROR TestReadTimeSinceResetValueFromDutAndVerifyTheValueIndicatesTheDurationOfTimeInMinutes_16()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -20049,6 +19968,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -20056,9 +19976,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20081,9 +20003,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20106,9 +20030,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20131,9 +20057,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20156,9 +20084,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20181,9 +20111,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20206,9 +20138,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20231,9 +20165,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20256,9 +20192,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20281,9 +20219,11 @@
 
     CHIP_ERROR TestThReadsPHYRateAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePHYRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20307,9 +20247,11 @@
 
     CHIP_ERROR TestThReadsPacketRxCountAttributeValueFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20330,9 +20272,11 @@
 
     CHIP_ERROR TestThReadsPacketTxCountAttributeValueFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20353,9 +20297,11 @@
 
     CHIP_ERROR TestThReadsTxErrCountAttributeValueFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20376,9 +20322,11 @@
 
     CHIP_ERROR TestThReadsCollisionCountAttributeValueFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20399,9 +20347,11 @@
 
     CHIP_ERROR TestThReadsOverrunCountAttributeValueFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20421,9 +20371,11 @@
 
     CHIP_ERROR TestSendsResetCountsCommand_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster resetCountsWithCompletion:^(NSError * _Nullable err) {
@@ -20439,9 +20391,11 @@
 
     CHIP_ERROR TestThReadsPacketRxCountAttributeValueFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20459,9 +20413,11 @@
 
     CHIP_ERROR TestThReadsPacketTxCountAttributeValueFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20479,9 +20435,11 @@
 
     CHIP_ERROR TestThReadsTxErrCountAttributeValueFromDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTxErrCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20499,9 +20457,11 @@
 
     CHIP_ERROR TestThReadsCollisionCountAttributeValueFromDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCollisionCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20519,9 +20479,11 @@
 
     CHIP_ERROR TestThReadsOverrunCountAttributeValueFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterEthernetNetworkDiagnostics * cluster =
-            [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterEthernetNetworkDiagnostics alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20662,6 +20624,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -20669,10 +20632,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20694,10 +20656,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20719,10 +20680,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -20748,10 +20708,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -20770,10 +20729,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -20795,10 +20753,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -20941,6 +20898,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -20948,10 +20906,9 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeMinMeasuredValue_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -20974,10 +20931,9 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeMaxMeasuredValue_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21000,10 +20956,9 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeMeasuredValue_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21026,10 +20981,9 @@
 
     CHIP_ERROR TestThReadsFromTheDutTheToleranceAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFlowMeasurement * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFlowMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21161,6 +21115,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -21168,10 +21123,9 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21193,10 +21147,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21218,10 +21171,9 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -21245,10 +21197,9 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -21270,10 +21221,9 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFixedLabel * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFixedLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -21407,6 +21357,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -21414,10 +21365,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21439,10 +21391,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21464,10 +21417,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -21495,10 +21449,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -21519,10 +21474,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -21700,6 +21656,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -21707,10 +21664,11 @@
 
     CHIP_ERROR TestTh1ReadsTheBreadCrumbAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21727,10 +21685,11 @@
 
     CHIP_ERROR TestTh1WritesTheBreadCrumbAttributeAs1ToTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id breadcrumbArgument;
@@ -21749,10 +21708,11 @@
 
     CHIP_ERROR TestTh1ReadsTheBreadCrumbAttributeFromTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21773,10 +21733,11 @@
 
     CHIP_ERROR TestTh1ReadsTheRegulatoryConfigAttributeFromTheDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRegulatoryConfigWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21795,10 +21756,11 @@
 
     CHIP_ERROR TestTh1ReadsTheLocationCapabilityAttributeFromTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLocationCapabilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -21818,10 +21780,11 @@
     CHIP_ERROR
     TestTh1ReadsBasicCommissioningInfoAttributeFromDutAndVerifyThatTheBasicCommissioningInfoAttributeHasTheFollowingFieldFailSafeExpiryLengthSecondsFieldValueIsWithinADurationRangeOf0To65535_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBasicCommissioningInfoWithCompletion:^(
@@ -21841,10 +21804,11 @@
 
     CHIP_ERROR TestTh1ReadsSupportsConcurrentConnectionAttributeFromTheDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSupportsConcurrentConnectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -22039,6 +22003,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -22046,10 +22011,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -22071,10 +22037,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -22096,10 +22063,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22125,10 +22093,11 @@
 
     CHIP_ERROR TestReadOptionalAttributeUpTimeInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22147,10 +22116,11 @@
 
     CHIP_ERROR TestReadOptionalAttributeTotalOperationalHoursInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22169,10 +22139,11 @@
 
     CHIP_ERROR TestReadOptionalAttributeBootReasonInAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22191,10 +22162,11 @@
 
     CHIP_ERROR TestReadOptionalAttributeActiveHardwareFaultsInAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22213,10 +22185,11 @@
 
     CHIP_ERROR TestReadOptionalAttributeActiveRadioFaultsInAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22235,10 +22208,11 @@
 
     CHIP_ERROR TestReadOptionalAttributeActiveNetworkFaultsInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22257,10 +22231,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22279,10 +22254,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22562,6 +22538,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -22569,10 +22546,11 @@
 
     CHIP_ERROR TestThReadsNetworkInterfacesStructureAttributeFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNetworkInterfacesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22589,10 +22567,11 @@
 
     CHIP_ERROR TestThReadsARebootCountAttributeValueFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRebootCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -22612,12 +22591,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_3()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_4()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -22628,12 +22609,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_5()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_6()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -22644,6 +22627,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_7()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -22651,10 +22635,11 @@
 
     CHIP_ERROR TestDutRebootsAndThReadsAUpTimeAttributeValueOfDutSinceSomeArbitraryStartTimeOfDutRebooting_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeUpTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -22673,10 +22658,11 @@
 
     CHIP_ERROR TestThReadsATotalOperationalHoursAttributeValueFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTotalOperationalHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -22696,12 +22682,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_10()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_11()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -22712,6 +22700,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -22719,10 +22708,11 @@
 
     CHIP_ERROR TestThReadsBootReasonAttributeValueFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralDiagnostics * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBootReasonsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -22741,6 +22731,7 @@
 
     CHIP_ERROR TestThReadsActiveHardwareFaultsAttributeValueFromDut_14()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -22750,6 +22741,7 @@
 
     CHIP_ERROR TestThReadsActiveRadioFaultsAttributeValueFromDut_15()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -22759,6 +22751,7 @@
 
     CHIP_ERROR TestThReadsActiveNetworkFaultsAttributeValueFromDut_16()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -22768,6 +22761,7 @@
 
     CHIP_ERROR TestThReadsTestEventTriggersEnabledAttributeValue_17()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -22900,6 +22894,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -22907,10 +22902,9 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -22932,10 +22926,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -22957,10 +22950,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -22985,10 +22977,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -23007,10 +22998,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandTriggerEffectInAcceptedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -23029,10 +23019,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -23145,6 +23134,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -23152,10 +23142,9 @@
 
     CHIP_ERROR TestThReadsTheIdentifyTimeAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -23175,10 +23164,9 @@
 
     CHIP_ERROR TestThReadsTheIdentifyTypeAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeIdentifyTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -23382,6 +23370,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -23389,10 +23378,9 @@
 
     CHIP_ERROR TestThSendsIdentifyCommandToDutWithTheIdentifyTimeFieldSetTo0x003c60s_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
@@ -23412,10 +23400,9 @@
 
     CHIP_ERROR TestThReadsImmediatelyIdentifyTimeAttributeFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -23434,6 +23421,7 @@
 
     CHIP_ERROR TestWait10000ms_3()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -23441,10 +23429,9 @@
 
     CHIP_ERROR TestAfter10SecondsTheThReadsIdentifyTimeAttributeFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -23464,6 +23451,7 @@
     CHIP_ERROR
     TestThSendsIdentifyQueryCommandToDutAndVerifyIdentifyQueryResponseCommandToTHwithTheTimeoutFieldSetToAValueInTheRange0x0000To0x0032_5()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -23473,10 +23461,9 @@
 
     CHIP_ERROR TestThSendsIdentifyCommandToDutWithTheIdentifyTimeFieldSetTo0x0000StopIdentifying_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
@@ -23497,10 +23484,9 @@
 
     CHIP_ERROR TestThReadsImmediatelyIdentifyTimeAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -23521,10 +23507,9 @@
 
     CHIP_ERROR TestThWritesAValueOf0x000f15sToIdentifyTimeAttributeOfDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id identifyTimeArgument;
@@ -23544,6 +23529,7 @@
 
     CHIP_ERROR TestWait5000ms_9()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -23551,10 +23537,9 @@
 
     CHIP_ERROR TestAfter5SecondsTheThReadsIdentifyTimeAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeIdentifyTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -23890,6 +23875,7 @@
 
     CHIP_ERROR Test1WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -23898,10 +23884,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x00Default_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -23923,6 +23908,7 @@
 
     CHIP_ERROR TestDutExecutesABlinkEffect_2()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -23933,10 +23919,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -23958,6 +23943,7 @@
 
     CHIP_ERROR TestDutExecutesABreatheEffect_4()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -23968,10 +23954,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x02OkayAndTheEffectVariantFieldSetTo0x00Default_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -23993,6 +23978,7 @@
 
     CHIP_ERROR TestDutExecutesAnOkayEffect_6()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -24003,10 +23989,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x0bChannelChangeAndTheEffectVariantFieldSetTo0x00Default_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -24028,6 +24013,7 @@
 
     CHIP_ERROR TestDutExecutesAChannelChangeEffect_8()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -24038,10 +24024,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -24063,6 +24048,7 @@
 
     CHIP_ERROR TestDutExecutesABreatheEffect_10()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -24073,10 +24059,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xfeFinishEffectAndTheEffectVariantFieldSetTo0x00Default_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -24098,6 +24083,7 @@
 
     CHIP_ERROR TestDutStopsTheBreatheEffectAfterTheCurrentEffectSequence_12()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -24108,10 +24094,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x01BreatheAndTheEffectVariantFieldSetTo0x00Default_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -24133,6 +24118,7 @@
 
     CHIP_ERROR TestDutExecutesABreatheEffect_14()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -24143,10 +24129,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -24168,6 +24153,7 @@
 
     CHIP_ERROR TestDutStopsTheBreatheEffectAsSoonAsPossible_16()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -24178,10 +24164,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0x00BlinkAndTheEffectVariantFieldSetTo0x42Unknown_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -24203,6 +24188,7 @@
 
     CHIP_ERROR TestCheckDutExecutesABlinkEffect_18()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -24213,10 +24199,9 @@
     CHIP_ERROR
     TestThSendsTriggerEffectCommandToDutWithTheEffectIdentifierFieldSetTo0xffStopEffectAndTheEffectVariantFieldSetTo0x00Default_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterTriggerEffectParams alloc] init];
@@ -24238,6 +24223,7 @@
 
     CHIP_ERROR TestDutStopsAnyEffectThatMayBeStillRunningAsSoonAsPossible_20()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -24381,6 +24367,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -24388,9 +24375,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -24412,9 +24401,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -24436,9 +24427,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -24464,9 +24457,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -24485,9 +24480,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeLightSensorTypeInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -24506,9 +24503,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -24530,9 +24529,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -24686,6 +24687,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -24693,9 +24695,11 @@
 
     CHIP_ERROR TestThReadsMinMeasuredValueAttributeFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -24718,9 +24722,11 @@
 
     CHIP_ERROR TestThReadsMaxMeasuredValueAttributeFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -24743,9 +24749,11 @@
 
     CHIP_ERROR TestThReadsMeasuredValueAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -24768,9 +24776,11 @@
 
     CHIP_ERROR TestThReadsToleranceAttributeFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -24790,9 +24800,11 @@
 
     CHIP_ERROR TestThReadsLightSensorTypeAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLightSensorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -24972,6 +24984,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -24980,9 +24993,11 @@
 
     CHIP_ERROR TestThReadsMinMeasuredValueAttributeFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -25007,9 +25022,11 @@
 
     CHIP_ERROR TestThReadsMaxMeasuredValueAttributeFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -25033,6 +25050,7 @@
 
     CHIP_ERROR TestCoverTheSensorOrDarkenTheRoom_3()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for Successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -25042,6 +25060,7 @@
 
     CHIP_ERROR TestWait1s_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 1000UL;
         return WaitForMs("alpha", value);
@@ -25049,9 +25068,11 @@
 
     CHIP_ERROR TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -25073,6 +25094,7 @@
 
     CHIP_ERROR TestExposeTheSensorAgainToLight_6()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for Successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -25082,6 +25104,7 @@
 
     CHIP_ERROR TestWait1s_7()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 1000UL;
         return WaitForMs("alpha", value);
@@ -25089,9 +25112,11 @@
 
     CHIP_ERROR TestAfterAFewSecondsThReadsMeasuredValueAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIlluminanceMeasurement * cluster =
-            [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIlluminanceMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -25365,6 +25390,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -25372,10 +25398,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -25397,10 +25422,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -25422,10 +25446,9 @@
 
     CHIP_ERROR TestGivenLvlsf00ooEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -25442,10 +25465,9 @@
 
     CHIP_ERROR TestGivenLvlsf01ltEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -25462,10 +25484,9 @@
 
     CHIP_ERROR TestGivenLvlsf02fqEnsureFeaturemapHasTheCorrectBitSet_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -25482,10 +25503,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25511,10 +25531,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeStartUpCurrentLevelAndRemainingTimeInAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25534,10 +25553,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCurrentFrequencyMinFrequencyAndMinFrequencyInAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25558,10 +25576,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMinLevelInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25580,10 +25597,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMaxLevelInAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25602,10 +25618,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeOnOffTransitionTimeInAttributeList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25624,10 +25639,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeOnTransitionTimeInAttributeList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25646,10 +25660,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeOffTransitionTimeInAttributeList_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25668,10 +25681,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeDefaultMoveRateInAttributeList_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25690,10 +25702,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25719,10 +25730,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentLVLSF02CommandInAcceptedCommandList_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -25741,10 +25751,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -26063,6 +26072,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -26071,10 +26081,9 @@
 
     CHIP_ERROR TestReadsTheCurrentLevelAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26100,10 +26109,9 @@
 
     CHIP_ERROR TestReadsTheRemainingTimeAttribute_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRemainingTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26124,10 +26132,9 @@
 
     CHIP_ERROR TestReadsTheMinLevelAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26154,10 +26161,9 @@
 
     CHIP_ERROR TestReadsTheMinLevelAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26181,10 +26187,9 @@
 
     CHIP_ERROR TestReadsTheMaxLevelAttribute_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26212,10 +26217,9 @@
 
     CHIP_ERROR TestReadsTheMaxLevelAttribute_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26239,10 +26243,9 @@
 
     CHIP_ERROR TestStep4b4cReadsTheCurrentLevelAttribute_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26265,10 +26268,9 @@
 
     CHIP_ERROR TestStep4b4cReadsTheCurrentLevelAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26293,10 +26295,9 @@
 
     CHIP_ERROR TestReadsTheCurrentFrequencyAttribute_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26317,10 +26318,9 @@
 
     CHIP_ERROR TestReadsTheMinFrequencyAttribute_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26344,10 +26344,9 @@
 
     CHIP_ERROR TestReadsTheMaxFrequencyAttribute_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26370,10 +26369,9 @@
 
     CHIP_ERROR TestStep7b7cReadsTheCurrentFrequencyAttribute_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26393,10 +26391,9 @@
 
     CHIP_ERROR TestReadsTheOnOffTransitionTimeAttribute_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26416,10 +26413,9 @@
 
     CHIP_ERROR TestReadsTheOnLevelAttribute_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26442,10 +26438,9 @@
 
     CHIP_ERROR TestReadsTheOnLevelAttribute_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26470,10 +26465,9 @@
 
     CHIP_ERROR TestReadsTheOnTransitionTimeAttribute_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26496,10 +26490,9 @@
 
     CHIP_ERROR TestReadsTheOffTransitionTimeAttribute_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26522,10 +26515,9 @@
 
     CHIP_ERROR TestReadsTheDefaultMoveRateAttribute_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26548,10 +26540,9 @@
 
     CHIP_ERROR TestReadsTheOptionsAttribute_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26568,10 +26559,9 @@
 
     CHIP_ERROR TestReadsTheStartUpCurrentLevelAttribute_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26892,6 +26882,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -26900,10 +26891,9 @@
 
     CHIP_ERROR TestReadsTheOnOffTransitionTimeAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26926,10 +26916,9 @@
 
     CHIP_ERROR TestWritesTheOnOffTransitionTimeAttributeOnTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onOffTransitionTimeArgument;
@@ -26950,10 +26939,9 @@
 
     CHIP_ERROR TestReadsTheOnOffTransitionTimeAttributeFromTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -26979,10 +26967,9 @@
 
     CHIP_ERROR TestReadsTheOnLevelAttributeFromTheDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27008,10 +26995,9 @@
 
     CHIP_ERROR TestWritesTheOnLevelAttributeOnTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onLevelArgument;
@@ -27031,10 +27017,9 @@
 
     CHIP_ERROR TestReadsTheOnLevelAttributeFromTheDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27063,10 +27048,9 @@
 
     CHIP_ERROR TestReadsTheOnTransitionTimeAttributeFromTheDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27092,10 +27076,9 @@
 
     CHIP_ERROR TestWritesTheOnTransitionTimeAttributeOnTheDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onTransitionTimeArgument;
@@ -27116,10 +27099,9 @@
 
     CHIP_ERROR TestReadsTheOnTransitionTimeAttributeFromTheDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27148,10 +27130,9 @@
 
     CHIP_ERROR TestReadsTheOffTransitionTimeAttributeFromTheDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27177,10 +27158,9 @@
 
     CHIP_ERROR TestWritesTheOffTransitionTimeAttributeOnTheDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id offTransitionTimeArgument;
@@ -27201,10 +27181,9 @@
 
     CHIP_ERROR TestReadsTheOffTransitionTimeAttributeFromTheDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27233,10 +27212,9 @@
 
     CHIP_ERROR TestReadsTheDefaultMoveRateAttributeFromTheDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27262,10 +27240,9 @@
 
     CHIP_ERROR TestWritesTheDefaultMoveRateAttributeOnTheDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id defaultMoveRateArgument;
@@ -27286,10 +27263,9 @@
 
     CHIP_ERROR TestReadsTheDefaultMoveRateAttributeFromTheDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDefaultMoveRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27318,10 +27294,9 @@
 
     CHIP_ERROR TestReadsTheStartUpCurrentLevelAttributeFromTheDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27347,10 +27322,9 @@
 
     CHIP_ERROR TestWritesTheStartUpCurrentLevelAttributeOnTheDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id startUpCurrentLevelArgument;
@@ -27371,10 +27345,9 @@
 
     CHIP_ERROR TestReadsTheStartUpCurrentLevelAttributeFromTheDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStartUpCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -27402,10 +27375,9 @@
 
     CHIP_ERROR TestWritesBackDefaultValueOfOnOffTransitionTimeAttribute_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onOffTransitionTimeArgument;
@@ -27986,6 +27958,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -27993,8 +27966,9 @@
 
     CHIP_ERROR TestPreconditionSendOnCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -28010,8 +27984,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28032,10 +28007,9 @@
 
     CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onOffTransitionTimeArgument;
@@ -28057,10 +28031,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -28079,8 +28052,9 @@
 
     CHIP_ERROR TestThSendsOffCommandToDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -28096,10 +28070,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelWithOnOffCommandToDutWithLevel50AndTransitionTime0Immediate_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelWithOnOffParams alloc] init];
@@ -28123,8 +28096,9 @@
 
     CHIP_ERROR TestThReadsOnOffAttributeOnOffClusterFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28145,10 +28119,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28170,8 +28143,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -28187,10 +28161,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28215,10 +28188,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28241,10 +28213,9 @@
     CHIP_ERROR
     TestThSendsAMoveToLevelCommandToTheDutWithLevel200AndTransitionTime30030SThisMeansTheLevelShouldIncreaseBy150UnitsIn30sSo5UnitsS_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28268,6 +28239,7 @@
 
     CHIP_ERROR TestWait10000ms_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -28275,10 +28247,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28300,6 +28271,7 @@
 
     CHIP_ERROR TestWait10000ms_15()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -28307,10 +28279,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28332,6 +28303,7 @@
 
     CHIP_ERROR TestWait10000ms_17()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -28339,10 +28311,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28364,6 +28335,7 @@
 
     CHIP_ERROR TestWait5000ms_19()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -28371,10 +28343,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28396,10 +28367,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28421,10 +28391,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -28443,10 +28412,9 @@
 
     CHIP_ERROR TestThReadsOptionsAttribute_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28467,8 +28435,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -28484,10 +28453,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28509,10 +28477,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28534,8 +28501,9 @@
 
     CHIP_ERROR TestThSendsOffCommandToDut_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -28551,10 +28519,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28576,10 +28543,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28601,10 +28567,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28626,10 +28591,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28651,10 +28615,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28676,10 +28639,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28701,10 +28663,9 @@
 
     CHIP_ERROR TestThWrites1ToTheOptionsAttribute_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -28723,10 +28684,9 @@
 
     CHIP_ERROR TestThReadsOptionsAttribute_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOptionsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28747,8 +28707,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -28764,10 +28725,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28789,10 +28749,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_38()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28814,8 +28773,9 @@
 
     CHIP_ERROR TestThSendsOffCommandToDut_39()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -28831,10 +28791,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_40()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28856,10 +28815,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_41()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28881,10 +28839,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_42()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28906,10 +28863,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_43()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -28931,10 +28887,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToTheDutWith_44()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -28956,10 +28911,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_45()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29316,6 +29270,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -29323,8 +29278,9 @@
 
     CHIP_ERROR TestPreconditionSendOnCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -29340,8 +29296,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29362,10 +29319,9 @@
 
     CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onOffTransitionTimeArgument;
@@ -29387,10 +29343,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -29409,10 +29364,9 @@
 
     CHIP_ERROR TestThReadsTheMaxLevelAttributeFromTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29432,8 +29386,9 @@
 
     CHIP_ERROR TestThSendsOffCommandToDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -29449,10 +29404,9 @@
 
     CHIP_ERROR TestThSendsAMoveWithOnOffCommandToDutWithMoveMode0x00UpAndRate10UnitsS_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveWithOnOffParams alloc] init];
@@ -29476,8 +29430,9 @@
 
     CHIP_ERROR TestThReadsOnOffAttributeOnOffClusterFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29499,10 +29454,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29526,6 +29480,7 @@
 
     CHIP_ERROR TestWait5000ms_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -29533,10 +29488,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29558,8 +29512,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -29575,10 +29530,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -29603,10 +29557,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29628,10 +29581,9 @@
 
     CHIP_ERROR TestThSendsAMoveCommandToTheDutWithMoveMode0x00UpAndRate5UnitsS_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
@@ -29653,6 +29605,7 @@
 
     CHIP_ERROR TestWait10s_16()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -29660,10 +29613,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29685,6 +29637,7 @@
 
     CHIP_ERROR TestWait10s_18()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -29692,10 +29645,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29717,6 +29669,7 @@
 
     CHIP_ERROR TestWait10s_20()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -29724,10 +29677,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29749,6 +29701,7 @@
 
     CHIP_ERROR TestWait19s_22()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 19000UL;
         return WaitForMs("alpha", value);
@@ -29756,10 +29709,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -29781,8 +29733,9 @@
 
     CHIP_ERROR TestPreconditionSendOffCommand_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -29798,8 +29751,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30129,6 +30083,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -30136,8 +30091,9 @@
 
     CHIP_ERROR TestPreconditionSendOnCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -30153,8 +30109,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30175,10 +30132,9 @@
 
     CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onOffTransitionTimeArgument;
@@ -30200,10 +30156,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -30222,8 +30177,9 @@
 
     CHIP_ERROR TestThSendsOffCommandToDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -30239,10 +30195,9 @@
 
     CHIP_ERROR TestThSendsAStepWithOnOffCommandToDutWithStepMode0x00UpStepSize50AndTransitionTime0Immediate_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterStepWithOnOffParams alloc] init];
@@ -30267,8 +30222,9 @@
 
     CHIP_ERROR TestThReadsOnOffAttributeOnOffClusterFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30289,8 +30245,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -30306,10 +30263,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -30334,10 +30290,9 @@
 
     CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30359,10 +30314,9 @@
 
     CHIP_ERROR TestThSendsAStepCommandToTheDutWithStepMode0x00UpStepSize150AndTransitionTime300_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterStepParams alloc] init];
@@ -30387,6 +30341,7 @@
 
     CHIP_ERROR TestWait10s_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -30394,10 +30349,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30419,6 +30373,7 @@
 
     CHIP_ERROR TestWait10s_14()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -30426,10 +30381,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30451,6 +30405,7 @@
 
     CHIP_ERROR TestWait10s_16()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -30458,10 +30413,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30483,6 +30437,7 @@
 
     CHIP_ERROR TestWait5000ms_18()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -30490,10 +30445,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30515,10 +30469,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDutAfterDutHasFinishedTheTransition_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30540,8 +30493,9 @@
 
     CHIP_ERROR TestPreconditionSendOffCommand_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -30557,8 +30511,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30840,6 +30795,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -30847,10 +30803,9 @@
 
     CHIP_ERROR TestPreconditionWriteDefaultValueOfOnOffTransitionTimeAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onOffTransitionTimeArgument;
@@ -30872,10 +30827,9 @@
 
     CHIP_ERROR TestThWrites0ToTheOptionsAttribute_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id optionsArgument;
@@ -30894,8 +30848,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -30911,10 +30866,9 @@
 
     CHIP_ERROR TestThSendsAMoveToLevelCommandToDutWithLevel50AndTransitionTime0Immediate_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -30939,10 +30893,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -30964,10 +30917,9 @@
 
     CHIP_ERROR TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
@@ -30991,6 +30943,7 @@
 
     CHIP_ERROR TestWait5000ms_7()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -30998,10 +30951,9 @@
 
     CHIP_ERROR TestSendsStopCommandToDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterStopParams alloc] init];
@@ -31021,6 +30973,7 @@
 
     CHIP_ERROR TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_9()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -31030,10 +30983,9 @@
 
     CHIP_ERROR TestThReadsCurrentLevelAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31055,10 +31007,9 @@
 
     CHIP_ERROR TestThSendsAMoveCommandToTheDutWithTheMoveModeFieldSetTo0x00MoveUpAndTheRateFieldSetTo0x055UnitsS_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveParams alloc] init];
@@ -31082,6 +31033,7 @@
 
     CHIP_ERROR TestWait5000ms_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -31089,10 +31041,9 @@
 
     CHIP_ERROR TestThSendsAStopWithOnOffCommandToTheDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterStopWithOnOffParams alloc] init];
@@ -31112,6 +31063,7 @@
 
     CHIP_ERROR TestPhysicallyVerifyThatTheDeviceHasStoppedTransitioning_14()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -31121,10 +31073,9 @@
 
     CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31146,8 +31097,9 @@
 
     CHIP_ERROR TestPreconditionSendOffCommand_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -31163,8 +31115,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31297,6 +31250,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -31304,9 +31258,11 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(0)
+                                                                                          queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31328,9 +31284,11 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(0)
+                                                                                          queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31352,9 +31310,11 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(0)
+                                                                                          queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -31379,9 +31339,11 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(0)
+                                                                                          queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -31403,9 +31365,11 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLocalizationConfiguration * cluster =
-            [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLocalizationConfiguration alloc] initWithDevice:device
+                                                                                     endpointID:@(0)
+                                                                                          queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -31581,6 +31545,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -31588,10 +31553,9 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(0)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31613,10 +31577,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(0)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31638,10 +31601,9 @@
 
     CHIP_ERROR TestGivenLunitsf00tempEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(0)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31658,10 +31620,9 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(0)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -31684,10 +31645,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentLUNITSF00AttributeInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(0)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -31706,10 +31666,9 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(0)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -31731,10 +31690,9 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitLocalization * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device
-                                                                                               endpointID:@(0)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -31912,6 +31870,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -31919,9 +31878,11 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31943,9 +31904,11 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -31965,9 +31928,11 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -31991,9 +31956,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeActiveCalendarTypeInAttributeListFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32012,9 +31979,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeSupportedCalendarTypesInAttributeListFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32033,9 +32002,11 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32057,9 +32028,11 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTimeFormatLocalization * cluster =
-            [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTimeFormatLocalization alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32193,6 +32166,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -32200,10 +32174,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32225,10 +32198,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32250,10 +32222,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32280,10 +32251,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32306,10 +32276,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32480,6 +32449,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -32487,10 +32457,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32512,10 +32481,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32537,10 +32505,9 @@
 
     CHIP_ERROR TestGivenKeypadinputsnvFeatureMapBitMaskIsSetOrNot_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32557,10 +32524,9 @@
 
     CHIP_ERROR TestGivenKeypadinputslkFeatureMapBitMaskIsSetOrNot_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32577,10 +32543,9 @@
 
     CHIP_ERROR TestGivenKeypadinputsnkFeatureMapBitMaskIsSetOrNot_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32597,10 +32562,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32623,10 +32587,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32645,10 +32608,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32816,6 +32778,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -32823,10 +32786,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32848,10 +32812,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32873,10 +32838,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -32898,10 +32864,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32924,10 +32891,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCatalogListInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32946,10 +32914,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCurrentAppInAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32968,10 +32937,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -32992,10 +32962,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33163,6 +33134,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -33170,10 +33142,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -33195,10 +33166,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -33220,10 +33190,9 @@
 
     CHIP_ERROR TestGivenMediainputsnuEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -33240,10 +33209,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33266,10 +33234,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeInputListInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33288,10 +33255,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCurrentInputInAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33310,10 +33276,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33335,10 +33300,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33483,6 +33447,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -33490,10 +33455,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -33515,10 +33479,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -33540,10 +33503,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33566,10 +33528,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMACAddressInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33588,10 +33549,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33613,10 +33573,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33851,6 +33810,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -33858,10 +33818,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -33883,10 +33842,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -33908,10 +33866,9 @@
 
     CHIP_ERROR TestGivenChannelsclEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -33928,10 +33885,9 @@
 
     CHIP_ERROR TestGivenChannelsliEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -33948,10 +33904,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33974,10 +33929,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeChannelListAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -33996,10 +33950,9 @@
 
     CHIP_ERROR TestReadingOptionalAttributeLineupInAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34018,10 +33971,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCurrentChannelAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34040,10 +33992,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandChangeChannelInAcceptedCommandList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34062,10 +34013,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandChangeChannelByNumberInAcceptedCommandList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34084,10 +34034,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandSkipChannelInAcceptedCommandList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34106,10 +34055,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34131,10 +34079,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34445,6 +34392,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -34452,10 +34400,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -34477,10 +34424,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -34502,10 +34448,9 @@
 
     CHIP_ERROR TestGivenMediaplaybacksasEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -34522,10 +34467,9 @@
 
     CHIP_ERROR TestGivenMediaplaybacksvsEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -34542,10 +34486,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34569,10 +34512,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeStartTimeInAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34591,10 +34533,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeDurationInAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34613,10 +34554,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeSampledPositionInAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34635,10 +34575,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributePlaybackSpeedInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34657,10 +34596,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeSeekRangeEndInAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34679,10 +34617,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeSeekRangeStartInAttributeList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34701,10 +34638,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34725,10 +34661,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandStartOverInAcceptedCommandList_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34747,10 +34682,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandPreviousInAcceptedCommandList_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34769,10 +34703,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandNextInAcceptedCommandList_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34791,10 +34724,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandRewindInAcceptedCommandList_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34813,10 +34745,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandFastForwardInAcceptedCommandList_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34835,10 +34766,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandSkipForwardInAcceptedCommandList_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34857,10 +34787,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandSkipBackwardInAcceptedCommandList_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34879,10 +34808,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandSeekInAcceptedCommandList_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -34901,10 +34829,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35035,6 +34962,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -35042,10 +34970,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -35067,10 +34994,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -35090,10 +35016,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35118,10 +35043,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35140,10 +35064,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35288,6 +35211,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -35295,10 +35219,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -35320,10 +35243,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -35345,10 +35267,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35372,10 +35293,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeCurrentTargetInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35394,10 +35314,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35416,10 +35335,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35653,6 +35571,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -35660,10 +35579,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -35685,10 +35603,9 @@
 
     CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -35710,10 +35627,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35741,10 +35657,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeVendorNameInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35763,10 +35678,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeVendorIDInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35785,10 +35699,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeProductIDInAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35807,10 +35720,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -35832,10 +35744,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36037,6 +35948,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -36044,10 +35956,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -36069,10 +35980,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -36094,10 +36004,9 @@
 
     CHIP_ERROR TestGivenContentlauncherscsEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -36114,10 +36023,9 @@
 
     CHIP_ERROR TestGivenContentlaunchersupEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -36134,10 +36042,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36160,10 +36067,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeAcceptHeaderAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36182,10 +36088,9 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeSupportedStreamingProtocolsAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36204,10 +36109,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandLaunchContentInAcceptedCommandListAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36226,10 +36130,9 @@
 
     CHIP_ERROR TestReadTheOptionalCommandLaunchURLInAcceptedCommandListAttribute_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36248,10 +36151,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36382,6 +36284,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -36389,10 +36292,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(3)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -36414,10 +36316,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(3)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -36439,10 +36340,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(3)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36465,10 +36365,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(3)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36489,10 +36388,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(3)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -36599,6 +36497,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -36606,10 +36505,9 @@
 
     CHIP_ERROR TestThSendsSleepCommandToDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster sleepWithCompletion:^(NSError * _Nullable err) {
@@ -36724,6 +36622,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -36731,10 +36630,9 @@
 
     CHIP_ERROR TestThSendsCecSettingsKeys0x0AToDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -36758,10 +36656,9 @@
 
     CHIP_ERROR TestThSendsCecHomeKeys0x09ToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -36961,6 +36858,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -36968,10 +36866,9 @@
 
     CHIP_ERROR TestSendNumbers1_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -36995,10 +36892,9 @@
 
     CHIP_ERROR TestSendNumbers2_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -37022,10 +36918,9 @@
 
     CHIP_ERROR TestSendNumbers3_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -37049,10 +36944,9 @@
 
     CHIP_ERROR TestSendNumbers4_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -37076,10 +36970,9 @@
 
     CHIP_ERROR TestSendNumbers5_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -37103,10 +36996,9 @@
 
     CHIP_ERROR TestSendNumbers6_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -37130,10 +37022,9 @@
 
     CHIP_ERROR TestSendNumbers7_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -37157,10 +37048,9 @@
 
     CHIP_ERROR TestSendNumbers8_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -37184,10 +37074,9 @@
 
     CHIP_ERROR TestSendNumbers9_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -37301,6 +37190,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -37309,10 +37199,11 @@
     CHIP_ERROR
     TestThReadsCatalogListAttributeFromTheDutAndWhereEachEntryInTheListIsACsaIssuedVendorIdOfTypeUnsigned16BitIntegerRangingBetween065536ForTheCatalog_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCatalogListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -37421,6 +37312,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -37429,10 +37321,11 @@
     CHIP_ERROR
     TestThReadsCurrentAppAttributeFromTheDutAndVerifyTheInFocusApplicationAttributesWhichShouldIncludeTheDisplayApplicationIDtypeuint16CatalogVendorIDtypestringOrNullIfThereIsNoCurrentInFocusApplication_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentAppWithCompletion:^(
@@ -37543,6 +37436,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -37551,10 +37445,9 @@
     CHIP_ERROR
     TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -37686,6 +37579,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -37694,10 +37588,9 @@
     CHIP_ERROR
     TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -37716,10 +37609,9 @@
 
     CHIP_ERROR TestSelectInputCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaInputClusterSelectInputParams alloc] init];
@@ -37738,10 +37630,9 @@
 
     CHIP_ERROR TestReadCurrentInputList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentInputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -37875,6 +37766,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -37883,10 +37775,9 @@
     CHIP_ERROR
     TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyListOfAvailableInputsSupportedByTheDeviceIsProvidedWhereEachEntryInTheListContainsAnIndextypeuint8InputTypeInputTypeEnumsNameTypeStringsAndDescriptionTypeString_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -37905,10 +37796,9 @@
 
     CHIP_ERROR TestShowInputStatusCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster showInputStatusWithCompletion:^(NSError * _Nullable err) {
@@ -37924,10 +37814,9 @@
 
     CHIP_ERROR TestHideInputStatusCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster hideInputStatusWithCompletion:^(NSError * _Nullable err) {
@@ -38055,6 +37944,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -38062,10 +37952,9 @@
 
     CHIP_ERROR TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -38081,10 +37970,9 @@
 
     CHIP_ERROR TestRenameInputCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaInputClusterRenameInputParams alloc] init];
@@ -38104,6 +37992,7 @@
 
     CHIP_ERROR TestThReadsTheInputListAttributeFromTheDutToShowListOfInputsAvailable_3()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -38205,6 +38094,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -38213,10 +38103,9 @@
     CHIP_ERROR
     TestThReadsTheChannelListAttributeFromTheDutToShowListOfInputsAvailableAndVerifyThatTheResponseContainsAListOfTheKnownTvChannelsEachListElementShouldConsistOfTheFollowingMajorNumberUnsigned16BitIntegerMandatoryMinorNumberUnsigned16BitIntegerMandatoryNameStringOptionalCallSignStringOptionalAffiliateCallSignStringOptional_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -38361,6 +38250,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -38368,10 +38258,9 @@
 
     CHIP_ERROR TestReadsTheChannelListAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -38388,10 +38277,9 @@
 
     CHIP_ERROR TestThSendsAChangeChannelByNumberCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRChannelClusterChangeChannelByNumberParams alloc] init];
@@ -38413,6 +38301,7 @@
 
     CHIP_ERROR TestVerifyThatTheChannelHasChangedOnTheDevice_3()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please enter 'y' if channel has changed on the devicegarbage: not in length on purpose", 53);
@@ -38423,10 +38312,9 @@
 
     CHIP_ERROR TestReadsTheCurrentChannelAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -38597,6 +38485,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -38605,10 +38494,9 @@
     CHIP_ERROR
     TestThReadsTheLineupAttributeFromTheDutToShowListOfInputsAvailableAndVerifyThatTheResponseContainsALineupInfoObject_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLineupWithCompletion:^(MTRChannelClusterLineupInfo * _Nullable value, NSError * _Nullable err) {
@@ -38626,10 +38514,9 @@
 
     CHIP_ERROR TestReadsTheChannelListAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -38646,10 +38533,9 @@
 
     CHIP_ERROR TestReadsTheCurrentChannelAttributeFromTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -38671,10 +38557,9 @@
 
     CHIP_ERROR TestSendsASkipChannelCommandToTheDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRChannelClusterSkipChannelParams alloc] init];
@@ -38693,6 +38578,7 @@
 
     CHIP_ERROR TestVerifyThatTheChannelHasChangedOnTheDevice_5()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please enter 'y' if channel has changed on the devicegarbage: not in length on purpose", 53);
@@ -38703,10 +38589,9 @@
 
     CHIP_ERROR TestReadsTheCurrentChannelAttributeFromTheDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -38931,6 +38816,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -38938,10 +38824,9 @@
 
     CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -38962,10 +38847,9 @@
 
     CHIP_ERROR TestReadsTheCurrentStateAttribute_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -38986,10 +38870,9 @@
 
     CHIP_ERROR TestSendsAPlayCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -39010,6 +38893,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaStateIsPlaying_4()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
         value.expectedValue.Emplace();
@@ -39019,10 +38903,9 @@
 
     CHIP_ERROR TestReadsTheCurrentStateAttribute_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -39043,10 +38926,9 @@
 
     CHIP_ERROR TestSendsAPauseCommand_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -39067,6 +38949,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaIsPaused_7()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' if media state is pausedgarbage: not in length on purpose", 41);
         value.expectedValue.Emplace();
@@ -39076,10 +38959,9 @@
 
     CHIP_ERROR TestReadsTheCurrentStateAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -39100,10 +38982,9 @@
 
     CHIP_ERROR TestSendsAStopCommand_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster stopPlaybackWithCompletion:^(
@@ -39125,6 +39006,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaIsStoped_10()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' if media state is stopedgarbage: not in length on purpose", 41);
         value.expectedValue.Emplace();
@@ -39134,10 +39016,9 @@
 
     CHIP_ERROR TestReadsTheCurrentStateAttribute_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -39423,6 +39304,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -39430,10 +39312,9 @@
 
     CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -39454,10 +39335,9 @@
 
     CHIP_ERROR TestReadsTheCurrentStateAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -39478,10 +39358,9 @@
 
     CHIP_ERROR TestSendsAPlayCommandToTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -39502,6 +39381,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaStateIsPlaying_4()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
         value.expectedValue.Emplace();
@@ -39511,10 +39391,9 @@
 
     CHIP_ERROR TestReadsTheCurrentStateAttribute_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -39535,10 +39414,9 @@
 
     CHIP_ERROR TestSendsAStartOverCommandToTheDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -39560,6 +39438,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaIsStartedOver_7()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' if media is started overgarbage: not in length on purpose", 41);
         value.expectedValue.Emplace();
@@ -39569,10 +39448,9 @@
 
     CHIP_ERROR TestSendsANextCommandToTheDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster nextWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -39593,6 +39471,7 @@
 
     CHIP_ERROR TestVerifyThatTheNextMediaItemInTheQueueHasBeenLoaded_9()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>(
             "Please enter 'y' if media item in the queue has been loadedgarbage: not in length on purpose", 59);
@@ -39603,10 +39482,9 @@
 
     CHIP_ERROR TestSendsAPreviousCommandToTheDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -39628,6 +39506,7 @@
 
     CHIP_ERROR TestVerifyThatThePreviousMediaItemInTheQueueHasBeenLoaded_11()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>(
             "Please enter 'y' if previous media item in the queue has been loadedgarbage: not in length on purpose", 68);
@@ -39638,10 +39517,9 @@
 
     CHIP_ERROR TestSendsASkipForwardCommandToTheDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaPlaybackClusterSkipForwardParams alloc] init];
@@ -39666,6 +39544,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaHasSkippedForward10Seconds_13()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>(
             "Please enter 'y' if media has skipped forward 10 secondsgarbage: not in length on purpose", 56);
@@ -39676,10 +39555,9 @@
 
     CHIP_ERROR TestReadsTheSampledPositionAttributeFromTheDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSampledPositionWithCompletion:^(
@@ -39701,10 +39579,9 @@
 
     CHIP_ERROR TestSendsASkipBackwardCommandToTheDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaPlaybackClusterSkipBackwardParams alloc] init];
@@ -39729,6 +39606,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaHasSkippedBackward10Seconds_16()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>(
             "Please enter 'y' if media has skipped backward 10 secondsgarbage: not in length on purpose", 57);
@@ -39739,10 +39617,9 @@
 
     CHIP_ERROR TestReadsTheSampledPositionAttributeFromTheDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSampledPositionWithCompletion:^(
@@ -39956,6 +39833,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -39963,10 +39841,9 @@
 
     CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -39987,10 +39864,9 @@
 
     CHIP_ERROR TestSendsASeekCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
@@ -40014,6 +39890,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaHasMovedTo10SecondsFromTheStartingPoint_3()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>(
             "Please enter 'y' if media has moved to 10 seconds from the starting pointgarbage: not in length on purpose", 73);
@@ -40024,10 +39901,9 @@
 
     CHIP_ERROR TestReadsTheSampledPositionAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSampledPositionWithCompletion:^(
@@ -40049,6 +39925,7 @@
 
     CHIP_ERROR TestThReadsTheStartTimeAttributeFromTheDut_5()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -40058,6 +39935,7 @@
 
     CHIP_ERROR TestThReadsTheSeekRangeEndAttributeFromTheDut_6()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -40067,6 +39945,7 @@
 
     CHIP_ERROR TestThReadsTheSeekRangeStartAttributeFromTheDut_7()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -40076,6 +39955,7 @@
 
     CHIP_ERROR TestThReadsTheDurationAttributeFromTheDut_8()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -40085,10 +39965,9 @@
 
     CHIP_ERROR TestSendsASeekCommandPositionValueBeyondTheFurthestValidPosition_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
@@ -40113,6 +39992,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaHasNotMoved_10()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' if media has not movedgarbage: not in length on purpose", 39);
         value.expectedValue.Emplace();
@@ -40444,6 +40324,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -40451,10 +40332,9 @@
 
     CHIP_ERROR TestPreconditionMediaContentInAPausedStateAtTheBeginningOfTheContent_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -40475,10 +40355,9 @@
 
     CHIP_ERROR TestReadsTheCurrentStateAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -40499,10 +40378,9 @@
 
     CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -40523,10 +40401,9 @@
 
     CHIP_ERROR TestSendsAFastForwardCommand_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -40548,6 +40425,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaStateIsPlaying_5()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' if media state is playinggarbage: not in length on purpose", 42);
         value.expectedValue.Emplace();
@@ -40557,10 +40435,9 @@
 
     CHIP_ERROR TestReadsTheCurrentStateAttribute_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -40581,10 +40458,9 @@
 
     CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -40605,10 +40481,9 @@
 
     CHIP_ERROR TestSendsAFastForwardCommand_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -40630,6 +40505,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaPlaySpeedHasIncreased_9()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please enter 'y' if media play speed has increased.garbage: not in length on purpose", 51);
@@ -40640,10 +40516,9 @@
 
     CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -40664,10 +40539,9 @@
 
     CHIP_ERROR TestSendsARewindCommandToTheDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster rewindWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -40688,6 +40562,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaPlayHasReversedDirection_12()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please enter 'y' if media play has reversed directiongarbage: not in length on purpose", 53);
@@ -40698,10 +40573,9 @@
 
     CHIP_ERROR TestReadsTheCurrentStateAttribute_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -40722,6 +40596,7 @@
 
     CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_14()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please enter 'y' if PlaybackSpeed value is -1garbage: not in length on purpose", 45);
@@ -40732,10 +40607,9 @@
 
     CHIP_ERROR TestSendsARewindCommandToTheDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster rewindWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -40756,6 +40630,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaPlaySpeedHasIncreasedInTheReverseDirection_16()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>(
             "Please enter 'y' if media play speed has increased in the reverse directiongarbage: not in length on purpose", 75);
@@ -40766,6 +40641,7 @@
 
     CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_17()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please enter 'y' if PlaybackSpeed value is -2garbage: not in length on purpose", 45);
@@ -40776,10 +40652,9 @@
 
     CHIP_ERROR TestSendsAPlayCommand_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -40800,6 +40675,7 @@
 
     CHIP_ERROR TestVerifyThatTheMediaIsHasResumedPlayingForwardAtTheDefaultSpeed_19()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>(
             "Please enter 'y' if media is has resumed playing forward at the default speedgarbage: not in length on purpose", 77);
@@ -40810,10 +40686,9 @@
 
     CHIP_ERROR TestReadsThePlaybackSpeedAttributeFromTheDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(1)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -40834,6 +40709,7 @@
 
     CHIP_ERROR TestSendsConsecutiveFastForwardCommands_21()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -40843,6 +40719,7 @@
 
     CHIP_ERROR TestSendsConsecutiveRewindCommands_22()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -40964,6 +40841,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -40971,10 +40849,9 @@
 
     CHIP_ERROR TestReadsTheOutputListAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -40991,10 +40868,9 @@
 
     CHIP_ERROR TestSendsASelectAudioOutputCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAudioOutputClusterSelectOutputParams alloc] init];
@@ -41013,10 +40889,9 @@
 
     CHIP_ERROR TestReadsTheCurrentOutputAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentOutputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -41151,6 +41026,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -41159,10 +41035,9 @@
 
     CHIP_ERROR TestReadsTheOutputListAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -41183,10 +41058,9 @@
 
     CHIP_ERROR TestSendsARenameOutputCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAudioOutputClusterRenameOutputParams alloc] init];
@@ -41206,6 +41080,7 @@
 
     CHIP_ERROR TestReadsTheOutputListAttributeFromTheDutVerifyThatTheOutputAtTheIndexProvidedInStep2HasTheNameCertTest_3()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -41338,6 +41213,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -41345,10 +41221,9 @@
 
     CHIP_ERROR TestReadsTheCurrentTargetAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -41369,10 +41244,9 @@
 
     CHIP_ERROR TestReadsTheTargetListAttribute_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -41393,10 +41267,9 @@
 
     CHIP_ERROR TestSendsANavigateTargetCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRTargetNavigatorClusterNavigateTargetParams alloc] init];
@@ -41417,10 +41290,9 @@
 
     CHIP_ERROR TestReadsTheCurrentTargetAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -41606,6 +41478,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -41613,10 +41486,9 @@
 
     CHIP_ERROR TestReadsTheVendorNameAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeVendorNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -41634,10 +41506,9 @@
 
     CHIP_ERROR TestReadsTheVendorIDAttribute_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeVendorIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -41654,10 +41525,9 @@
 
     CHIP_ERROR TestReadsTheApplicationNameAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeApplicationNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -41675,10 +41545,9 @@
 
     CHIP_ERROR TestReadsTheProductIDAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeProductIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -41698,10 +41567,9 @@
 
     CHIP_ERROR TestReadsTheApplicationAttribute_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeApplicationWithCompletion:^(
@@ -41719,10 +41587,9 @@
 
     CHIP_ERROR TestReadsTheStatusAttribute_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -41741,10 +41608,9 @@
 
     CHIP_ERROR TestReadsTheApplicationVersionAttribute_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeApplicationVersionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -41762,10 +41628,9 @@
 
     CHIP_ERROR TestReadsTheAllowedVendorListAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAllowedVendorListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -41881,6 +41746,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -41888,10 +41754,9 @@
 
     CHIP_ERROR TestThReadsTheAcceptHeaderAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptHeaderWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -41908,10 +41773,9 @@
 
     CHIP_ERROR TestThReadsTheSupportedStreamingProtocolsAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSupportedStreamingProtocolsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -42079,6 +41943,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -42086,10 +41951,9 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -42111,10 +41975,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -42136,10 +41999,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -42161,10 +42023,9 @@
 
     CHIP_ERROR TestThReadsTheAttributeListAttributeFromTheDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -42191,10 +42052,9 @@
 
     CHIP_ERROR TestThReadsTheOptionalAttributeStartUpModeInAttributeListFromTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -42213,10 +42073,9 @@
 
     CHIP_ERROR TestThReadsTheOptionalAttributeOnModeInAttributeListFromTheDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -42235,10 +42094,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -42257,10 +42115,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -42445,6 +42302,7 @@
 
     CHIP_ERROR TestCreateOtaImage_0()
     {
+
         chip::app::Clusters::SystemCommands::Commands::CreateOtaImage::Type value;
         value.otaImageFilePath
             = mOtaImageFilePath.HasValue() ? mOtaImageFilePath.Value() : chip::Span<const char>("/tmp/otaImage", 13);
@@ -42457,6 +42315,7 @@
 
     CHIP_ERROR TestStartTheProviderWithAnImage_1()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("chip-ota-provider-appgarbage: not in length on purpose", 21);
@@ -42474,6 +42333,7 @@
 
     CHIP_ERROR TestCommissionTheProviderFromAlpha_2()
     {
+
         chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
         value.nodeId = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
         value.payload
@@ -42483,6 +42343,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedProviderToBeRetrievedForAlpha_3()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mProviderNodeId.HasValue() ? mProviderNodeId.Value() : 12648430ULL;
         return WaitForCommissionee("alpha", value);
@@ -42490,10 +42351,9 @@
 
     CHIP_ERROR TestInstallAclForQueryImage_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -42527,7 +42387,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Install ACL for QueryImage Error: %@", err);
 
@@ -42541,12 +42401,14 @@
 
     CHIP_ERROR TestStopTheRequestor_5()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
         return Stop("alpha", value);
     }
 
     CHIP_ERROR TestStartTheRequestorWithAnOtaDownloadPath_6()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         value.otaDownloadPath.Emplace();
         value.otaDownloadPath.Value() = mDownloadImageFilePath.HasValue() ? mDownloadImageFilePath.Value()
@@ -42556,6 +42418,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedRequestorToBeRetrievedForAlpha_7()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mRequestorNodeId.HasValue() ? mRequestorNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -42563,12 +42426,14 @@
 
     CHIP_ERROR TestSendAnAnnounceOtaProviderCommandToTheRequestor_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOtaSoftwareUpdateRequestor * cluster =
-            [[MTRBaseClusterOtaSoftwareUpdateRequestor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOTASoftwareUpdateRequestor alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        __auto_type * params = [[MTROtaSoftwareUpdateRequestorClusterAnnounceOtaProviderParams alloc] init];
+        __auto_type * params = [[MTROTASoftwareUpdateRequestorClusterAnnounceOtaProviderParams alloc] init];
         params.providerNodeId = mProviderNodeId.HasValue() ? [NSNumber numberWithUnsignedLongLong:mProviderNodeId.Value()]
                                                            : [NSNumber numberWithUnsignedLongLong:12648430ULL];
         params.vendorId = [NSNumber numberWithUnsignedShort:0U];
@@ -42589,6 +42454,7 @@
 
     CHIP_ERROR TestWaitForTransferCompleteMessage_9()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMessage::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
@@ -42598,6 +42464,7 @@
 
     CHIP_ERROR TestCompareOriginalFileToDownloadedFile_10()
     {
+
         chip::app::Clusters::SystemCommands::Commands::CompareFiles::Type value;
         value.file1 = mRawImageFilePath.HasValue() ? mRawImageFilePath.Value() : chip::Span<const char>("/tmp/rawImage", 13);
         value.file2 = mDownloadImageFilePath.HasValue() ? mDownloadImageFilePath.Value()
@@ -42719,6 +42586,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -42726,10 +42594,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -42751,10 +42618,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -42776,10 +42642,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -42805,10 +42670,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -42830,10 +42694,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -43068,6 +42931,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -43075,10 +42939,9 @@
 
     CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancy_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOccupancyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43098,10 +42961,9 @@
 
     CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancySensorType_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOccupancySensorTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43121,10 +42983,9 @@
 
     CHIP_ERROR TestReadsMandatoryAttributeConstrainsOccupancySensorTypeBitmap_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOccupancySensorTypeBitmapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43144,13 +43005,12 @@
 
     CHIP_ERROR TestReadsOptionalAttributePIROccupiedToUnoccupiedDelay_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        [cluster readAttributePirOccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
+        [cluster readAttributePIROccupiedToUnoccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
             NSLog(@"Reads optional attribute: PIROccupiedToUnoccupiedDelay Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
@@ -43167,13 +43027,12 @@
 
     CHIP_ERROR TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedDelay_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        [cluster readAttributePirUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
+        [cluster readAttributePIRUnoccupiedToOccupiedDelayWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
             NSLog(@"Reads optional attribute constrains: PIRUnoccupiedToOccupiedDelay Error: %@", err);
 
             VerifyOrReturn(CheckValue("status", err ? err.code : 0, 0));
@@ -43190,13 +43049,12 @@
 
     CHIP_ERROR TestReadsOptionalAttributeConstrainsPIRUnoccupiedToOccupiedThreshold_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        [cluster readAttributePirUnoccupiedToOccupiedThresholdWithCompletion:^(
+        [cluster readAttributePIRUnoccupiedToOccupiedThresholdWithCompletion:^(
             NSNumber * _Nullable value, NSError * _Nullable err) {
             NSLog(@"Reads optional attribute constrains: PIRUnoccupiedToOccupiedThreshold Error: %@", err);
 
@@ -43214,10 +43072,9 @@
 
     CHIP_ERROR TestReadOptionalAttributeUltrasonicOccupiedToUnoccupiedDelay_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -43240,10 +43097,9 @@
 
     CHIP_ERROR TestReadAttributeUltrasonicUnoccupiedToOccupiedDelay_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -43266,10 +43122,9 @@
 
     CHIP_ERROR TestReadAttributeUltrasonicUnoccupiedToOccupiedThreshold_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeUltrasonicUnoccupiedToOccupiedThresholdWithCompletion:^(
@@ -43292,10 +43147,9 @@
 
     CHIP_ERROR TestReadsOptionalAttributeConstrainsPhysicalContactOccupiedToUnoccupiedDelay_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePhysicalContactOccupiedToUnoccupiedDelayWithCompletion:^(
@@ -43318,10 +43172,9 @@
 
     CHIP_ERROR TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedDelay_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePhysicalContactUnoccupiedToOccupiedDelayWithCompletion:^(
@@ -43344,10 +43197,9 @@
 
     CHIP_ERROR TestReadsOptionalAttributeConstrainsPhysicalContactUnoccupiedToOccupiedThreshold_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOccupancySensing * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device
-                                                                                               endpointID:@(1)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOccupancySensing alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePhysicalContactUnoccupiedToOccupiedThresholdWithCompletion:^(
@@ -43520,6 +43372,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -43527,8 +43380,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43550,8 +43404,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43573,8 +43428,9 @@
 
     CHIP_ERROR TestGivenOosf00ltEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43591,8 +43447,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -43616,8 +43473,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentOOSF00AttributeInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -43639,8 +43497,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -43661,8 +43520,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentOOSF00CommandsInAcceptedCommandList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -43683,8 +43543,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -43838,6 +43699,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -43845,8 +43707,9 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeOnOff_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43863,8 +43726,9 @@
 
     CHIP_ERROR TestReadLtAttributeGlobalSceneControl_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGlobalSceneControlWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43881,8 +43745,9 @@
 
     CHIP_ERROR TestReadLtAttributeOnTime_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43902,8 +43767,9 @@
 
     CHIP_ERROR TestReadLtAttributeOffWaitTime_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOffWaitTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -43923,8 +43789,9 @@
 
     CHIP_ERROR TestReadLtAttributeStartUpOnOff_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStartUpOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44256,6 +44123,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -44263,8 +44131,9 @@
 
     CHIP_ERROR TestSendOffCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -44280,8 +44149,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44302,8 +44172,9 @@
 
     CHIP_ERROR TestSendOnCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -44319,8 +44190,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44341,8 +44213,9 @@
 
     CHIP_ERROR TestSendOnCommand_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -44358,8 +44231,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44380,8 +44254,9 @@
 
     CHIP_ERROR TestSendOffCommand_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -44397,8 +44272,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44419,8 +44295,9 @@
 
     CHIP_ERROR TestSendOffCommand_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -44436,8 +44313,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44458,8 +44336,9 @@
 
     CHIP_ERROR TestSendToggleCommand_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster toggleWithCompletion:^(NSError * _Nullable err) {
@@ -44475,6 +44354,7 @@
 
     CHIP_ERROR TestWait1000ms_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 1000UL;
         return WaitForMs("alpha", value);
@@ -44482,8 +44362,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterToggleCommand_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44504,8 +44385,9 @@
 
     CHIP_ERROR TestSendToggleCommand_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster toggleWithCompletion:^(NSError * _Nullable err) {
@@ -44521,6 +44403,7 @@
 
     CHIP_ERROR TestWait1000ms_15()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 1000UL;
         return WaitForMs("alpha", value);
@@ -44528,8 +44411,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterToggleCommand_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44550,6 +44434,7 @@
 
     CHIP_ERROR TestOperateOnDeviceToSetOnOffAttributeManuallyToOn_17()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -44559,8 +44444,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44581,6 +44467,7 @@
 
     CHIP_ERROR TestOperateOnDeviceToSetOnOffAttributeManuallyToOff_19()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -44590,8 +44477,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -44612,8 +44500,9 @@
 
     CHIP_ERROR TestResetOffCommand_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -44629,8 +44518,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45034,6 +44924,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -45041,8 +44932,9 @@
 
     CHIP_ERROR TestThSendsOnCommandToDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -45058,8 +44950,9 @@
 
     CHIP_ERROR TestThWritesAValueOf0ToStartUpOnOffAttributeOfDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id startUpOnOffArgument;
@@ -45078,12 +44971,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_3()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_4()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -45094,6 +44989,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_5()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -45101,8 +44997,9 @@
 
     CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45123,8 +45020,9 @@
 
     CHIP_ERROR TestThWritesAValueOf1ToStartUpOnOffAttributeOfDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id startUpOnOffArgument;
@@ -45143,12 +45041,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_8()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_9()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -45159,6 +45059,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -45166,8 +45067,9 @@
 
     CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45188,8 +45090,9 @@
 
     CHIP_ERROR TestThWritesAValueOf2ToStartUpOnOffAttributeOfDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id startUpOnOffArgument;
@@ -45208,12 +45111,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_13()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_14()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -45224,6 +45129,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_15()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -45231,8 +45137,9 @@
 
     CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45253,12 +45160,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_17()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_18()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -45269,6 +45178,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_19()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -45276,8 +45186,9 @@
 
     CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45298,8 +45209,9 @@
 
     CHIP_ERROR TestThWritesNullToStartUpOnOffAttributeOfDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id startUpOnOffArgument;
@@ -45318,12 +45230,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_22()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_23()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -45334,6 +45248,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_24()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -45341,8 +45256,9 @@
 
     CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45363,8 +45279,9 @@
 
     CHIP_ERROR TestThSendsOffCommandToDut_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -45380,12 +45297,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_27()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_28()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -45396,6 +45315,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_29()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -45403,8 +45323,9 @@
 
     CHIP_ERROR TestThReadsTheOnOffAttributeFromTheDut_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45632,6 +45553,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -45639,10 +45561,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45664,10 +45585,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45689,10 +45609,9 @@
 
     CHIP_ERROR TestGivenPssf00wiredEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45709,10 +45628,9 @@
 
     CHIP_ERROR TestGivenPssf01batEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45729,10 +45647,9 @@
 
     CHIP_ERROR TestGivenPssf02rechgEnsureFeaturemapHasTheCorrectBitSet_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45749,10 +45666,9 @@
 
     CHIP_ERROR TestGivenPssf03replcEnsureFeaturemapHasTheCorrectBitSet_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -45769,10 +45685,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -45798,10 +45713,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentPSSF00WiredAttributeInAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -45820,10 +45734,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentPSSF01BatAttributeInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -45844,10 +45757,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentPSSF02RechgAttributeInAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -45867,10 +45779,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentPSSF03ReplcAttributeInAttributeList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -45890,10 +45801,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -45915,10 +45825,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -46364,6 +46273,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -46371,10 +46281,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsStatusAttributeFromServerDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46394,10 +46303,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsOrderAttributeFromServerDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOrderWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46417,10 +46325,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsDescriptionAttributeFromServerDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -46437,10 +46344,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsWiredAssessedInputVoltageAttribueFromServerDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWiredAssessedInputVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46464,10 +46370,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsWiredAssessedInputFrequencyAttributeFromServerDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWiredAssessedInputFrequencyWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46491,10 +46396,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsWiredCurrentTypeAttributeFromServerDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWiredCurrentTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46514,10 +46418,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsWiredAssessedCurrentAttributeFromServerDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWiredAssessedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46540,10 +46443,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsWiredNominalVoltageFromServerDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWiredNominalVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46563,10 +46465,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsWiredMaximumCurrentFromServerDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWiredMaximumCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46586,10 +46487,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsWiredPresentFromServerDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWiredPresentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46606,10 +46506,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsActiveWiredFaultsFromServerDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeActiveWiredFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -46627,10 +46526,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatVoltageFromServerDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatVoltageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46653,10 +46551,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatPercentRemainingFromServerDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatPercentRemainingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46679,10 +46576,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatTimeRemainingFromServerDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatTimeRemainingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46705,10 +46601,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatChargeLevelFromServerDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatChargeLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46728,10 +46623,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatReplacementNeededFromServerDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatReplacementNeededWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46748,10 +46642,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatReplaceabilityFromServerDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatReplaceabilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46771,10 +46664,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatPresentFromServerDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatPresentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46791,10 +46683,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsActiveBatFaultsFromServerDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeActiveBatFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -46812,10 +46703,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatReplacementDescriptionFromServerDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatReplacementDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -46833,10 +46723,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatCommonDesignationFromServerDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatCommonDesignationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46856,10 +46745,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatANSIDesignationFromServerDut_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatANSIDesignationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -46877,10 +46765,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatIECDesignationFromServerDut_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatIECDesignationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -46898,10 +46785,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatApprovedChemistryFromServerDut_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatApprovedChemistryWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46921,10 +46807,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatCapacityFromServerDut_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46944,10 +46829,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatQuantityFromServerDut_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatQuantityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46967,10 +46851,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatChargeStateFromServerDut_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatChargeStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -46990,10 +46873,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatTimeToFullChargeFromServerDut_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatTimeToFullChargeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47016,10 +46898,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatFunctionalWhileChargingFromServerDut_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatFunctionalWhileChargingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47036,10 +46917,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsBatChargingCurrentFromServerDut_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBatChargingCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47062,10 +46942,9 @@
 
     CHIP_ERROR TestTestHarnessClientReadsActiveBatChargeFaultsFromServerDut_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSource * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSource alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeActiveBatChargeFaultsWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47275,6 +47154,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -47282,10 +47162,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47307,10 +47188,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47332,10 +47214,11 @@
 
     CHIP_ERROR TestGivenPrssf00extEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47352,10 +47235,11 @@
 
     CHIP_ERROR TestReadTheGlobalMandatoryAttributeAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47381,10 +47265,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeScaledValueInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47403,10 +47288,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMinScaledValueInAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47425,10 +47311,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMaxScaledValueInAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47447,10 +47334,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeScaleInAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47469,10 +47357,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47491,10 +47380,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeScaledToleranceInAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47513,10 +47403,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47538,10 +47429,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -47739,6 +47631,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -47746,10 +47639,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeConstraintsMeasuredValue_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47772,10 +47666,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeConstraintsMinMeasuredValue_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47798,10 +47693,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeConstraintsMaxMeasuredValue_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47824,10 +47720,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeTolerance_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47847,10 +47744,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeScaledValue_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47873,10 +47771,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMinScaledValue_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47899,10 +47798,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMaxScaledValue_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxScaledValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47925,10 +47825,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeScaledTolerance_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeScaledToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -47948,10 +47849,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeScale_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeScaleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -48089,6 +47991,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -48097,10 +48000,11 @@
 
     CHIP_ERROR TestThReadsFromTheDutTheMeasuredValueAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -48120,6 +48024,7 @@
 
     CHIP_ERROR TestOperateOnDeviceToChangeThePressureSignificantly_2()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -48129,6 +48034,7 @@
 
     CHIP_ERROR TestWait2s_3()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 2000UL;
         return WaitForMs("alpha", value);
@@ -48136,10 +48042,11 @@
 
     CHIP_ERROR TestAfterAFewSecondsThReadsFromTheDutTheMeasuredValueAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPressureMeasurement * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPressureMeasurement alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -48465,6 +48372,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -48472,9 +48380,11 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -48496,9 +48406,11 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -48520,9 +48432,11 @@
 
     CHIP_ERROR TestThReadsTheAttributeListAttributeFromTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48552,9 +48466,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMinConstPressureAttributeInAttributeListFromTheDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48573,9 +48489,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMaxConstPressureAttributeInAttributeListFromTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48594,9 +48512,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMinCompPressureAttributeInAttributeListFromTheDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48615,9 +48535,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMaxCompPressureAttributeInAttributeListFromTheDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48636,9 +48558,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMinConstSpeedAttributeInAttributeListFromTheDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48657,9 +48581,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMaxConstSpeedAttributeInAttributeListFromTheDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48678,9 +48604,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMinConstFlowAttributeInAttributeListFromTheDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48699,9 +48627,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMaxConstFlowAttributeInAttributeListFromTheDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48720,9 +48650,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMinConstTempAttributeInAttributeListFromTheDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48741,9 +48673,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeMaxConstTempAttributeInAttributeListFromTheDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48762,9 +48696,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePumpStatusAttributeInAttributeListFromTheDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48783,9 +48719,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeSpeedAttributeInAttributeListFromTheDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48804,9 +48742,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeLifetimeRunningHoursAttributeInAttributeListFromTheDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48825,9 +48765,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePowerAttributeInAttributeListFromTheDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48846,9 +48788,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeLifetimeEnergyConsumedAttributeInAttributeListFromTheDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48867,9 +48811,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeControlModeAttributeInAttributeListFromTheDut_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48888,9 +48834,11 @@
 
     CHIP_ERROR TestThReadsTheAcceptedCommandListAttributeFromTheDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -48912,9 +48860,11 @@
 
     CHIP_ERROR TestThReadsTheGeneratedCommandListAttributeFromTheDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -49266,6 +49216,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -49273,9 +49224,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeMaxPressure_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49298,9 +49251,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeMaxSpeed_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49323,9 +49278,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeMaxFlow_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49348,9 +49305,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMinConstPressure_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinConstPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49373,9 +49332,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMaxConstPressure_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxConstPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49398,9 +49359,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMinCompPressure_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinCompPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49423,9 +49386,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMaxCompPressure_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxCompPressureWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49448,9 +49413,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMinConstSpeed_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinConstSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49473,9 +49440,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMaxConstSpeed_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxConstSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49498,9 +49467,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMinConstFlow_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinConstFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49523,9 +49494,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMaxConstFlow_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxConstFlowWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49548,9 +49521,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMinConstTemp_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinConstTempWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49573,9 +49548,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeMaxConstTemp_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxConstTempWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49598,9 +49575,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributePumpStatus_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePumpStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49620,9 +49599,11 @@
 
     CHIP_ERROR TestReadAttributeEffectiveOperationMode_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49642,9 +49623,11 @@
 
     CHIP_ERROR TestReadAttributeEffectiveControlMode_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49664,9 +49647,11 @@
 
     CHIP_ERROR TestReadAttributeCapacity_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCapacityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49689,9 +49674,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeSpeed_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49714,9 +49701,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeLifetimeRunningHours_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49739,9 +49728,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributePower_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePowerWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49764,9 +49755,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeLifetimeEnergyConsumed_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49789,9 +49782,11 @@
 
     CHIP_ERROR TestReadOptionalAttributeOperationMode_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49811,9 +49806,11 @@
 
     CHIP_ERROR TestReadOptionalAttributeControlMode_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -49999,6 +49996,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -50006,9 +50004,11 @@
 
     CHIP_ERROR TestThWrite0NormalToTheOperationModeAttributeToDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id operationModeArgument;
@@ -50027,9 +50027,11 @@
 
     CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50050,9 +50052,11 @@
 
     CHIP_ERROR TestThWrite1MinimumToTheOperationModeAttributeToDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id operationModeArgument;
@@ -50071,9 +50075,11 @@
 
     CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50094,9 +50100,11 @@
 
     CHIP_ERROR TestThWrite2MaximumToTheOperationModeAttributeToDutOneAtATime_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id operationModeArgument;
@@ -50117,9 +50125,11 @@
 
     CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50140,9 +50150,11 @@
 
     CHIP_ERROR TestThWrite3LocalToTheOperationModeAttributeToDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id operationModeArgument;
@@ -50161,9 +50173,11 @@
 
     CHIP_ERROR TestThReadsFromTheDutTheEffectiveOperationModeAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50415,6 +50429,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -50422,9 +50437,11 @@
 
     CHIP_ERROR TestWrite0ToTheOperationModeAttributeToDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id operationModeArgument;
@@ -50443,9 +50460,11 @@
 
     CHIP_ERROR TestReadsTheAttributeEffectiveOperationMode_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveOperationModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50466,9 +50485,11 @@
 
     CHIP_ERROR TestWrite0ToTheControlModeAttributeToDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id controlModeArgument;
@@ -50487,9 +50508,11 @@
 
     CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50510,9 +50533,11 @@
 
     CHIP_ERROR TestWrite1ToTheControlModeAttributeToDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id controlModeArgument;
@@ -50531,9 +50556,11 @@
 
     CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50554,9 +50581,11 @@
 
     CHIP_ERROR TestWrite2ToTheControlModeAttributeToDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id controlModeArgument;
@@ -50575,9 +50604,11 @@
 
     CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50598,9 +50629,11 @@
 
     CHIP_ERROR TestWrite3ToTheControlModeAttributeToDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id controlModeArgument;
@@ -50619,9 +50652,11 @@
 
     CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50642,9 +50677,11 @@
 
     CHIP_ERROR TestWrite5ToTheControlModeAttributeToDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id controlModeArgument;
@@ -50663,9 +50700,11 @@
 
     CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50686,9 +50725,11 @@
 
     CHIP_ERROR TestWrite7ToTheControlModeAttributeToDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id controlModeArgument;
@@ -50707,9 +50748,11 @@
 
     CHIP_ERROR TestReadsTheAttributeEffectiveControlMode_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEffectiveControlModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50939,6 +50982,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -50946,9 +50990,11 @@
 
     CHIP_ERROR TestWrite1ToTheLifetimeRunningHoursAttributeToDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id lifetimeRunningHoursArgument;
@@ -50967,9 +51013,11 @@
 
     CHIP_ERROR TestReadsTheAttributeLifetimeRunningHours_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -50991,9 +51039,11 @@
 
     CHIP_ERROR TestWrite2ToTheLifetimeRunningHoursAttributeToDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id lifetimeRunningHoursArgument;
@@ -51012,9 +51062,11 @@
 
     CHIP_ERROR TestReadsTheAttributeLifetimeRunningHours_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -51036,9 +51088,11 @@
 
     CHIP_ERROR TestWrite3ToTheLifetimeRunningHoursAttributeToDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id lifetimeRunningHoursArgument;
@@ -51057,9 +51111,11 @@
 
     CHIP_ERROR TestReadsTheAttributeLifetimeRunningHours_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLifetimeRunningHoursWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -51081,9 +51137,11 @@
 
     CHIP_ERROR TestWrite1ToTheLifetimeEnergyConsumedAttributeToDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id lifetimeEnergyConsumedArgument;
@@ -51103,9 +51161,11 @@
 
     CHIP_ERROR TestReadsTheAttributeLifetimeEnergyConsumed_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -51127,9 +51187,11 @@
 
     CHIP_ERROR TestWrite2ToTheLifetimeEnergyConsumedAttributeToDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id lifetimeEnergyConsumedArgument;
@@ -51149,9 +51211,11 @@
 
     CHIP_ERROR TestReadsTheAttributeLifetimeEnergyConsumed_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -51173,9 +51237,11 @@
 
     CHIP_ERROR TestWrite3ToTheLifetimeEnergyConsumedAttributeToDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id lifetimeEnergyConsumedArgument;
@@ -51195,9 +51261,11 @@
 
     CHIP_ERROR TestReadsTheAttributeLifetimeEnergyConsumed_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPumpConfigurationAndControl * cluster =
-            [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPumpConfigurationAndControl alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLifetimeEnergyConsumedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -51331,6 +51399,7 @@
 
     CHIP_ERROR TestCommissionDutToTh_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -51338,9 +51407,11 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -51362,9 +51433,11 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -51386,9 +51459,11 @@
 
     CHIP_ERROR TestThReadsTheAttributeListAttributeFromTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -51412,9 +51487,11 @@
 
     CHIP_ERROR TestThReadsTheAcceptedCommandListAttributeFromTheDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -51436,9 +51513,11 @@
 
     CHIP_ERROR TestThReadsTheGeneratedCommandListAttributeFromTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -51548,6 +51627,7 @@
 
     CHIP_ERROR TestCommissionDutToTh_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -51555,9 +51635,11 @@
 
     CHIP_ERROR TestThReadsTheSourcesAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterPowerSourceConfiguration * cluster =
-            [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterPowerSourceConfiguration alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSourcesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -51697,6 +51779,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -51704,9 +51787,11 @@
 
     CHIP_ERROR TestReadClusterRevisionAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -51728,9 +51813,11 @@
 
     CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -51752,9 +51839,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -51780,9 +51869,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -51801,9 +51892,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -51825,9 +51918,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -51970,6 +52065,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -51977,9 +52073,11 @@
 
     CHIP_ERROR TestThReadsTheMinMeasuredValueAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52002,9 +52100,11 @@
 
     CHIP_ERROR TestThReadsTheMaxMeasuredValueAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52027,9 +52127,11 @@
 
     CHIP_ERROR TestThReadsTheMeasuredValueAttributeFromTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52052,9 +52154,11 @@
 
     CHIP_ERROR TestThReadsTheToleranceAttributeFromTheDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterRelativeHumidityMeasurement * cluster =
-            [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterRelativeHumidityMeasurement alloc] initWithDevice:device
+                                                                                       endpointID:@(1)
+                                                                                            queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52261,6 +52365,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -52268,8 +52373,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52291,8 +52397,9 @@
 
     CHIP_ERROR TestReadFeatureMapAttributeAndCheckValuesOfFlagsInThisFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52314,8 +52421,9 @@
 
     CHIP_ERROR TestGivenSwtchsf00lsEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52332,8 +52440,9 @@
 
     CHIP_ERROR TestGivenSwtchsf01msEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52350,8 +52459,9 @@
 
     CHIP_ERROR TestGivenSwtchsf02msrEnsureFeaturemapHasTheCorrectBitSet_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52368,8 +52478,9 @@
 
     CHIP_ERROR TestGivenSwtchsf03mslEnsureFeaturemapHasTheCorrectBitSet_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52386,8 +52497,9 @@
 
     CHIP_ERROR TestGivenSwtchsf04msmEnsureFeaturemapHasTheCorrectBitSet_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52404,8 +52516,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -52431,8 +52544,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -52457,8 +52571,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -52475,8 +52590,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSwitch * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSwitch alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -52621,6 +52737,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -52628,9 +52745,11 @@
 
     CHIP_ERROR TestReadClusterRevisionAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52652,9 +52771,11 @@
 
     CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52676,9 +52797,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -52704,9 +52827,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeToleranceInAttributeList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -52725,9 +52850,11 @@
 
     CHIP_ERROR TestReadAcceptedCommandListAttributeFromTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -52749,9 +52876,11 @@
 
     CHIP_ERROR TestReadGeneratedCommandListAttributeFromTheDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -52894,6 +53023,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -52901,9 +53031,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeMinMeasuredValue_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52926,9 +53058,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeMaxMeasuredValue_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52951,9 +53085,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeMeasuredValue_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMeasuredValueWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -52976,9 +53112,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeTolerance_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTemperatureMeasurement * cluster =
-            [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTemperatureMeasurement alloc] initWithDevice:device
+                                                                                  endpointID:@(1)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeToleranceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53303,6 +53441,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -53310,10 +53449,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53335,10 +53473,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53360,10 +53497,9 @@
 
     CHIP_ERROR TestGivenTstatsf00heatEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53380,10 +53516,9 @@
 
     CHIP_ERROR TestGivenTstatsf01coolEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53400,10 +53535,9 @@
 
     CHIP_ERROR TestGivenTstatsf02occEnsureFeaturemapHasTheCorrectBitSet_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53420,10 +53554,9 @@
 
     CHIP_ERROR TestGivenTstatsf03schEnsureFeaturemapHasTheCorrectBitSet_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53440,10 +53573,9 @@
 
     CHIP_ERROR TestGivenTstatsf04sbEnsureFeaturemapHasTheCorrectBitSet_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53460,10 +53592,9 @@
 
     CHIP_ERROR TestGivenTstatsf05autoEnsureFeaturemapHasTheCorrectBitSet_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53480,10 +53611,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53509,10 +53639,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentTSTATSF00HEATAttributeInAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53531,10 +53660,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentTSTATSF01COOLAttributeInAttributeList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53553,10 +53681,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentTSTATSF02OCCAttributeInAttributeList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53575,10 +53702,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentTSTATSF00HEATTstatsf02occAttributeInAttributeList_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53597,10 +53723,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentTSTATSF01COOLTstatsf02occAttributeInAttributeList_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53619,10 +53744,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentTSTATSF05AUTOAttributeInAttributeList_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53643,10 +53767,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentTSTATSF03SCHAttributeInAttributeList_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53667,10 +53790,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentTSTATSF04SBAttributeInAttributeList_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53691,10 +53813,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentTSTATSF04SBTstatsf02occAttributeInAttributeList_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53715,10 +53836,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53737,10 +53857,9 @@
 
     CHIP_ERROR TestReadFeatureDependentTSTATSF03SCHCommandsInAcceptedCommandList_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53762,10 +53881,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostat * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53894,6 +54012,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -53901,9 +54020,11 @@
 
     CHIP_ERROR TestThReadClusterRevisionAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53925,9 +54046,11 @@
 
     CHIP_ERROR TestReadFeatureMapAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -53949,9 +54072,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -53977,9 +54102,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -54001,9 +54128,11 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -54135,6 +54264,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -54142,9 +54272,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeTemperatureDisplayMode_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -54164,9 +54296,11 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeKeypadLockout_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -54186,9 +54320,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeScheduleProgrammingVisibility_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -54687,6 +54823,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -54694,9 +54831,11 @@
 
     CHIP_ERROR TestWritesAValueOf0ToTemperatureDisplayModeAttributeOfDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id temperatureDisplayModeArgument;
@@ -54718,6 +54857,7 @@
 
     CHIP_ERROR TestVerifyDeviceTemperatureDisplayedInc_2()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -54727,9 +54867,11 @@
 
     CHIP_ERROR TestThReadsTheTemperatureDisplayModeAttributeOfDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -54745,9 +54887,11 @@
 
     CHIP_ERROR TestWritesAValueOf1ToTemperatureDisplayModeAttributeOfDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id temperatureDisplayModeArgument;
@@ -54769,6 +54913,7 @@
 
     CHIP_ERROR TestVerifyDeviceTemperatureDisplayedInf_5()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -54778,9 +54923,11 @@
 
     CHIP_ERROR TestThReadsTheTemperatureDisplayModeAttributeOfDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -54801,9 +54948,11 @@
 
     CHIP_ERROR TestWritesAValueOfGreaterThan1ToTemperatureDisplayModeAttributeOfDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id temperatureDisplayModeArgument;
@@ -54828,9 +54977,11 @@
 
     CHIP_ERROR TestThReadsTheTemperatureDisplayModeAttributeOfDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTemperatureDisplayModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -54851,9 +55002,11 @@
 
     CHIP_ERROR TestWritesAValueOf0ToKeypadLockoutAttributeOfDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id keypadLockoutArgument;
@@ -54872,6 +55025,7 @@
 
     CHIP_ERROR TestVerifyAllDeviceFunctionalityAvailableToTheUser_10()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -54881,9 +55035,11 @@
 
     CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -54904,9 +55060,11 @@
 
     CHIP_ERROR TestWritesAValueOf1ToKeypadLockoutAttributeOfDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id keypadLockoutArgument;
@@ -54925,6 +55083,7 @@
 
     CHIP_ERROR TestVerifyDeviceOperatesAtLevel1ReducedFunctionality_13()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -54934,9 +55093,11 @@
 
     CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -54957,9 +55118,11 @@
 
     CHIP_ERROR TestWritesAValueOf2ToKeypadLockoutAttributeOfDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id keypadLockoutArgument;
@@ -54978,6 +55141,7 @@
 
     CHIP_ERROR TestVerifyDeviceOperatesAtLevel2ReducedFunctionality_16()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -54987,9 +55151,11 @@
 
     CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -55010,9 +55176,11 @@
 
     CHIP_ERROR TestWritesAValueOf3ToKeypadLockoutAttributeOfDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id keypadLockoutArgument;
@@ -55031,6 +55199,7 @@
 
     CHIP_ERROR TestVerifyDeviceOperatesAtLevel3ReducedFunctionality_19()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -55040,9 +55209,11 @@
 
     CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -55063,9 +55234,11 @@
 
     CHIP_ERROR TestWritesAValueOf4ToKeypadLockoutAttributeOfDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id keypadLockoutArgument;
@@ -55084,6 +55257,7 @@
 
     CHIP_ERROR TestVerifyDeviceOperatesAtLevel4ReducedFunctionality_22()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -55093,9 +55267,11 @@
 
     CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -55116,9 +55292,11 @@
 
     CHIP_ERROR TestWritesAValueOf5ToKeypadLockoutAttributeOfDut_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id keypadLockoutArgument;
@@ -55137,6 +55315,7 @@
 
     CHIP_ERROR TestVerifyDeviceOperatesAtLeastFunctionalityLevel_25()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -55146,9 +55325,11 @@
 
     CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -55169,9 +55350,11 @@
 
     CHIP_ERROR TestWritesAValueOfGreaterThan5ToKeypadLockoutAttributeOfDut_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id keypadLockoutArgument;
@@ -55196,9 +55379,11 @@
 
     CHIP_ERROR TestThReadsTheKeypadLockoutAttributeOfDut_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeKeypadLockoutWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -55219,9 +55404,11 @@
 
     CHIP_ERROR TestWritesAValueOf0ToScheduleProgrammingVisibilityAttributeOfDut_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id scheduleProgrammingVisibilityArgument;
@@ -55242,6 +55429,7 @@
 
     CHIP_ERROR TestVerifyLocalScheduleProgrammingFunctionalityIsEnabledAtTheThermostat_30()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -55251,9 +55439,11 @@
 
     CHIP_ERROR TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -55274,9 +55464,11 @@
 
     CHIP_ERROR TestWritesAValueOf1ToScheduleProgrammingVisibilityAttributeOfDut_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id scheduleProgrammingVisibilityArgument;
@@ -55297,6 +55489,7 @@
 
     CHIP_ERROR TestVerifyLocalScheduleProgrammingFunctionalityIsDisabledAtTheThermostat_33()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -55306,9 +55499,11 @@
 
     CHIP_ERROR TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -55329,9 +55524,11 @@
 
     CHIP_ERROR TestWritesAValueOfGreaterThan1ToScheduleProgrammingVisibilityAttributeOfDut_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id scheduleProgrammingVisibilityArgument;
@@ -55356,9 +55553,11 @@
 
     CHIP_ERROR TestThReadsTheScheduleProgrammingVisibilityAttributeOfDut_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThermostatUserInterfaceConfiguration * cluster =
-            [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThermostatUserInterfaceConfiguration alloc] initWithDevice:device
+                                                                                                endpointID:@(1)
+                                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeScheduleProgrammingVisibilityWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -56062,6 +56261,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -56069,9 +56269,11 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -56093,9 +56295,11 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -56117,9 +56321,11 @@
 
     CHIP_ERROR TestGivenDgthreadsf00pktcntEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -56136,9 +56342,11 @@
 
     CHIP_ERROR TestGivenDgthreadsf01errcntEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -56155,9 +56363,11 @@
 
     CHIP_ERROR TestGivenDgthreadsf02mlecntEnsureFeaturemapHasTheCorrectBitSet_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -56174,9 +56384,11 @@
 
     CHIP_ERROR TestGivenDgthreadsf03maccntEnsureFeaturemapHasTheCorrectBitSet_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -56193,9 +56405,11 @@
 
     CHIP_ERROR TestThReadsMandatoryAttributesInAttributeListFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56235,9 +56449,11 @@
 
     CHIP_ERROR TestThReadsFeatureDependentAttributeDGTHREADSF01ERRCNTInAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56256,9 +56472,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeDetachedRoleCountInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56277,9 +56495,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeChildRoleCountAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56298,9 +56518,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRouterRoleCountInAttributeList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56319,9 +56541,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeLeaderRoleCountInAttributeList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56340,9 +56564,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeAttachAttemptCountInAttributeList_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56361,9 +56587,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributePartitionIdChangeCountInAttributeList_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56382,9 +56610,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeBetterPartitionAttachAttemptCountInAttributeList_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56403,9 +56633,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeParentChangeCountInAttributeList_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56424,9 +56656,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxTotalCountInAttributeList_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56445,9 +56679,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxUnicastCountInAttributeList_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56466,9 +56702,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxBroadcastCountInAttributeList_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56487,9 +56725,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxAckRequestedCountInAttributeList_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56508,9 +56748,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxAckedCountInAttributeList_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56529,9 +56771,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxNoAckRequestedCountInAttributeList_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56550,9 +56794,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributesTxDataCountInAttributeList_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56571,9 +56817,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxDataPollCountInAttributeList_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56592,9 +56840,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxBeaconCountInAttributeList_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56613,9 +56863,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxBeaconRequestCountInAttributeList_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56634,9 +56886,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxOtherCountInAttributeList_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56655,9 +56909,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxRetryCountInAttributeList_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56676,9 +56932,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxDirectMaxRetryExpiryCountInAttributeList_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56697,9 +56955,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxIndirectMaxRetryExpiryCountInAttributeList_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56718,9 +56978,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxErrCcaCountInAttributeList_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56739,9 +57001,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxErrAbortCountInAttributeList_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56760,9 +57024,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeTxErrBusyChannelCountInAttributeList_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56781,9 +57047,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxTotalCountInAttributeList_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56802,9 +57070,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxUnicastCountInAttributeList_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56823,9 +57093,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxBroadcastCountInAttributeList_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56844,9 +57116,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxDataCountInAttributeList_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56865,9 +57139,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxDataPollCountInAttributeList_38()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56886,9 +57162,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxBeaconCountInAttributeList_39()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56907,9 +57185,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxBeaconRequestCountInAttributeList_40()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56928,9 +57208,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxOtherCountInAttributeList_41()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56949,9 +57231,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxAddressFilteredCountInAttributeList_42()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56970,9 +57254,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxDestAddrFilteredCountInAttributeList_43()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -56991,9 +57277,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxDuplicatedCountInAttributeList_44()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57012,9 +57300,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxErrNoFrameCountInAttributeList_45()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57033,9 +57323,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxErrUnknownNeighborCountInAttributeList_46()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57054,9 +57346,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxErrInvalidScrAddrCountInAttributeList_47()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57075,9 +57369,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxErrSecCountInAttributeList_48()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57096,9 +57392,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxErrFcsCountInAttributeList_49()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57117,9 +57415,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeRxErrOtherCountInAttributeList_50()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57138,9 +57438,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeActiveTimestampInAttributeList_51()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57159,9 +57461,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributePendingTimestampInAttributeList_52()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57180,9 +57484,11 @@
 
     CHIP_ERROR TestReadTheOptionalAttributeDelayInAttributeList_53()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57201,9 +57507,11 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_54()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57222,9 +57530,11 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_55()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterThreadNetworkDiagnostics * cluster =
-            [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterThreadNetworkDiagnostics alloc] initWithDevice:device
+                                                                                    endpointID:@(0)
+                                                                                         queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57358,6 +57668,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -57365,10 +57676,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeClusterRevision_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -57390,10 +57700,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeFeatureMap_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -57415,10 +57724,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAttributeList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57442,10 +57750,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeAcceptedCommandList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57467,10 +57774,9 @@
 
     CHIP_ERROR TestReadTheGlobalAttributeGeneratedCommandList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57580,6 +57886,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -57587,10 +57894,9 @@
 
     CHIP_ERROR TestThReadsLabelListAttributeOfTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57706,6 +58012,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -57713,10 +58020,9 @@
 
     CHIP_ERROR TestThWritesLabelListAttributeFromTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -57754,10 +58060,9 @@
 
     CHIP_ERROR TestThReadsLabelListAttributeFromTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -57889,6 +58194,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -57896,10 +58202,9 @@
 
     CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -57929,10 +58234,9 @@
 
     CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -58083,6 +58387,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -58090,10 +58395,9 @@
 
     CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -58123,10 +58427,9 @@
 
     CHIP_ERROR TestThReadsLabelListAttributeOfTheDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -58153,10 +58456,9 @@
 
     CHIP_ERROR TestThWritesLabelListAttributeOfTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -58182,10 +58484,9 @@
 
     CHIP_ERROR TestThReadsLabelListAttributeOfTheDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -58400,6 +58701,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -58407,9 +58709,11 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -58431,9 +58735,11 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -58455,9 +58761,11 @@
 
     CHIP_ERROR TestGivenDGWIFISF00PacketCountsEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -58474,9 +58782,11 @@
 
     CHIP_ERROR TestGivenDGWIFISF01ErrorCountsEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -58493,9 +58803,11 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -58523,9 +58835,11 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDGWIFISF00AttributesInAttributeListFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -58548,9 +58862,11 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDGWIFISF01AttributesInAttributeListFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -58570,9 +58886,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeCurrentMaxRateInAttributeListFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -58591,9 +58909,11 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -58615,9 +58935,11 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDGWIFISF01CommandInAcceptedCommandListFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -58636,9 +58958,11 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -58880,6 +59204,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -58887,9 +59212,11 @@
 
     CHIP_ERROR TestThReadsBssidAttributeFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBssidWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -58910,9 +59237,11 @@
 
     CHIP_ERROR TestReadsSecurityTypeAttributeConstraints_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSecurityTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -58933,9 +59262,11 @@
 
     CHIP_ERROR TestReadsWiFiVersionAttributeConstraints_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWiFiVersionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -58958,9 +59289,11 @@
 
     CHIP_ERROR TestReadsChannelNumberAttributeConstraints_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeChannelNumberWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -58983,9 +59316,11 @@
 
     CHIP_ERROR TestReadsRssiAttributeConstraints_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRssiWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59008,9 +59343,11 @@
 
     CHIP_ERROR TestReadsBeaconLostCountAttributeConstraints_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBeaconLostCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59033,9 +59370,11 @@
 
     CHIP_ERROR TestReadsBeaconRxCountAttributeConstraints_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBeaconRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59058,9 +59397,11 @@
 
     CHIP_ERROR TestReadsPacketMulticastRxCountAttributeConstraints_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketMulticastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59083,9 +59424,11 @@
 
     CHIP_ERROR TestReadsPacketMulticastTxCountAttributeConstraints_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketMulticastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59108,9 +59451,11 @@
 
     CHIP_ERROR TestReadsPacketUnicastRxCountAttributeConstraints_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketUnicastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59133,9 +59478,11 @@
 
     CHIP_ERROR TestReadsPacketUnicastTxCountAttributeConstraints_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketUnicastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59158,9 +59505,11 @@
 
     CHIP_ERROR TestReadsCurrentMaxRateAttributeConstraints_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentMaxRateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59181,9 +59530,11 @@
 
     CHIP_ERROR TestReadsOverrunCountAttributeConstraints_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOverrunCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59358,6 +59709,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -59365,9 +59717,11 @@
 
     CHIP_ERROR TestThSendsResetCountsCommandToDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster resetCountsWithCompletion:^(NSError * _Nullable err) {
@@ -59383,9 +59737,11 @@
 
     CHIP_ERROR TestReadsBeaconLostCountAttributeFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBeaconLostCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59408,9 +59764,11 @@
 
     CHIP_ERROR TestReadsBeaconRxCountAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBeaconRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59433,9 +59791,11 @@
 
     CHIP_ERROR TestReadsPacketMulticastRxCountAttributeFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketMulticastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59458,9 +59818,11 @@
 
     CHIP_ERROR TestReadsPacketMulticastTxCountAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketMulticastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59483,9 +59845,11 @@
 
     CHIP_ERROR TestReadsPacketUnicastRxCountAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketUnicastRxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59508,9 +59872,11 @@
 
     CHIP_ERROR TestReadsPacketUnicastTxCountAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWiFiNetworkDiagnostics * cluster =
-            [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWiFiNetworkDiagnostics alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePacketUnicastTxCountWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59817,6 +60183,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -59824,10 +60191,9 @@
 
     CHIP_ERROR TestThReadsFromTheDutThe0xFFFDClusterRevisionAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59852,10 +60218,9 @@
 
     CHIP_ERROR TestThReadsFromTheDutThe0xFFFCFeatureMapAttribute_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59877,10 +60242,9 @@
 
     CHIP_ERROR TestGivenWncvsf00lfEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59897,10 +60261,9 @@
 
     CHIP_ERROR TestGivenWncvsf01tlEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59917,10 +60280,9 @@
 
     CHIP_ERROR TestGivenWncvsf02paLfEnsureFeaturemapHasTheCorrectBitSet_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59937,10 +60299,9 @@
 
     CHIP_ERROR TestGivenWncvsf03absEnsureFeaturemapHasTheCorrectBitSet_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59957,10 +60318,9 @@
 
     CHIP_ERROR TestGivenWncvsf04paTlEnsureFeaturemapHasTheCorrectBitSet_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -59977,10 +60337,9 @@
 
     CHIP_ERROR TestThReadsFromTheDutThe0xFFFBAttributeListAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60008,10 +60367,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeSafetyStatusInAttributeList_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60030,10 +60388,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentWNCVSF00Wncvsf02Wncvsf03AttributeInAttributeList_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60053,10 +60410,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentWNCVSF00Wncvsf02AttributeInAttributeList_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60076,10 +60432,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentWNCVSF01Wncvsf04Wncvsf03AttributeInAttributeList_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60099,10 +60454,9 @@
 
     CHIP_ERROR TestReadTheFeatureDependentWNCVSF01Wncvsf04AttributeInAttributeList_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60122,10 +60476,9 @@
 
     CHIP_ERROR TestThReadsFromTheDutThe0xFFF9AcceptedCommandListAttribute_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60146,10 +60499,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentWNCVSF00Wncvsf02CommandInAcceptedCommandList_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60168,10 +60520,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentWNCVSF01Wncvsf03CommandInAcceptedCommandList_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60190,10 +60541,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentWNCVSF01Wncvsf04CommandInAcceptedCommandList_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60212,10 +60562,9 @@
 
     CHIP_ERROR TestThReadsFromTheDutThe0xFFF8GeneratedCommandListAttribute_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -60577,6 +60926,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -60584,10 +60934,9 @@
 
     CHIP_ERROR Test1aReadTheRoMandatoryAttributeDefaultType_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60607,10 +60956,9 @@
 
     CHIP_ERROR Test1bReadTheRoMandatoryAttributeDefaultConfigStatus_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60630,10 +60978,9 @@
 
     CHIP_ERROR Test1cReadTheRoMandatoryAttributeDefaultOperationalStatus_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60653,10 +61000,9 @@
 
     CHIP_ERROR Test1dReadTheRoMandatoryAttributeDefaultEndProductType_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEndProductTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60676,10 +61022,9 @@
 
     CHIP_ERROR Test1eReadTheRwMandatoryAttributeDefaultMode_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60699,10 +61044,9 @@
 
     CHIP_ERROR Test1fWriteAValueIntoTheRwMandatoryAttributeMode_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id modeArgument;
@@ -60721,10 +61065,9 @@
 
     CHIP_ERROR Test2aReadTheRoOptionalAttributeDefaultTargetPositionLiftPercent100ths_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60749,10 +61092,9 @@
 
     CHIP_ERROR Test2bReadTheRoOptionalAttributeDefaultTargetPositionTiltPercent100ths_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60777,10 +61119,9 @@
 
     CHIP_ERROR Test2cReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercent100ths_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -60806,10 +61147,9 @@
 
     CHIP_ERROR Test2dReadTheRoOptionalAttributeDefaultCurrentPositionTiltPercent100ths_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -60835,10 +61175,9 @@
 
     CHIP_ERROR Test2eReadTheRoOptionalAttributeDefaultInstalledOpenLimitLift_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInstalledOpenLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60858,10 +61197,9 @@
 
     CHIP_ERROR Test2fReadTheRoOptionalAttributeDefaultInstalledClosedLimitLift_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInstalledClosedLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60881,10 +61219,9 @@
 
     CHIP_ERROR Test2gReadTheRoOptionalAttributeDefaultInstalledOpenLimitTilt_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInstalledOpenLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60904,10 +61241,9 @@
 
     CHIP_ERROR Test2hReadTheRoOptionalAttributeDefaultInstalledClosedLimitTilt_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInstalledClosedLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60927,10 +61263,9 @@
 
     CHIP_ERROR Test3aReadTheRoMandatoryAttributeDefaultSafetyStatus_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSafetyStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60950,10 +61285,9 @@
 
     CHIP_ERROR Test3bReadTheRoOptionalAttributeDefaultPhysicalClosedLimitLift_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePhysicalClosedLimitLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60973,10 +61307,9 @@
 
     CHIP_ERROR Test3cReadTheRoOptionalAttributeDefaultPhysicalClosedLimitTilt_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePhysicalClosedLimitTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -60996,10 +61329,9 @@
 
     CHIP_ERROR Test3dReadTheRoOptionalAttributeDefaultCurrentPositionLift_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61022,10 +61354,9 @@
 
     CHIP_ERROR Test3eReadTheRoOptionalAttributeDefaultCurrentPositionTilt_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61048,10 +61379,9 @@
 
     CHIP_ERROR Test3fReadTheRoOptionalAttributeDefaultNumberOfActuationsLift_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfActuationsLiftWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61071,10 +61401,9 @@
 
     CHIP_ERROR Test3gReadTheRoOptionalAttributeDefaultNumberOfActuationsTilt_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfActuationsTiltWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61094,10 +61423,9 @@
 
     CHIP_ERROR Test3hReadTheRoOptionalAttributeDefaultCurrentPositionLiftPercentage_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61122,10 +61450,9 @@
 
     CHIP_ERROR Test3ireadTheRoOptionalAttributeDefaultCurrentPositionTiltPercentage_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61240,6 +61567,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -61247,6 +61575,7 @@
 
     CHIP_ERROR TestReadsConfigStatusAttributeFromDutIfPaLfValueOfBit3MustBe1bElse0bIfPaTlValueOfBit4MustBe1bElse0b_1()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -61521,6 +61850,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -61528,10 +61858,9 @@
 
     CHIP_ERROR Test1aThSetTheModeAttributeBit0OfTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id modeArgument;
@@ -61550,10 +61879,9 @@
 
     CHIP_ERROR Test1bThReadsConfigStatusAttributeFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61572,10 +61900,9 @@
 
     CHIP_ERROR Test1cThClearTheModeAttributeBit0OfTheDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id modeArgument;
@@ -61594,10 +61921,9 @@
 
     CHIP_ERROR Test1dThReadsConfigStatusAttributeFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61616,10 +61942,9 @@
 
     CHIP_ERROR Test2aThSetTheModeAttributeBit1OfTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id modeArgument;
@@ -61639,10 +61964,9 @@
 
     CHIP_ERROR Test2bThReadsConfigStatusAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61664,10 +61988,9 @@
 
     CHIP_ERROR Test2cIfConfigStatusBit00ThSendDownOrCloseCommandToTheDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -61684,10 +62007,9 @@
 
     CHIP_ERROR Test2dThClearTheModeAttributeBit1OfTheDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id modeArgument;
@@ -61706,10 +62028,9 @@
 
     CHIP_ERROR Test2eThReadsConfigStatusAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61728,10 +62049,9 @@
 
     CHIP_ERROR Test2fThReadsTheModeAttributeFromTheDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61750,10 +62070,9 @@
 
     CHIP_ERROR Test2gThSendDownOrCloseCommandToTheDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -61769,10 +62088,9 @@
 
     CHIP_ERROR Test3aThSetTheModeAttributeBit2OfTheDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id modeArgument;
@@ -61791,10 +62109,9 @@
 
     CHIP_ERROR Test3bThSendDownOrCloseCommandToTheDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -61812,10 +62129,9 @@
 
     CHIP_ERROR Test3cThReadsConfigStatusAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61837,10 +62153,9 @@
 
     CHIP_ERROR Test3dThClearTheModeAttributeBit2OfTheDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id modeArgument;
@@ -61859,10 +62174,9 @@
 
     CHIP_ERROR Test3eThSendDownOrCloseCommandToTheDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -61878,10 +62192,9 @@
 
     CHIP_ERROR Test3fThReadsConfigStatusAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeConfigStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -61988,6 +62301,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -61995,6 +62309,7 @@
 
     CHIP_ERROR TestReadsTypeAttributeFromDut_1()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -62092,6 +62407,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -62099,10 +62415,9 @@
 
     CHIP_ERROR TestThReadsEndProductTypeAttributeFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEndProductTypeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62505,6 +62820,7 @@
 
     CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -62512,10 +62828,9 @@
 
     CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -62531,6 +62846,7 @@
 
     CHIP_ERROR Test1bThWaitsFor10SecondsMovementsOnTheDevice_2()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -62538,10 +62854,9 @@
 
     CHIP_ERROR Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -62567,10 +62882,9 @@
 
     CHIP_ERROR Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62595,10 +62909,9 @@
 
     CHIP_ERROR Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -62624,10 +62937,9 @@
 
     CHIP_ERROR Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62654,10 +62966,9 @@
 
     CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_Test_TC_WNCV_3_1_OperationalStatus_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62675,16 +62986,15 @@
 
     CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         uint16_t minIntervalArgument = 4U;
         uint16_t maxIntervalArgument = 5U;
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
-                                                                          maxInterval:@(maxIntervalArgument)];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
+                                                                   maxInterval:@(maxIntervalArgument)];
         params.filterByFabric = true;
         params.replaceExistingSubscriptions = true;
         [cluster subscribeAttributeOperationalStatusWithParams:params
@@ -62709,10 +63019,9 @@
 
     CHIP_ERROR Test2aThSendsUpOrOpenCommandToDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
@@ -62728,6 +63037,7 @@
 
     CHIP_ERROR Test2bDutUpdatesItsAttributes_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -62735,10 +63045,9 @@
 
     CHIP_ERROR Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62760,10 +63069,9 @@
 
     CHIP_ERROR Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62785,6 +63093,7 @@
 
     CHIP_ERROR Test2eThLeaveTheDeviceMovingFor2Seconds_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 2000UL;
         return WaitForMs("alpha", value);
@@ -62792,10 +63101,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit01_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62812,10 +63120,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62832,10 +63139,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62852,10 +63158,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62872,10 +63177,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62892,6 +63196,7 @@
 
     CHIP_ERROR Test3a2DutUpdatesItsAttributes_19()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 3000UL;
         return WaitForMs("alpha", value);
@@ -62899,10 +63204,9 @@
 
     CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -62928,10 +63232,9 @@
 
     CHIP_ERROR Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -62956,10 +63259,9 @@
 
     CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -62985,10 +63287,9 @@
 
     CHIP_ERROR Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63013,10 +63314,9 @@
 
     CHIP_ERROR Test4aThSendsAStopMotionCommandToDut_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
@@ -63032,6 +63332,7 @@
 
     CHIP_ERROR Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 3000UL;
         return WaitForMs("alpha", value);
@@ -63039,10 +63340,9 @@
 
     CHIP_ERROR Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63063,6 +63363,7 @@
 
     CHIP_ERROR Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 1000UL;
         return WaitForMs("alpha", value);
@@ -63070,10 +63371,9 @@
 
     CHIP_ERROR Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63098,10 +63398,9 @@
 
     CHIP_ERROR Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63509,6 +63808,7 @@
 
     CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -63516,10 +63816,9 @@
 
     CHIP_ERROR Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
@@ -63535,6 +63834,7 @@
 
     CHIP_ERROR Test1bThWaitsFor10SecondsMovementsOnTheDevice_2()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -63542,10 +63842,9 @@
 
     CHIP_ERROR Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -63571,10 +63870,9 @@
 
     CHIP_ERROR Test1dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63599,10 +63897,9 @@
 
     CHIP_ERROR Test1eIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -63628,10 +63925,9 @@
 
     CHIP_ERROR Test1fIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63658,10 +63954,9 @@
 
     CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_Test_TC_WNCV_3_2_OperationalStatus_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63679,16 +63974,15 @@
 
     CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         uint16_t minIntervalArgument = 4U;
         uint16_t maxIntervalArgument = 5U;
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
-                                                                          maxInterval:@(maxIntervalArgument)];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
+                                                                   maxInterval:@(maxIntervalArgument)];
         params.filterByFabric = true;
         params.replaceExistingSubscriptions = true;
         [cluster subscribeAttributeOperationalStatusWithParams:params
@@ -63713,10 +64007,9 @@
 
     CHIP_ERROR Test2aThSendsDownOrCloseCommandToDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -63732,6 +64025,7 @@
 
     CHIP_ERROR Test2bDutUpdatesItsAttributes_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -63739,10 +64033,9 @@
 
     CHIP_ERROR Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63764,10 +64057,9 @@
 
     CHIP_ERROR Test2dIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63789,6 +64081,7 @@
 
     CHIP_ERROR Test2eThLeaveTheDeviceMovingFor2Seconds_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 2000UL;
         return WaitForMs("alpha", value);
@@ -63796,10 +64089,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit01_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63816,10 +64108,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63836,10 +64127,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit23Wncvsf00lf_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63856,10 +64146,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63876,10 +64165,9 @@
 
     CHIP_ERROR Test3aThReadsOperationalStatusAttributesBit45Wncvsf01tl_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63896,6 +64184,7 @@
 
     CHIP_ERROR Test3a2DutUpdatesItsAttributes_19()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 3000UL;
         return WaitForMs("alpha", value);
@@ -63903,10 +64192,9 @@
 
     CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -63932,10 +64220,9 @@
 
     CHIP_ERROR Test3cIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -63960,10 +64247,9 @@
 
     CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -63989,10 +64275,9 @@
 
     CHIP_ERROR Test3eIfPaLfThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64017,10 +64302,9 @@
 
     CHIP_ERROR Test4aThSendsAStopMotionCommandToDut_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
@@ -64036,6 +64320,7 @@
 
     CHIP_ERROR Test4bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_25()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 3000UL;
         return WaitForMs("alpha", value);
@@ -64043,10 +64328,9 @@
 
     CHIP_ERROR Test4cVerifyDutUpdateOperationalStatusAttributeToThAfterAStopMotion_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64067,6 +64351,7 @@
 
     CHIP_ERROR Test5aThWaitsForXSecondsAttributesUpdateOnTheDevice_27()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 1000UL;
         return WaitForMs("alpha", value);
@@ -64074,10 +64359,9 @@
 
     CHIP_ERROR Test5bIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64102,10 +64386,9 @@
 
     CHIP_ERROR Test5cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64376,6 +64659,7 @@
 
     CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -64383,10 +64667,9 @@
 
     CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -64402,6 +64685,7 @@
 
     CHIP_ERROR Test1bThWaitsFor68SecondsMovementsOnTheDevice_2()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 6000UL;
         return WaitForMs("alpha", value);
@@ -64409,10 +64693,9 @@
 
     CHIP_ERROR Test1cThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
@@ -64428,6 +64711,7 @@
 
     CHIP_ERROR Test1dThWaitsFor2SecondsMovementsOnTheDevice_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 2000UL;
         return WaitForMs("alpha", value);
@@ -64435,10 +64719,9 @@
 
     CHIP_ERROR Test1eThReadsOperationalStatusAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64456,6 +64739,7 @@
 
     CHIP_ERROR Test1dThWaitsFor2SecondsMovementsOnTheDevice_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 2000UL;
         return WaitForMs("alpha", value);
@@ -64465,10 +64749,9 @@
 
     CHIP_ERROR TestReport2SubscribeToDutReportsOnOperationalStatusAttribute_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_Test_TC_WNCV_3_3_OperationalStatus_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64486,16 +64769,15 @@
 
     CHIP_ERROR Test2SubscribeToDutReportsOnOperationalStatusAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         uint16_t minIntervalArgument = 4U;
         uint16_t maxIntervalArgument = 5U;
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
-                                                                          maxInterval:@(maxIntervalArgument)];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
+                                                                   maxInterval:@(maxIntervalArgument)];
         params.filterByFabric = true;
         params.replaceExistingSubscriptions = true;
         [cluster subscribeAttributeOperationalStatusWithParams:params
@@ -64520,10 +64802,9 @@
 
     CHIP_ERROR Test2aThSendsAStopMotionCommandToDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
@@ -64539,6 +64820,7 @@
 
     CHIP_ERROR Test2bThWaitsFor3SecondsTheEndOfInertialMovementsOnTheDevice_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 3000UL;
         return WaitForMs("alpha", value);
@@ -64546,10 +64828,9 @@
 
     CHIP_ERROR Test2cThReadsOperationalStatusAttributeFromDutAfterAStopMotion_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64570,6 +64851,7 @@
 
     CHIP_ERROR Test2dThWaitsFor100ms3sAttributesUpdateOnTheDevice_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 2000UL;
         return WaitForMs("alpha", value);
@@ -64577,10 +64859,9 @@
 
     CHIP_ERROR Test2eThReadsOperationalStatusAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64602,10 +64883,9 @@
 
     CHIP_ERROR Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -64634,10 +64914,9 @@
     CHIP_ERROR
     Test3bIfPaLfThReadsTargetPositionLiftPercent100thsAttribute3cItMustBeEqualWithCurrentPositionLiftPercent100thsFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64666,10 +64945,9 @@
 
     CHIP_ERROR Test4aIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -64698,10 +64976,9 @@
     CHIP_ERROR
     Test4bIfPaTlThReadsTargetPositionTiltPercent100thsAttribute4cItMustBeEqualWithCurrentPositionTiltPercent100thsFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64908,6 +65185,7 @@
 
     CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -64915,10 +65193,9 @@
 
     CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -64934,6 +65211,7 @@
 
     CHIP_ERROR Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
         return WaitForMs("alpha", value);
@@ -64941,10 +65219,9 @@
 
     CHIP_ERROR Test2aThSendsUpOrOpenCommandToDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
@@ -64960,6 +65237,7 @@
 
     CHIP_ERROR Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
         return WaitForMs("alpha", value);
@@ -64967,10 +65245,9 @@
 
     CHIP_ERROR Test2cThReadsOperationalStatusAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -64991,10 +65268,9 @@
 
     CHIP_ERROR Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -65017,10 +65293,9 @@
 
     CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65042,10 +65317,9 @@
 
     CHIP_ERROR Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -65068,10 +65342,9 @@
 
     CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65272,6 +65545,7 @@
 
     CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -65279,10 +65553,9 @@
 
     CHIP_ERROR Test1aThSendsUpOrOpenCommandToPrepositionTheDutInTheOppositeDirection_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
@@ -65298,6 +65571,7 @@
 
     CHIP_ERROR Test1bThWaitsForFastMotionDurationSecondsMovementsOnTheDevice_2()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFastMotionDuration.HasValue() ? mFastMotionDuration.Value() : 3000UL;
         return WaitForMs("alpha", value);
@@ -65305,10 +65579,9 @@
 
     CHIP_ERROR Test2aThSendsDownOrCloseCommandToDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -65324,6 +65597,7 @@
 
     CHIP_ERROR Test2bThWaitsForFullMotionDurationSecondsMovementsOnTheDevice_4()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
         return WaitForMs("alpha", value);
@@ -65331,10 +65605,9 @@
 
     CHIP_ERROR Test2cThReadsOperationalStatusAttributeFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65355,10 +65628,9 @@
 
     CHIP_ERROR Test3aIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -65381,10 +65653,9 @@
 
     CHIP_ERROR Test3bIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65406,10 +65677,9 @@
 
     CHIP_ERROR Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -65432,10 +65702,9 @@
 
     CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65711,6 +65980,7 @@
 
     CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -65718,10 +65988,9 @@
 
     CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -65737,6 +66006,7 @@
 
     CHIP_ERROR Test1bThWaitsForXSecondsMovementsOnTheDut_2()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
         return WaitForMs("alpha", value);
@@ -65744,10 +66014,9 @@
 
     CHIP_ERROR Test1cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -65768,10 +66037,9 @@
 
     CHIP_ERROR Test2aThSendsGoToLiftPercentageCommandWith25PercentToDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
@@ -65790,6 +66058,7 @@
 
     CHIP_ERROR Test2bDutUpdatesItsAttributes_5()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -65797,10 +66066,9 @@
 
     CHIP_ERROR Test2cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65822,6 +66090,7 @@
 
     CHIP_ERROR Test3aThSetATimeoutOfXMinutesForFailure_7()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
         return WaitForMs("alpha", value);
@@ -65829,10 +66098,9 @@
 
     CHIP_ERROR Test3bThReadsOperationalStatusAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65853,10 +66121,9 @@
 
     CHIP_ERROR Test3cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -65879,10 +66146,9 @@
 
     CHIP_ERROR Test3dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65904,10 +66170,9 @@
 
     CHIP_ERROR Test4aThSendsGoToLiftPercentageCommandWith7520PercentToDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
@@ -65926,6 +66191,7 @@
 
     CHIP_ERROR Test4bDutUpdatesItsAttributes_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -65933,10 +66199,9 @@
 
     CHIP_ERROR Test4cIfPaLfThReadsTargetPositionLiftPercent100thsAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionLiftPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65958,6 +66223,7 @@
 
     CHIP_ERROR Test5aThWaitsForXSecondsMovementsOnTheDut_14()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
         return WaitForMs("alpha", value);
@@ -65965,10 +66231,9 @@
 
     CHIP_ERROR Test5bThReadsOperationalStatusAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -65989,10 +66254,9 @@
 
     CHIP_ERROR Test5cIfPaLfThReadsCurrentPositionLiftPercent100thsAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -66015,10 +66279,9 @@
 
     CHIP_ERROR Test5dIfPaLfThReadsCurrentPositionLiftPercentageOptionalAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -66294,6 +66557,7 @@
 
     CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -66301,10 +66565,9 @@
 
     CHIP_ERROR Test1aThSendsDownOrCloseCommandToPrepositionTheDutInTheOppositeDirection_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster downOrCloseWithCompletion:^(NSError * _Nullable err) {
@@ -66320,6 +66583,7 @@
 
     CHIP_ERROR Test1bThWaitsForXSecondsMovementsOnTheDut_2()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
         return WaitForMs("alpha", value);
@@ -66327,10 +66591,9 @@
 
     CHIP_ERROR Test1cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -66351,10 +66614,9 @@
 
     CHIP_ERROR Test2aThSendsGoToTiltPercentageCommandWith30PercentToDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
@@ -66373,6 +66635,7 @@
 
     CHIP_ERROR Test2bDutUpdatesItsAttributes_5()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -66380,10 +66643,9 @@
 
     CHIP_ERROR Test2cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -66405,6 +66667,7 @@
 
     CHIP_ERROR Test3aThSetATimeoutOfXMinutesForFailure_7()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
         return WaitForMs("alpha", value);
@@ -66412,10 +66675,9 @@
 
     CHIP_ERROR Test3bThReadsOperationalStatusAttributeFromDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -66436,10 +66698,9 @@
 
     CHIP_ERROR Test3cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -66462,10 +66723,9 @@
 
     CHIP_ERROR Test3dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -66487,10 +66747,9 @@
 
     CHIP_ERROR Test4aThSendsGoToTiltPercentageCommandWith6005PercentToDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
@@ -66509,6 +66768,7 @@
 
     CHIP_ERROR Test4bDutUpdatesItsAttributes_12()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -66516,10 +66776,9 @@
 
     CHIP_ERROR Test4cIfPaTlThReadsTargetPositionTiltPercent100thsAttributeFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetPositionTiltPercent100thsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -66541,6 +66800,7 @@
 
     CHIP_ERROR Test5aThWaitsForXSecondsMovementsOnTheDut_14()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = mFullMotionDuration.HasValue() ? mFullMotionDuration.Value() : 6000UL;
         return WaitForMs("alpha", value);
@@ -66548,10 +66808,9 @@
 
     CHIP_ERROR Test5bThReadsOperationalStatusAttributeFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOperationalStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -66572,10 +66831,9 @@
 
     CHIP_ERROR Test5cIfPaTlThReadsCurrentPositionTiltPercent100thsAttributeFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -66598,10 +66856,9 @@
 
     CHIP_ERROR Test5dIfPaTlThReadsCurrentPositionTiltPercentageOptionalAttributeFromDut_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -66758,6 +67015,7 @@
 
     CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -66766,10 +67024,9 @@
 
     CHIP_ERROR Test1aIfPaLfLfThReadsCurrentPositionLiftPercent100thsFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -66798,10 +67055,9 @@
     CHIP_ERROR
     Test1b1cIfPaLfLfThReadsCurrentPositionLiftPercentageFromDutAssertCurrentPositionLiftPercent100ths100EqualsCurrentPositionLiftPercentage_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionLiftPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -66833,10 +67089,9 @@
 
     CHIP_ERROR Test2bThSendsGoToLiftPercentageCommandWithBadParamToDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
@@ -66858,10 +67113,9 @@
 
     CHIP_ERROR Test3aThSendsGoToLiftPercentageCommandWith10001ToDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
@@ -66883,10 +67137,9 @@
 
     CHIP_ERROR Test4aThSendsGoToLiftPercentageCommandWith0xFFFFToDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
@@ -67043,6 +67296,7 @@
 
     CHIP_ERROR Test0WaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -67051,10 +67305,9 @@
 
     CHIP_ERROR Test1aIfPaTlTlThReadsCurrentPositionTiltPercent100thsFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -67083,10 +67336,9 @@
     CHIP_ERROR
     Test1b1cIfPaLfLfThReadsCurrentPositionTiltPercentageFromDutAssertCurrentPositionTiltPercent100ths100EqualsCurrentPositionTiltPercentage_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentPositionTiltPercentageWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -67118,10 +67370,9 @@
 
     CHIP_ERROR Test2bThSendsGoToTiltPercentageCommandWithBadParamToDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
@@ -67143,10 +67394,9 @@
 
     CHIP_ERROR Test3aThSendsGoToTiltPercentageCommandWith10001ToDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
@@ -67168,10 +67418,9 @@
 
     CHIP_ERROR Test4aThSendsGoToTiltPercentageCommandWith0xFFFFToDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
@@ -67424,6 +67673,7 @@
 
     CHIP_ERROR Test0aWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -67431,10 +67681,9 @@
 
     CHIP_ERROR Test0bThSendsUpOrOpenCommandToPrepositionTheDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster upOrOpenWithCompletion:^(NSError * _Nullable err) {
@@ -67450,10 +67699,9 @@
 
     CHIP_ERROR Test1aIfPaLfLfThSendsGoToLiftPercentageCommandWith90ToDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToLiftPercentageParams alloc] init];
@@ -67473,6 +67721,7 @@
 
     CHIP_ERROR Test1bThWaitsFor100ms1s_3()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -67480,10 +67729,9 @@
 
     CHIP_ERROR Test1cThSendsStopMotionCommandToDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
@@ -67499,6 +67747,7 @@
 
     CHIP_ERROR Test1dThWaitsFor100ms1s_5()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 500UL;
         return WaitForMs("alpha", value);
@@ -67506,10 +67755,9 @@
 
     CHIP_ERROR Test2aIfPaTlTlThSendsGoToTiltPercentageCommandWith90ToDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRWindowCoveringClusterGoToTiltPercentageParams alloc] init];
@@ -67529,6 +67777,7 @@
 
     CHIP_ERROR Test2bThWaitsFor100ms1s_7()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 5000UL;
         return WaitForMs("alpha", value);
@@ -67536,10 +67785,9 @@
 
     CHIP_ERROR Test2cThSendsStopMotionCommandToDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster stopMotionWithCompletion:^(NSError * _Nullable err) {
@@ -67555,6 +67803,7 @@
 
     CHIP_ERROR Test2dThWaitsFor100ms1s_9()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 500UL;
         return WaitForMs("alpha", value);
@@ -67563,10 +67812,9 @@
 
     CHIP_ERROR Test3aThReadsCurrentPositionLiftPercent100thsFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -67591,10 +67839,9 @@
 
     CHIP_ERROR Test3bThReadsCurrentPositionTiltPercent100thsFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -67618,12 +67865,14 @@
 
     CHIP_ERROR Test3cRebootRestartTheDut_12()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTargetDeviceDUT_13()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message
             = chip::Span<const char>("Please reboot the DUT and enter 'y' after DUT startsgarbage: not in length on purpose", 52);
@@ -67634,6 +67883,7 @@
 
     CHIP_ERROR Test3dWaitForTheCommissionedDeviceToBeRetrieved_14()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -67641,10 +67891,9 @@
 
     CHIP_ERROR Test3eThReadsCurrentPositionLiftPercent100thsFromDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -67672,10 +67921,9 @@
 
     CHIP_ERROR Test3fThReadsCurrentPositionTiltPercent100thsFromDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWindowCovering * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device
-                                                                                           endpointID:@(1)
-                                                                                                queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWindowCovering alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -67801,6 +68049,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -67808,10 +68057,9 @@
 
     CHIP_ERROR TestReadAttributeTargetNavigatorList_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeTargetListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -67838,10 +68086,9 @@
 
     CHIP_ERROR TestReadAttributeCurrentNavigatorTarget_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentTargetWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -67862,10 +68109,9 @@
 
     CHIP_ERROR TestNavigateTargetRequestCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterTargetNavigator * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterTargetNavigator alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRTargetNavigatorClusterNavigateTargetParams alloc] init];
@@ -68008,6 +68254,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -68015,10 +68262,9 @@
 
     CHIP_ERROR TestReadAttributeAudioOutputList_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -68048,10 +68294,9 @@
 
     CHIP_ERROR TestReadAttributeCurrentAudioOutput_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentOutputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -68072,10 +68317,9 @@
 
     CHIP_ERROR TestSelectOutputCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAudioOutputClusterSelectOutputParams alloc] init];
@@ -68094,10 +68338,9 @@
 
     CHIP_ERROR TestRenameOutputCommand_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAudioOutputClusterRenameOutputParams alloc] init];
@@ -68117,10 +68360,9 @@
 
     CHIP_ERROR TestReadAttributeAudioOutputList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAudioOutput * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAudioOutput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOutputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -68262,6 +68504,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -68269,10 +68512,11 @@
 
     CHIP_ERROR TestReadAttributeApplicationLauncherList_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCatalogListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -68295,10 +68539,11 @@
 
     CHIP_ERROR TestReadAttributeApplicationLauncherApp_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentAppWithCompletion:^(
@@ -68320,10 +68565,11 @@
 
     CHIP_ERROR TestLaunchAppCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRApplicationLauncherClusterLaunchAppParams alloc] init];
@@ -68358,10 +68604,11 @@
 
     CHIP_ERROR TestStopAppCommand_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRApplicationLauncherClusterStopAppParams alloc] init];
@@ -68394,10 +68641,11 @@
 
     CHIP_ERROR TestHideAppCommand_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationLauncher * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
-                                                                                                     endpointID:@(1)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationLauncher alloc] initWithDevice:device
+                                                                               endpointID:@(1)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRApplicationLauncherClusterHideAppParams alloc] init];
@@ -68514,6 +68762,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -68521,10 +68770,9 @@
 
     CHIP_ERROR TestSendKeyCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterKeypadInput * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterKeypadInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRKeypadInputClusterSendKeyParams alloc] init];
@@ -68646,6 +68894,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -68653,10 +68902,9 @@
 
     CHIP_ERROR TestGetSetupPinCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(3)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAccountLoginClusterGetSetupPINParams alloc] init];
@@ -68681,10 +68929,9 @@
 
     CHIP_ERROR TestLoginCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(3)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAccountLoginClusterLoginParams alloc] init];
@@ -68704,10 +68951,9 @@
 
     CHIP_ERROR TestLogoutCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccountLogin * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device
-                                                                                       endpointID:@(3)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster logoutWithCompletion:^(NSError * _Nullable err) {
@@ -68807,6 +69053,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -68814,10 +69061,9 @@
 
     CHIP_ERROR TestReadMacAddress_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterWakeOnLan * cluster = [[MTRBaseClusterWakeOnLan alloc] initWithDevice:device
-                                                                                 endpointID:@(1)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterWakeOnLAN alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMACAddressWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -68971,6 +69217,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -68978,10 +69225,9 @@
 
     CHIP_ERROR TestReadAttributeVendorName_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeVendorNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -69002,10 +69248,9 @@
 
     CHIP_ERROR TestReadAttributeVendorId_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeVendorIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -69026,10 +69271,9 @@
 
     CHIP_ERROR TestReadAttributeApplicationName_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeApplicationNameWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -69050,10 +69294,9 @@
 
     CHIP_ERROR TestReadAttributeProductId_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeProductIDWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -69074,10 +69317,9 @@
 
     CHIP_ERROR TestReadAttributeApplicationStatus_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -69098,10 +69340,9 @@
 
     CHIP_ERROR TestReadAttributeApplicationStatus_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeApplicationWithCompletion:^(
@@ -69126,10 +69367,9 @@
 
     CHIP_ERROR TestReadAttributeApplicationVersion_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeApplicationVersionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -69150,10 +69390,9 @@
 
     CHIP_ERROR TestReadAttributeApplicationAllowedVendorList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterApplicationBasic * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device
-                                                                                               endpointID:@(3)
-                                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterApplicationBasic alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAllowedVendorListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -69400,6 +69639,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -69407,10 +69647,9 @@
 
     CHIP_ERROR TestReadAttributePlaybackState_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -69431,10 +69670,9 @@
 
     CHIP_ERROR TestReadAttributeStartTime_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStartTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -69456,10 +69694,9 @@
 
     CHIP_ERROR TestReadAttributeDuration_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDurationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -69481,10 +69718,9 @@
 
     CHIP_ERROR TestReadAttributePosition_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSampledPositionWithCompletion:^(
@@ -69509,10 +69745,9 @@
 
     CHIP_ERROR TestReadAttributePlaybackSpeed_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePlaybackSpeedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -69533,10 +69768,9 @@
 
     CHIP_ERROR TestReadAttributeSeekRangeEnd_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSeekRangeEndWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -69558,10 +69792,9 @@
 
     CHIP_ERROR TestReadAttributeSeekRangeStart_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSeekRangeStartWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -69583,10 +69816,9 @@
 
     CHIP_ERROR TestMediaPlaybackPlayCommand_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster playWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -69612,10 +69844,9 @@
 
     CHIP_ERROR TestMediaPlaybackPauseCommand_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster pauseWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -69641,10 +69872,9 @@
 
     CHIP_ERROR TestMediaPlaybackStopCommand_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster stopPlaybackWithCompletion:^(
@@ -69671,10 +69901,9 @@
 
     CHIP_ERROR TestMediaPlaybackStartOverCommand_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -69701,10 +69930,9 @@
 
     CHIP_ERROR TestMediaPlaybackPreviousCommand_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -69731,10 +69959,9 @@
 
     CHIP_ERROR TestMediaPlaybackNextCommand_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster nextWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -69760,10 +69987,9 @@
 
     CHIP_ERROR TestMediaPlaybackRewindCommand_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster rewindWithCompletion:^(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable values, NSError * _Nullable err) {
@@ -69789,10 +70015,9 @@
 
     CHIP_ERROR TestMediaPlaybackFastForwardCommand_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -69819,10 +70044,9 @@
 
     CHIP_ERROR TestMediaPlaybackSkipForwardCommand_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaPlaybackClusterSkipForwardParams alloc] init];
@@ -69852,10 +70076,9 @@
 
     CHIP_ERROR TestReadAttributePositionAfterSkipForward_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSampledPositionWithCompletion:^(
@@ -69880,10 +70103,9 @@
 
     CHIP_ERROR TestMediaPlaybackSkipBackwardCommand_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaPlaybackClusterSkipBackwardParams alloc] init];
@@ -69913,10 +70135,9 @@
 
     CHIP_ERROR TestReadAttributePositionAfterSkipBackward_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSampledPositionWithCompletion:^(
@@ -69941,10 +70162,9 @@
 
     CHIP_ERROR TestMediaPlaybackSeekCommand_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaPlaybackClusterSeekParams alloc] init];
@@ -69973,10 +70193,9 @@
 
     CHIP_ERROR TestReadAttributePositionAfterSeek_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaPlayback * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device
-                                                                                         endpointID:@(3)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(3) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSampledPositionWithCompletion:^(
@@ -70120,6 +70339,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -70127,10 +70347,9 @@
 
     CHIP_ERROR TestReadAttributeChannelList_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeChannelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -70180,10 +70399,9 @@
 
     CHIP_ERROR TestReadAttributeChannelLineup_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLineupWithCompletion:^(MTRChannelClusterLineupInfo * _Nullable value, NSError * _Nullable err) {
@@ -70211,10 +70429,9 @@
 
     CHIP_ERROR TestReadAttributeCurrentChannel_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentChannelWithCompletion:^(
@@ -70242,10 +70459,9 @@
 
     CHIP_ERROR TestChangeChannelCommand_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRChannelClusterChangeChannelParams alloc] init];
@@ -70275,10 +70491,9 @@
 
     CHIP_ERROR TestChangeChannelByNumberCommand_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRChannelClusterChangeChannelByNumberParams alloc] init];
@@ -70298,10 +70513,9 @@
 
     CHIP_ERROR TestSkipChannelCommand_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterChannel * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRChannelClusterSkipChannelParams alloc] init];
@@ -70404,6 +70618,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -70411,10 +70626,9 @@
 
     CHIP_ERROR TestSleepInputStatusCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLowPower * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLowPower alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster sleepWithCompletion:^(NSError * _Nullable err) {
@@ -70535,6 +70749,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -70542,10 +70757,9 @@
 
     CHIP_ERROR TestReadAttributeAcceptHeaderList_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptHeaderWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -70568,10 +70782,9 @@
 
     CHIP_ERROR TestReadAttributeSupportedStreamingProtocols_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSupportedStreamingProtocolsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -70592,10 +70805,9 @@
 
     CHIP_ERROR TestLaunchContentCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRContentLauncherClusterLaunchContentParams alloc] init];
@@ -70644,10 +70856,9 @@
 
     CHIP_ERROR TestLaunchUrlCommand_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterContentLauncher * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device
-                                                                                             endpointID:@(1)
-                                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterContentLauncher alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRContentLauncherClusterLaunchURLParams alloc] init];
@@ -70970,6 +71181,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -70977,10 +71189,9 @@
 
     CHIP_ERROR TestReadAttributeMediaInputList_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -71011,10 +71222,9 @@
 
     CHIP_ERROR TestReadCurrentMediaInput_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentInputWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -71035,10 +71245,9 @@
 
     CHIP_ERROR TestSelectInputCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaInputClusterSelectInputParams alloc] init];
@@ -71057,10 +71266,9 @@
 
     CHIP_ERROR TestHideInputStatusCommand_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster hideInputStatusWithCompletion:^(NSError * _Nullable err) {
@@ -71076,10 +71284,9 @@
 
     CHIP_ERROR TestShowInputStatusCommand_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster showInputStatusWithCompletion:^(NSError * _Nullable err) {
@@ -71095,10 +71302,9 @@
 
     CHIP_ERROR TestRenameInputCommand_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRMediaInputClusterRenameInputParams alloc] init];
@@ -71118,10 +71324,9 @@
 
     CHIP_ERROR TestReadAttributeMediaInputList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterMediaInput * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterMediaInput alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInputListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -71271,6 +71476,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -71278,8 +71484,9 @@
 
     CHIP_ERROR TestReadAnAttribute_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -71300,12 +71507,14 @@
 
     CHIP_ERROR TestRebootTheServer_2()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestReGetOurSessionButWithoutExpiringSesssions_3()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         value.expireExistingSession.Emplace();
@@ -71315,8 +71524,9 @@
 
     CHIP_ERROR TestReadAnAttributeAgain_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -71333,6 +71543,7 @@
 
     CHIP_ERROR TestReGetOurSessionButWithoutExpiringSesssions_5()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         value.expireExistingSession.Emplace();
@@ -71342,8 +71553,9 @@
 
     CHIP_ERROR TestReadAnAttributeAThirdTime_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDataModelRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -74970,6 +75182,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -74977,10 +75190,9 @@
 
     CHIP_ERROR TestSendTestCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster testWithCompletion:^(NSError * _Nullable err) {
@@ -74996,10 +75208,9 @@
 
     CHIP_ERROR TestSendTestNotHandledCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster testNotHandledWithCompletion:^(NSError * _Nullable err) {
@@ -75016,10 +75227,9 @@
 
     CHIP_ERROR TestSendTestSpecificCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster testSpecificWithCompletion:^(
@@ -75041,10 +75251,9 @@
 
     CHIP_ERROR TestSendTestAddArgumentsCommand_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
@@ -75070,10 +75279,9 @@
 
     CHIP_ERROR TestSendFailingTestAddArgumentsCommand_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
@@ -75097,10 +75305,9 @@
 
     CHIP_ERROR TestReadAttributeBooleanDefaultValue_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75121,10 +75328,9 @@
 
     CHIP_ERROR TestWriteAttributeBooleanTrue_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id booleanArgument;
@@ -75143,10 +75349,9 @@
 
     CHIP_ERROR TestReadAttributeBooleanTrue_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75167,10 +75372,9 @@
 
     CHIP_ERROR TestWriteAttributeBooleanFalse_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id booleanArgument;
@@ -75189,10 +75393,9 @@
 
     CHIP_ERROR TestReadAttributeBooleanFalse_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75213,10 +75416,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap8DefaultValue_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75237,10 +75439,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap8MaxValue_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap8Argument;
@@ -75259,10 +75460,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap8MaxValue_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75283,10 +75483,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap8MinValue_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap8Argument;
@@ -75305,10 +75504,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap8MinValue_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75329,10 +75527,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap16DefaultValue_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75353,10 +75550,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap16MaxValue_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap16Argument;
@@ -75375,10 +75571,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap16MaxValue_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75399,10 +75594,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap16MinValue_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap16Argument;
@@ -75421,10 +75615,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap16MinValue_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75445,10 +75638,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32DefaultValue_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75469,10 +75661,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap32MaxValue_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap32Argument;
@@ -75491,10 +75682,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32MaxValue_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75515,10 +75705,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap32MinValue_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap32Argument;
@@ -75537,10 +75726,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32MinValue_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75561,10 +75749,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap64DefaultValue_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75585,10 +75772,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap64MaxValue_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap64Argument;
@@ -75607,10 +75793,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap64MaxValue_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75631,10 +75816,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap64MinValue_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap64Argument;
@@ -75653,10 +75837,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap64MinValue_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75677,10 +75860,9 @@
 
     CHIP_ERROR TestReadAttributeInt8uDefaultValue_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75701,10 +75883,9 @@
 
     CHIP_ERROR TestWriteAttributeInt8uMaxValue_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int8uArgument;
@@ -75723,10 +75904,9 @@
 
     CHIP_ERROR TestReadAttributeInt8uMaxValue_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75747,10 +75927,9 @@
 
     CHIP_ERROR TestWriteAttributeInt8uMinValue_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int8uArgument;
@@ -75769,10 +75948,9 @@
 
     CHIP_ERROR TestReadAttributeInt8uMinValue_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75793,10 +75971,9 @@
 
     CHIP_ERROR TestReadAttributeInt16uDefaultValue_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75817,10 +75994,9 @@
 
     CHIP_ERROR TestWriteAttributeInt16uMaxValue_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int16uArgument;
@@ -75839,10 +76015,9 @@
 
     CHIP_ERROR TestReadAttributeInt16uMaxValue_38()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75863,10 +76038,9 @@
 
     CHIP_ERROR TestWriteAttributeInt16uMinValue_39()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int16uArgument;
@@ -75885,10 +76059,9 @@
 
     CHIP_ERROR TestReadAttributeInt16uMinValue_40()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75909,10 +76082,9 @@
 
     CHIP_ERROR TestReadAttributeInt32uDefaultValue_41()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75933,10 +76105,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32uMaxValue_42()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32uArgument;
@@ -75955,10 +76126,9 @@
 
     CHIP_ERROR TestReadAttributeInt32uMaxValue_43()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -75979,10 +76149,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32uMinValue_44()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32uArgument;
@@ -76001,10 +76170,9 @@
 
     CHIP_ERROR TestReadAttributeInt32uMinValue_45()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76025,10 +76193,9 @@
 
     CHIP_ERROR TestReadAttributeInt64uDefaultValue_46()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76049,10 +76216,9 @@
 
     CHIP_ERROR TestWriteAttributeInt64uMaxValue_47()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int64uArgument;
@@ -76071,10 +76237,9 @@
 
     CHIP_ERROR TestReadAttributeInt64uMaxValue_48()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76095,10 +76260,9 @@
 
     CHIP_ERROR TestWriteAttributeInt64uMinValue_49()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int64uArgument;
@@ -76117,10 +76281,9 @@
 
     CHIP_ERROR TestReadAttributeInt64uMinValue_50()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76141,10 +76304,9 @@
 
     CHIP_ERROR TestReadAttributeInt8sDefaultValue_51()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76165,10 +76327,9 @@
 
     CHIP_ERROR TestWriteAttributeInt8sMaxValue_52()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int8sArgument;
@@ -76187,10 +76348,9 @@
 
     CHIP_ERROR TestReadAttributeInt8sMaxValue_53()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76211,10 +76371,9 @@
 
     CHIP_ERROR TestWriteAttributeInt8sMinValue_54()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int8sArgument;
@@ -76233,10 +76392,9 @@
 
     CHIP_ERROR TestReadAttributeInt8sMinValue_55()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76257,10 +76415,9 @@
 
     CHIP_ERROR TestWriteAttributeInt8sDefaultValue_56()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int8sArgument;
@@ -76279,10 +76436,9 @@
 
     CHIP_ERROR TestReadAttributeInt8sDefaultValue_57()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76303,10 +76459,9 @@
 
     CHIP_ERROR TestReadAttributeInt16sDefaultValue_58()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76327,10 +76482,9 @@
 
     CHIP_ERROR TestWriteAttributeInt16sMaxValue_59()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int16sArgument;
@@ -76349,10 +76503,9 @@
 
     CHIP_ERROR TestReadAttributeInt16sMaxValue_60()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76373,10 +76526,9 @@
 
     CHIP_ERROR TestWriteAttributeInt16sMinValue_61()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int16sArgument;
@@ -76395,10 +76547,9 @@
 
     CHIP_ERROR TestReadAttributeInt16sMinValue_62()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76419,10 +76570,9 @@
 
     CHIP_ERROR TestWriteAttributeInt16sDefaultValue_63()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int16sArgument;
@@ -76441,10 +76591,9 @@
 
     CHIP_ERROR TestReadAttributeInt16sDefaultValue_64()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76465,10 +76614,9 @@
 
     CHIP_ERROR TestReadAttributeInt32sDefaultValue_65()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76489,10 +76637,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32sMaxValue_66()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32sArgument;
@@ -76511,10 +76658,9 @@
 
     CHIP_ERROR TestReadAttributeInt32sMaxValue_67()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76535,10 +76681,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32sMinValue_68()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32sArgument;
@@ -76557,10 +76702,9 @@
 
     CHIP_ERROR TestReadAttributeInt32sMinValue_69()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76581,10 +76725,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32sDefaultValue_70()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32sArgument;
@@ -76603,10 +76746,9 @@
 
     CHIP_ERROR TestReadAttributeInt32sDefaultValue_71()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76627,10 +76769,9 @@
 
     CHIP_ERROR TestReadAttributeInt64sDefaultValue_72()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76651,10 +76792,9 @@
 
     CHIP_ERROR TestWriteAttributeInt64sMaxValue_73()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int64sArgument;
@@ -76673,10 +76813,9 @@
 
     CHIP_ERROR TestReadAttributeInt64sMaxValue_74()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76697,10 +76836,9 @@
 
     CHIP_ERROR TestWriteAttributeInt64sMinValue_75()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int64sArgument;
@@ -76719,10 +76857,9 @@
 
     CHIP_ERROR TestReadAttributeInt64sMinValue_76()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76743,10 +76880,9 @@
 
     CHIP_ERROR TestWriteAttributeInt64sDefaultValue_77()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int64sArgument;
@@ -76765,10 +76901,9 @@
 
     CHIP_ERROR TestReadAttributeInt64sDefaultValue_78()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76789,10 +76924,9 @@
 
     CHIP_ERROR TestReadAttributeSingleDefaultValue_79()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76813,10 +76947,9 @@
 
     CHIP_ERROR TestWriteAttributeSingleMediumValue_80()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id floatSingleArgument;
@@ -76835,10 +76968,9 @@
 
     CHIP_ERROR TestReadAttributeSingleMediumValue_81()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76859,10 +76991,9 @@
 
     CHIP_ERROR TestWriteAttributeSingleLargeValue_82()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id floatSingleArgument;
@@ -76881,10 +77012,9 @@
 
     CHIP_ERROR TestReadAttributeSingleLargeValue_83()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76905,10 +77035,9 @@
 
     CHIP_ERROR TestWriteAttributeSingleSmallValue_84()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id floatSingleArgument;
@@ -76927,10 +77056,9 @@
 
     CHIP_ERROR TestReadAttributeSingleSmallValue_85()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76951,10 +77079,9 @@
 
     CHIP_ERROR TestWriteAttributeSingleDefaultValue_86()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id floatSingleArgument;
@@ -76973,10 +77100,9 @@
 
     CHIP_ERROR TestReadAttributeSingleDefaultValue_87()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -76997,10 +77123,9 @@
 
     CHIP_ERROR TestReadAttributeDoubleDefaultValue_88()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77021,10 +77146,9 @@
 
     CHIP_ERROR TestWriteAttributeDoubleMediumValue_89()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id floatDoubleArgument;
@@ -77043,10 +77167,9 @@
 
     CHIP_ERROR TestReadAttributeDoubleMediumValue_90()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77067,10 +77190,9 @@
 
     CHIP_ERROR TestWriteAttributeDoubleLargeValue_91()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id floatDoubleArgument;
@@ -77089,10 +77211,9 @@
 
     CHIP_ERROR TestReadAttributeDoubleLargeValue_92()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77113,10 +77234,9 @@
 
     CHIP_ERROR TestWriteAttributeDoubleSmallValue_93()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id floatDoubleArgument;
@@ -77135,10 +77255,9 @@
 
     CHIP_ERROR TestReadAttributeDoubleSmallValue_94()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77159,10 +77278,9 @@
 
     CHIP_ERROR TestWriteAttributeDoubleDefaultValue_95()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id floatDoubleArgument;
@@ -77181,10 +77299,9 @@
 
     CHIP_ERROR TestReadAttributeDoubleDefaultValue_96()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77205,10 +77322,9 @@
 
     CHIP_ERROR TestReadAttributeEnum8DefaultValue_97()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77229,10 +77345,9 @@
 
     CHIP_ERROR TestWriteAttributeEnum8MaxValue_98()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id enum8Argument;
@@ -77251,10 +77366,9 @@
 
     CHIP_ERROR TestReadAttributeEnum8MaxValue_99()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77275,10 +77389,9 @@
 
     CHIP_ERROR TestWriteAttributeEnum8MinValue_100()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id enum8Argument;
@@ -77297,10 +77410,9 @@
 
     CHIP_ERROR TestReadAttributeEnum8MinValue_101()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77321,10 +77433,9 @@
 
     CHIP_ERROR TestReadAttributeEnum16DefaultValue_102()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77345,10 +77456,9 @@
 
     CHIP_ERROR TestWriteAttributeEnum16MaxValue_103()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id enum16Argument;
@@ -77367,10 +77477,9 @@
 
     CHIP_ERROR TestReadAttributeEnum16MaxValue_104()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77391,10 +77500,9 @@
 
     CHIP_ERROR TestWriteAttributeEnum16MinValue_105()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id enum16Argument;
@@ -77413,10 +77521,9 @@
 
     CHIP_ERROR TestReadAttributeEnum16MinValue_106()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -77437,10 +77544,9 @@
 
     CHIP_ERROR TestReadAttributeOctetStringDefaultValue_107()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -77461,10 +77567,9 @@
 
     CHIP_ERROR TestWriteAttributeOctetStringWithEmbeddedNull_108()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id octetStringArgument;
@@ -77483,10 +77588,9 @@
 
     CHIP_ERROR TestReadAttributeOctetStringWithEmbeddedNull_109()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -77508,10 +77612,9 @@
 
     CHIP_ERROR TestWriteAttributeOctetStringWithHexFormat_110()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id octetStringArgument;
@@ -77530,10 +77633,9 @@
 
     CHIP_ERROR TestReadAttributeOctetStringWithHexFormat_111()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -77555,10 +77657,9 @@
 
     CHIP_ERROR TestWriteAttributeOctetStringWithWeirdChars_112()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id octetStringArgument;
@@ -77577,10 +77678,9 @@
 
     CHIP_ERROR TestReadAttributeOctetStringWithWeirdChars_113()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -77602,10 +77702,9 @@
 
     CHIP_ERROR TestWriteAttributeOctetString_114()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id octetStringArgument;
@@ -77624,10 +77723,9 @@
 
     CHIP_ERROR TestReadAttributeOctetString_115()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -77649,10 +77747,9 @@
 
     CHIP_ERROR TestWriteAttributeOctetString_116()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id octetStringArgument;
@@ -77675,10 +77772,9 @@
 
     CHIP_ERROR TestReadAttributeOctetString_117()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -77700,10 +77796,9 @@
 
     CHIP_ERROR TestWriteAttributeOctetString_118()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id octetStringArgument;
@@ -77722,10 +77817,9 @@
 
     CHIP_ERROR TestReadAttributeLongOctetStringDefaultValue_119()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLongOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -77746,10 +77840,9 @@
 
     CHIP_ERROR TestWriteAttributeLongOctetString_120()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id longOctetStringArgument;
@@ -77772,10 +77865,9 @@
 
     CHIP_ERROR TestReadAttributeLongOctetString_121()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLongOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -77802,10 +77894,9 @@
 
     CHIP_ERROR TestWriteAttributeLongOctetString_122()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id longOctetStringArgument;
@@ -77824,10 +77915,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringDefaultValue_123()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -77848,10 +77938,9 @@
 
     CHIP_ERROR TestWriteAttributeCharString_124()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -77870,10 +77959,9 @@
 
     CHIP_ERROR TestReadAttributeCharString_125()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -77894,10 +77982,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringValueTooLong_126()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -77920,10 +78007,9 @@
 
     CHIP_ERROR TestReadAttributeCharString_127()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -77944,10 +78030,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringEmpty_128()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -77966,10 +78051,9 @@
 
     CHIP_ERROR TestReadAttributeLongCharStringDefaultValue_129()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLongCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -77990,10 +78074,9 @@
 
     CHIP_ERROR TestWriteAttributeLongCharString_130()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id longCharStringArgument;
@@ -78015,10 +78098,9 @@
 
     CHIP_ERROR TestReadAttributeLongCharString_131()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLongCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -78042,10 +78124,9 @@
 
     CHIP_ERROR TestWriteAttributeLongCharString_132()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id longCharStringArgument;
@@ -78064,10 +78145,9 @@
 
     CHIP_ERROR TestReadAttributeListLongOctetStringForChunkedRead_133()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListLongOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -78124,10 +78204,9 @@
 
     CHIP_ERROR TestWriteAttributeListLongOctetStringForChunkedWrite_134()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id listLongOctetStringArgument;
@@ -78190,10 +78269,9 @@
 
     CHIP_ERROR TestReadAttributeListLongOctetStringForChunkedRead_135()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListLongOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -78259,10 +78337,9 @@
 
     CHIP_ERROR TestReadAttributeEpochUsDefaultValue_136()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -78283,10 +78360,9 @@
 
     CHIP_ERROR TestWriteAttributeEpochUsMaxValue_137()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id epochUsArgument;
@@ -78305,10 +78381,9 @@
 
     CHIP_ERROR TestReadAttributeEpochUsMaxValue_138()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -78329,10 +78404,9 @@
 
     CHIP_ERROR TestWriteAttributeEpochUsMinValue_139()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id epochUsArgument;
@@ -78351,10 +78425,9 @@
 
     CHIP_ERROR TestReadAttributeEpochUsMinValue_140()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -78375,10 +78448,9 @@
 
     CHIP_ERROR TestReadAttributeEpochSDefaultValue_141()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -78399,10 +78471,9 @@
 
     CHIP_ERROR TestWriteAttributeEpochSMaxValue_142()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id epochSArgument;
@@ -78421,10 +78492,9 @@
 
     CHIP_ERROR TestReadAttributeEpochSMaxValue_143()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -78445,10 +78515,9 @@
 
     CHIP_ERROR TestWriteAttributeEpochSMinValue_144()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id epochSArgument;
@@ -78467,10 +78536,9 @@
 
     CHIP_ERROR TestReadAttributeEpochSMinValue_145()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -78491,10 +78559,9 @@
 
     CHIP_ERROR TestReadAttributeUnsupported_146()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeUnsupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -78520,10 +78587,9 @@
 
     CHIP_ERROR TestWriteattributeUnsupported_147()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id unsupportedArgument;
@@ -78547,10 +78613,9 @@
 
     CHIP_ERROR TestSendTestCommandToUnsupportedEndpoint_148()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(200)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(200) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster testWithCompletion:^(NSError * _Nullable err) {
@@ -78567,10 +78632,9 @@
 
     CHIP_ERROR TestSendTestCommandToUnsupportedCluster_149()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(0)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster testWithCompletion:^(NSError * _Nullable err) {
@@ -78587,10 +78651,9 @@
 
     CHIP_ERROR TestReadAttributeVendorIdDefaultValue_150()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -78611,10 +78674,9 @@
 
     CHIP_ERROR TestWriteAttributeVendorId_151()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id vendorIdArgument;
@@ -78633,10 +78695,9 @@
 
     CHIP_ERROR TestReadAttributeVendorId_152()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -78657,10 +78718,9 @@
 
     CHIP_ERROR TestRestoreAttributeVendorId_153()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id vendorIdArgument;
@@ -78679,10 +78739,9 @@
 
     CHIP_ERROR TestSendACommandWithAVendorIdAndEnum_154()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestEnumsRequestParams alloc] init];
@@ -78713,10 +78772,9 @@
 
     CHIP_ERROR TestSendACommandWithAVendorIdAndInvalidEnum_155()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestEnumsRequestParams alloc] init];
@@ -78747,10 +78805,9 @@
 
     CHIP_ERROR TestSendTestCommandWithStructArgumentAndArg1bIsTrue_156()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestStructArgumentRequestParams alloc] init];
@@ -78784,10 +78841,9 @@
 
     CHIP_ERROR TestSendTestCommandWithStructArgumentAndArg1bIsFalse_157()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestStructArgumentRequestParams alloc] init];
@@ -78821,10 +78877,9 @@
 
     CHIP_ERROR TestSendTestCommandWithNestedStructArgumentAndArg1cbIsTrue_158()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestNestedStructArgumentRequestParams alloc] init];
@@ -78871,10 +78926,9 @@
 
     CHIP_ERROR TestSendTestCommandWithNestedStructArgumentArg1cbIsFalse_159()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestNestedStructArgumentRequestParams alloc] init];
@@ -78920,10 +78974,9 @@
 
     CHIP_ERROR TestSendTestCommandWithNestedStructListArgumentAndAllFieldsBOfArg1dAreTrue_160()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestNestedStructListArgumentRequestParams alloc] init];
@@ -79014,10 +79067,9 @@
 
     CHIP_ERROR TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfArg1dAreFalse_161()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestNestedStructListArgumentRequestParams alloc] init];
@@ -79108,10 +79160,9 @@
 
     CHIP_ERROR TestSendTestCommandWithStructArgumentAndSeeWhatWeGetBack_162()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterSimpleStructEchoRequestParams alloc] init];
@@ -79162,10 +79213,9 @@
 
     CHIP_ERROR TestSendTestCommandWithListOfInt8uAndNoneOfThemIsSetTo0_163()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestListInt8UArgumentRequestParams alloc] init];
@@ -79204,10 +79254,9 @@
 
     CHIP_ERROR TestSendTestCommandWithListOfInt8uAndOneOfThemIsSetTo0_164()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestListInt8UArgumentRequestParams alloc] init];
@@ -79247,10 +79296,9 @@
 
     CHIP_ERROR TestSendTestCommandWithListOfInt8uAndGetItReversed_165()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestListInt8UReverseRequestParams alloc] init];
@@ -79297,10 +79345,9 @@
 
     CHIP_ERROR TestSendTestCommandWithEmptyListOfInt8uAndGetAnEmptyListBack_166()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestListInt8UReverseRequestParams alloc] init];
@@ -79330,10 +79377,9 @@
 
     CHIP_ERROR TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsTrue_167()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestListStructArgumentRequestParams alloc] init];
@@ -79383,10 +79429,9 @@
 
     CHIP_ERROR TestSendTestCommandWithListOfStructArgumentAndArg1bOfFirstItemIsFalse_168()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestListStructArgumentRequestParams alloc] init];
@@ -79436,10 +79481,9 @@
 
     CHIP_ERROR TestSendTestCommandWithListOfNestedStructListArgumentAndAllFieldsBOfElementsOfArg1dAreTrue_169()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestListNestedStructListArgumentRequestParams alloc] init];
@@ -79536,10 +79580,9 @@
 
     CHIP_ERROR TestSendTestCommandWithNestedStructListArgumentAndSomeFieldsBOfElementsOfArg1dAreFalse_170()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestListNestedStructListArgumentRequestParams alloc] init];
@@ -79636,10 +79679,9 @@
 
     CHIP_ERROR TestWriteAttributeListWithListOfInt8uAndNoneOfThemIsSetTo0_171()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id listInt8uArgument;
@@ -79666,10 +79708,9 @@
 
     CHIP_ERROR TestReadAttributeListWithListOfInt8u_172()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -79694,10 +79735,9 @@
 
     CHIP_ERROR TestWriteAttributeListWithListOfOctetString_173()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id listOctetStringArgument;
@@ -79723,10 +79763,9 @@
 
     CHIP_ERROR TestReadAttributeListWithListOfOctetString_174()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -79751,10 +79790,9 @@
 
     CHIP_ERROR TestWriteAttributeListWithListOfListStructOctetString_175()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id listStructOctetStringArgument;
@@ -79794,10 +79832,9 @@
 
     CHIP_ERROR TestReadAttributeListWithListOfListStructOctetString_176()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListStructOctetStringWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -79830,10 +79867,9 @@
 
     CHIP_ERROR TestSendTestCommandWithOptionalArgSet_177()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestNullableOptionalRequestParams alloc] init];
@@ -79874,10 +79910,9 @@
 
     CHIP_ERROR TestSendTestCommandWithoutItsOptionalArg_178()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestNullableOptionalRequestParams alloc] init];
@@ -79901,10 +79936,9 @@
 
     CHIP_ERROR TestReadListOfStructsContainingNullablesAndOptionals_179()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListNullablesAndOptionalsStructWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -79933,10 +79967,9 @@
 
     CHIP_ERROR TestWriteListOfStructsContainingNullablesAndOptionals_180()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id listNullablesAndOptionalsStructArgument;
@@ -79971,10 +80004,9 @@
 
     CHIP_ERROR TestReadListOfStructsContainingNullablesAndOptionalsAfterWriting_181()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListNullablesAndOptionalsStructWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -80010,10 +80042,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBooleanNull_182()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBooleanArgument;
@@ -80033,10 +80064,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBooleanNull_183()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80060,10 +80090,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBooleanTrue_184()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBooleanArgument;
@@ -80082,10 +80111,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBooleanTrue_185()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80107,10 +80135,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBooleanNotNull_186()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80130,10 +80157,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap8MaxValue_187()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap8Argument;
@@ -80152,10 +80178,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap8MaxValue_188()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80177,10 +80202,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap8InvalidValue_189()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap8Argument;
@@ -80204,10 +80228,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap8UnchangedValue_190()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80232,10 +80255,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap8NullValue_191()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap8Argument;
@@ -80254,10 +80276,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap8NullValue_192()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80278,10 +80299,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap8Not254Value_193()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80301,10 +80321,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap16MaxValue_194()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap16Argument;
@@ -80323,10 +80342,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap16MaxValue_195()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80348,10 +80366,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap16InvalidValue_196()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap16Argument;
@@ -80374,10 +80391,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap16UnchangedValue_197()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80399,10 +80415,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap16NullValue_198()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap16Argument;
@@ -80421,10 +80436,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap16NullValue_199()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80445,10 +80459,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap32MaxValue_200()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap32Argument;
@@ -80467,10 +80480,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap32MaxValue_201()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80492,10 +80504,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap32InvalidValue_202()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap32Argument;
@@ -80518,10 +80529,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap32UnchangedValue_203()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80543,10 +80553,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap32NullValue_204()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap32Argument;
@@ -80565,10 +80574,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap32NullValue_205()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80589,10 +80597,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap64MaxValue_206()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap64Argument;
@@ -80611,10 +80618,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap64MaxValue_207()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80636,10 +80642,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap64InvalidValue_208()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap64Argument;
@@ -80662,10 +80667,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap64UnchangedValue_209()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80687,10 +80691,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableBitmap64NullValue_210()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableBitmap64Argument;
@@ -80709,10 +80712,9 @@
 
     CHIP_ERROR TestReadAttributeNullableBitmap64NullValue_211()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80733,10 +80735,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt8uMinValue_212()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt8uArgument;
@@ -80755,10 +80756,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8uMinValue_213()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80780,10 +80780,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt8uMaxValue_214()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt8uArgument;
@@ -80802,10 +80801,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8uMaxValue_215()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80827,10 +80825,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt8uInvalidValue_216()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt8uArgument;
@@ -80853,10 +80850,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8uUnchangedValue_217()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80878,10 +80874,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8uUnchangedValueWithConstraint_218()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80901,10 +80896,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt8uNullValue_219()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt8uArgument;
@@ -80923,10 +80917,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8uNullValue_220()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80947,10 +80940,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8uNullValueRange_221()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80972,10 +80964,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8uNullValueNot_222()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -80995,10 +80986,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt8uValue_223()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt8uArgument;
@@ -81017,10 +81007,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8uValueInRange_224()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81042,10 +81031,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8uNotValueOk_225()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81065,10 +81053,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt16uMinValue_226()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt16uArgument;
@@ -81087,10 +81074,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16uMinValue_227()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81112,10 +81098,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt16uMaxValue_228()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt16uArgument;
@@ -81134,10 +81119,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16uMaxValue_229()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81159,10 +81143,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt16uInvalidValue_230()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt16uArgument;
@@ -81185,10 +81168,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16uUnchangedValue_231()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81210,10 +81192,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt16uNullValue_232()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt16uArgument;
@@ -81232,10 +81213,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16uNullValue_233()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81256,10 +81236,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16uNullValueRange_234()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81281,10 +81260,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16uNullValueNot_235()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81304,10 +81282,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt16uValue_236()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt16uArgument;
@@ -81326,10 +81303,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16uValueInRange_237()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81351,10 +81327,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16uNotValueOk_238()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81374,10 +81349,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt32uMinValue_239()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt32uArgument;
@@ -81396,10 +81370,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32uMinValue_240()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81421,10 +81394,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt32uMaxValue_241()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt32uArgument;
@@ -81443,10 +81415,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32uMaxValue_242()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81468,10 +81439,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt32uInvalidValue_243()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt32uArgument;
@@ -81494,10 +81464,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32uUnchangedValue_244()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81519,10 +81488,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt32uNullValue_245()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt32uArgument;
@@ -81541,10 +81509,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32uNullValue_246()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81565,10 +81532,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32uNullValueRange_247()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81590,10 +81556,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32uNullValueNot_248()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81613,10 +81578,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt32uValue_249()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt32uArgument;
@@ -81635,10 +81599,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32uValueInRange_250()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81660,10 +81623,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32uNotValueOk_251()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81683,10 +81645,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt64uMinValue_252()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt64uArgument;
@@ -81705,10 +81666,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64uMinValue_253()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81730,10 +81690,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt64uMaxValue_254()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt64uArgument;
@@ -81752,10 +81711,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64uMaxValue_255()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81777,10 +81735,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt64uInvalidValue_256()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt64uArgument;
@@ -81803,10 +81760,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64uUnchangedValue_257()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81828,10 +81784,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt64uNullValue_258()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt64uArgument;
@@ -81850,10 +81805,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64uNullValue_259()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81874,10 +81828,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64uNullValueRange_260()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81900,10 +81853,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64uNullValueNot_261()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81923,10 +81875,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt64uValue_262()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt64uArgument;
@@ -81945,10 +81896,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64uValueInRange_263()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81971,10 +81921,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64uNotValueOk_264()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -81994,10 +81943,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt8sMinValue_265()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt8sArgument;
@@ -82016,10 +81964,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8sMinValue_266()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82041,10 +81988,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt8sInvalidValue_267()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt8sArgument;
@@ -82067,10 +82013,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8sUnchangedValue_268()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82092,10 +82037,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt8sNullValue_269()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt8sArgument;
@@ -82114,10 +82058,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8sNullValue_270()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82138,10 +82081,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8sNullValueRange_271()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82163,10 +82105,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8sNullValueNot_272()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82186,10 +82127,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt8sValue_273()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt8sArgument;
@@ -82208,10 +82148,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8sValueInRange_274()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82233,10 +82172,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt8sNotValueOk_275()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82256,10 +82194,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt16sMinValue_276()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt16sArgument;
@@ -82278,10 +82215,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16sMinValue_277()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82303,10 +82239,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt16sInvalidValue_278()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt16sArgument;
@@ -82329,10 +82264,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16sUnchangedValue_279()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82354,10 +82288,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt16sNullValue_280()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt16sArgument;
@@ -82376,10 +82309,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16sNullValue_281()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82400,10 +82332,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16sNullValueRange_282()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82425,10 +82356,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16sNullValueNot_283()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82448,10 +82378,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt16sValue_284()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt16sArgument;
@@ -82470,10 +82399,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16sValueInRange_285()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82495,10 +82423,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt16sNotValueOk_286()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82518,10 +82445,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt32sMinValue_287()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt32sArgument;
@@ -82540,10 +82466,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32sMinValue_288()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82565,10 +82490,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt32sInvalidValue_289()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt32sArgument;
@@ -82591,10 +82515,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32sUnchangedValue_290()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82616,10 +82539,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt32sNullValue_291()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt32sArgument;
@@ -82638,10 +82560,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32sNullValue_292()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82662,10 +82583,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32sNullValueRange_293()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82687,10 +82607,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32sNullValueNot_294()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82710,10 +82629,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt32sValue_295()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt32sArgument;
@@ -82732,10 +82650,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32sValueInRange_296()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82757,10 +82674,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt32sNotValueOk_297()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82780,10 +82696,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt64sMinValue_298()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt64sArgument;
@@ -82802,10 +82717,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64sMinValue_299()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82827,10 +82741,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt64sInvalidValue_300()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt64sArgument;
@@ -82853,10 +82766,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64sUnchangedValue_301()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82878,10 +82790,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt64sNullValue_302()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt64sArgument;
@@ -82900,10 +82811,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64sNullValue_303()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82924,10 +82834,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64sNullValueRange_304()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82949,10 +82858,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64sNullValueNot_305()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -82972,10 +82880,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableInt64sValue_306()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableInt64sArgument;
@@ -82994,10 +82901,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64sValueInRange_307()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83019,10 +82925,9 @@
 
     CHIP_ERROR TestReadAttributeNullableInt64sNotValueOk_308()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83042,10 +82947,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableSingleMediumValue_309()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatSingleArgument;
@@ -83064,10 +82968,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSingleMediumValue_310()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83089,10 +82992,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableSingleLargestValue_311()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatSingleArgument;
@@ -83111,10 +83013,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSingleLargestValue_312()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83136,10 +83037,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableSingleSmallestValue_313()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatSingleArgument;
@@ -83158,10 +83058,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSingleSmallestValue_314()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83183,10 +83082,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableSingleNullValue_315()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatSingleArgument;
@@ -83205,10 +83103,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSingleNullValue_316()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83229,10 +83126,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableSingle0Value_317()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatSingleArgument;
@@ -83251,10 +83147,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSingle0Value_318()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatSingleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83276,10 +83171,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableDoubleMediumValue_319()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatDoubleArgument;
@@ -83298,10 +83192,9 @@
 
     CHIP_ERROR TestReadAttributeNullableDoubleMediumValue_320()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83323,10 +83216,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableDoubleLargestValue_321()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatDoubleArgument;
@@ -83345,10 +83237,9 @@
 
     CHIP_ERROR TestReadAttributeNullableDoubleLargestValue_322()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83370,10 +83261,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableDoubleSmallestValue_323()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatDoubleArgument;
@@ -83392,10 +83282,9 @@
 
     CHIP_ERROR TestReadAttributeNullableDoubleSmallestValue_324()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83417,10 +83306,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableDoubleNullValue_325()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatDoubleArgument;
@@ -83439,10 +83327,9 @@
 
     CHIP_ERROR TestReadAttributeNullableDoubleNullValue_326()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83463,10 +83350,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableDouble0Value_327()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableFloatDoubleArgument;
@@ -83485,10 +83371,9 @@
 
     CHIP_ERROR TestReadAttributeNullableDouble0Value_328()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableFloatDoubleWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83510,10 +83395,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableEnum8MinValue_329()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnum8Argument;
@@ -83532,10 +83416,9 @@
 
     CHIP_ERROR TestReadAttributeNullableEnum8MinValue_330()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83557,10 +83440,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableEnum8MaxValue_331()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnum8Argument;
@@ -83579,10 +83461,9 @@
 
     CHIP_ERROR TestReadAttributeNullableEnum8MaxValue_332()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83604,10 +83485,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableEnum8InvalidValue_333()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnum8Argument;
@@ -83630,10 +83510,9 @@
 
     CHIP_ERROR TestReadAttributeNullableEnum8UnchangedValue_334()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83655,10 +83534,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableEnum8NullValue_335()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnum8Argument;
@@ -83677,10 +83555,9 @@
 
     CHIP_ERROR TestReadAttributeNullableEnum8NullValue_336()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83701,10 +83578,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableEnum16MinValue_337()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnum16Argument;
@@ -83723,10 +83599,9 @@
 
     CHIP_ERROR TestReadAttributeNullableEnum16MinValue_338()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83748,10 +83623,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableEnum16MaxValue_339()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnum16Argument;
@@ -83770,10 +83644,9 @@
 
     CHIP_ERROR TestReadAttributeNullableEnum16MaxValue_340()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83795,10 +83668,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableEnum16InvalidValue_341()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnum16Argument;
@@ -83821,10 +83693,9 @@
 
     CHIP_ERROR TestReadAttributeNullableEnum16UnchangedValue_342()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83846,10 +83717,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableEnum16NullValue_343()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnum16Argument;
@@ -83868,10 +83738,9 @@
 
     CHIP_ERROR TestReadAttributeNullableEnum16NullValue_344()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83892,10 +83761,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableSimpleEnumMinValue_345()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnumAttrArgument;
@@ -83914,10 +83782,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSimpleEnumMinValue_346()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83939,10 +83806,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableSimpleEnumMaxValue_347()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnumAttrArgument;
@@ -83961,10 +83827,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSimpleEnumMaxValue_348()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -83986,10 +83851,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableSimpleEnumInvalidValue_349()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnumAttrArgument;
@@ -84013,10 +83877,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSimpleEnumUnchangedValue_350()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -84041,10 +83904,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableSimpleEnumNullValue_351()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableEnumAttrArgument;
@@ -84063,10 +83925,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSimpleEnumNullValue_352()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -84087,10 +83948,9 @@
 
     CHIP_ERROR TestReadAttributeNullableSimpleEnumNot3Value_353()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableEnumAttrWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -84110,10 +83970,9 @@
 
     CHIP_ERROR TestReadAttributeNullableOctetStringDefaultValue_354()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -84136,10 +83995,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableOctetString_355()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableOctetStringArgument;
@@ -84159,10 +84017,9 @@
 
     CHIP_ERROR TestReadAttributeNullableOctetString_356()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -84188,10 +84045,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableOctetString_357()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableOctetStringArgument;
@@ -84210,10 +84066,9 @@
 
     CHIP_ERROR TestReadAttributeNullableOctetString_358()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -84234,10 +84089,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableOctetString_359()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableOctetStringArgument;
@@ -84256,10 +84110,9 @@
 
     CHIP_ERROR TestReadAttributeNullableOctetString_360()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -84282,10 +84135,9 @@
 
     CHIP_ERROR TestReadAttributeNullableOctetStringNotTestValue_361()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -84305,10 +84157,9 @@
 
     CHIP_ERROR TestReadAttributeNullableCharStringDefaultValue_362()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -84330,10 +84181,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableCharString_363()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableCharStringArgument;
@@ -84353,10 +84203,9 @@
 
     CHIP_ERROR TestReadAttributeNullableCharString_364()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -84381,10 +84230,9 @@
 
     CHIP_ERROR TestReadAttributeNullableCharString_365()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -84410,10 +84258,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableCharStringValueTooLong_366()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableCharStringArgument;
@@ -84432,10 +84279,9 @@
 
     CHIP_ERROR TestReadAttributeNullableCharString_367()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -84456,10 +84302,9 @@
 
     CHIP_ERROR TestWriteAttributeNullableCharStringEmpty_368()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableCharStringArgument;
@@ -84478,10 +84323,9 @@
 
     CHIP_ERROR TestReadAttributeNullableCharString_369()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -84503,10 +84347,9 @@
 
     CHIP_ERROR TestReadAttributeNullableCharStringNott_370()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -84526,10 +84369,9 @@
 
     CHIP_ERROR TestReadAttributeFromNonexistentEndpoint_371()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(200)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(200) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -84546,10 +84388,9 @@
 
     CHIP_ERROR TestReadAttributeFromNonexistentCluster_372()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(0)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -84566,10 +84407,9 @@
 
     CHIP_ERROR TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_373()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestSimpleOptionalArgumentRequestParams alloc] init];
@@ -84593,10 +84433,9 @@
 
     CHIP_ERROR TestSendACommandThatTakesAnOptionalParameterButDoNotSetIt_374()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestSimpleOptionalArgumentRequestParams alloc] init];
@@ -84619,10 +84458,9 @@
 
     CHIP_ERROR TestReportSubscribeToListAttribute_375()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestCluster_list_int8u_Reported = ^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -84648,16 +84486,15 @@
 
     CHIP_ERROR TestSubscribeToListAttribute_376()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         uint16_t minIntervalArgument = 2U;
         uint16_t maxIntervalArgument = 5U;
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
-                                                                          maxInterval:@(maxIntervalArgument)];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
+                                                                   maxInterval:@(maxIntervalArgument)];
         params.filterByFabric = true;
         params.replaceExistingSubscriptions = true;
         [cluster subscribeAttributeListInt8uWithParams:params
@@ -84682,10 +84519,9 @@
 
     CHIP_ERROR TestWriteSubscribedToListAttribute_377()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id listInt8uArgument;
@@ -84711,10 +84547,9 @@
 
     CHIP_ERROR TestCheckForListAttributeReport_378()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestCluster_list_int8u_Reported = ^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -84739,10 +84574,9 @@
 
     CHIP_ERROR TestReadRangeRestrictedUnsigned8BitInteger_379()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -84763,10 +84597,9 @@
 
     CHIP_ERROR TestWriteMinValueToARangeRestrictedUnsigned8BitInteger_380()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8uArgument;
@@ -84791,10 +84624,9 @@
 
     CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedUnsigned8BitInteger_381()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8uArgument;
@@ -84819,10 +84651,9 @@
 
     CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedUnsigned8BitInteger_382()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8uArgument;
@@ -84847,10 +84678,9 @@
 
     CHIP_ERROR TestWriteMaxValueToARangeRestrictedUnsigned8BitInteger_383()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8uArgument;
@@ -84875,10 +84705,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_384()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -84899,10 +84728,9 @@
 
     CHIP_ERROR TestWriteMinValidValueToARangeRestrictedUnsigned8BitInteger_385()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8uArgument;
@@ -84923,10 +84751,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_386()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -84947,10 +84774,9 @@
 
     CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedUnsigned8BitInteger_387()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8uArgument;
@@ -84971,10 +84797,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_388()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -84995,10 +84820,9 @@
 
     CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedUnsigned8BitInteger_389()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8uArgument;
@@ -85019,10 +84843,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_390()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85043,10 +84866,9 @@
 
     CHIP_ERROR TestReadRangeRestrictedUnsigned16BitInteger_391()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85067,10 +84889,9 @@
 
     CHIP_ERROR TestWriteMinValueToARangeRestrictedUnsigned16BitInteger_392()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16uArgument;
@@ -85095,10 +84916,9 @@
 
     CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedUnsigned16BitInteger_393()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16uArgument;
@@ -85123,10 +84943,9 @@
 
     CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedUnsigned16BitInteger_394()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16uArgument;
@@ -85151,10 +84970,9 @@
 
     CHIP_ERROR TestWriteMaxValueToARangeRestrictedUnsigned16BitInteger_395()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16uArgument;
@@ -85179,10 +84997,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_396()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85203,10 +85020,9 @@
 
     CHIP_ERROR TestWriteMinValidValueToARangeRestrictedUnsigned16BitInteger_397()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16uArgument;
@@ -85227,10 +85043,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_398()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85251,10 +85066,9 @@
 
     CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedUnsigned16BitInteger_399()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16uArgument;
@@ -85275,10 +85089,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_400()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85299,10 +85112,9 @@
 
     CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedUnsigned16BitInteger_401()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16uArgument;
@@ -85323,10 +85135,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_402()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85347,10 +85158,9 @@
 
     CHIP_ERROR TestReadRangeRestrictedSigned8BitInteger_403()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85371,10 +85181,9 @@
 
     CHIP_ERROR TestWriteMinValueToARangeRestrictedSigned8BitInteger_404()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8sArgument;
@@ -85398,10 +85207,9 @@
 
     CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedSigned8BitInteger_405()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8sArgument;
@@ -85426,10 +85234,9 @@
 
     CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedSigned8BitInteger_406()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8sArgument;
@@ -85454,10 +85261,9 @@
 
     CHIP_ERROR TestWriteMaxValueToARangeRestrictedSigned8BitInteger_407()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8sArgument;
@@ -85481,10 +85287,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueHasNotChanged_408()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85505,10 +85310,9 @@
 
     CHIP_ERROR TestWriteMinValidValueToARangeRestrictedSigned8BitInteger_409()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8sArgument;
@@ -85530,10 +85334,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMinValid_410()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85554,10 +85357,9 @@
 
     CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedSigned8BitInteger_411()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8sArgument;
@@ -85579,10 +85381,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_412()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85603,10 +85404,9 @@
 
     CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedSigned8BitInteger_413()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt8sArgument;
@@ -85627,10 +85427,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedSigned8BitIntegerValueIsAtMidValid_414()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85651,10 +85450,9 @@
 
     CHIP_ERROR TestReadRangeRestrictedSigned16BitInteger_415()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85675,10 +85473,9 @@
 
     CHIP_ERROR TestWriteMinValueToARangeRestrictedSigned16BitInteger_416()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16sArgument;
@@ -85703,10 +85500,9 @@
 
     CHIP_ERROR TestWriteJustBelowRangeValueToARangeRestrictedSigned16BitInteger_417()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16sArgument;
@@ -85731,10 +85527,9 @@
 
     CHIP_ERROR TestWriteJustAboveRangeValueToARangeRestrictedSigned16BitInteger_418()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16sArgument;
@@ -85759,10 +85554,9 @@
 
     CHIP_ERROR TestWriteMaxValueToARangeRestrictedSigned16BitInteger_419()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16sArgument;
@@ -85787,10 +85581,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueHasNotChanged_420()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85811,10 +85604,9 @@
 
     CHIP_ERROR TestWriteMinValidValueToARangeRestrictedSigned16BitInteger_421()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16sArgument;
@@ -85835,10 +85627,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMinValid_422()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85859,10 +85650,9 @@
 
     CHIP_ERROR TestWriteMaxValidValueToARangeRestrictedSigned16BitInteger_423()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16sArgument;
@@ -85883,10 +85673,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_424()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85907,10 +85696,9 @@
 
     CHIP_ERROR TestWriteMiddleValidValueToARangeRestrictedSigned16BitInteger_425()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id rangeRestrictedInt16sArgument;
@@ -85931,10 +85719,9 @@
 
     CHIP_ERROR TestVerifyRangeRestrictedSigned16BitIntegerValueIsAtMidValid_426()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85955,10 +85742,9 @@
 
     CHIP_ERROR TestReadNullableRangeRestrictedUnsigned8BitInteger_427()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -85980,10 +85766,9 @@
 
     CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedUnsigned8BitInteger_428()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8uArgument;
@@ -86008,10 +85793,9 @@
 
     CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned8BitInteger_429()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8uArgument;
@@ -86036,10 +85820,9 @@
 
     CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned8BitInteger_430()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8uArgument;
@@ -86064,10 +85847,9 @@
 
     CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedUnsigned8BitInteger_431()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8uArgument;
@@ -86092,10 +85874,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueHasNotChanged_432()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86117,10 +85898,9 @@
 
     CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedUnsigned8BitInteger_433()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8uArgument;
@@ -86141,10 +85921,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMinValid_434()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86166,10 +85945,9 @@
 
     CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedUnsigned8BitInteger_435()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8uArgument;
@@ -86190,10 +85968,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMaxValid_436()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86215,10 +85992,9 @@
 
     CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned8BitInteger_437()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8uArgument;
@@ -86239,10 +86015,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsAtMidValid_438()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86264,10 +86039,9 @@
 
     CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedUnsigned8BitInteger_439()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8uArgument;
@@ -86288,10 +86062,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned8BitIntegerValueIsNull_440()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86312,10 +86085,9 @@
 
     CHIP_ERROR TestReadNullableRangeRestrictedUnsigned16BitInteger_441()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86337,10 +86109,9 @@
 
     CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedUnsigned16BitInteger_442()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16uArgument;
@@ -86365,10 +86136,9 @@
 
     CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedUnsigned16BitInteger_443()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16uArgument;
@@ -86393,10 +86163,9 @@
 
     CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedUnsigned16BitInteger_444()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16uArgument;
@@ -86421,10 +86190,9 @@
 
     CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedUnsigned16BitInteger_445()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16uArgument;
@@ -86449,10 +86217,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueHasNotChanged_446()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86474,10 +86241,9 @@
 
     CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedUnsigned16BitInteger_447()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16uArgument;
@@ -86498,10 +86264,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMinValid_448()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86523,10 +86288,9 @@
 
     CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedUnsigned16BitInteger_449()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16uArgument;
@@ -86547,10 +86311,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMaxValid_450()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86572,10 +86335,9 @@
 
     CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedUnsigned16BitInteger_451()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16uArgument;
@@ -86596,10 +86358,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsAtMidValid_452()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86621,10 +86382,9 @@
 
     CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedUnsigned16BitInteger_453()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16uArgument;
@@ -86645,10 +86405,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedUnsigned16BitIntegerValueIsNull_454()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86669,10 +86428,9 @@
 
     CHIP_ERROR TestReadNullableRangeRestrictedSigned8BitInteger_455()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86694,10 +86452,9 @@
 
     CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedSigned8BitInteger_456()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8sArgument;
@@ -86722,10 +86479,9 @@
 
     CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned8BitInteger_457()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8sArgument;
@@ -86750,10 +86506,9 @@
 
     CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned8BitInteger_458()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8sArgument;
@@ -86778,10 +86533,9 @@
 
     CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedSigned8BitInteger_459()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8sArgument;
@@ -86806,10 +86560,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueHasNotChanged_460()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86831,10 +86584,9 @@
 
     CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedSigned8BitInteger_461()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8sArgument;
@@ -86855,10 +86607,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMinValid_462()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86880,10 +86631,9 @@
 
     CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedSigned8BitInteger_463()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8sArgument;
@@ -86904,10 +86654,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMaxValid_464()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86929,10 +86678,9 @@
 
     CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedSigned8BitInteger_465()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8sArgument;
@@ -86953,10 +86701,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtMidValid_466()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -86978,10 +86725,9 @@
 
     CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedSigned8BitInteger_467()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt8sArgument;
@@ -87002,10 +86748,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned8BitIntegerValueIsAtNull_468()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -87026,10 +86771,9 @@
 
     CHIP_ERROR TestReadNullableRangeRestrictedSigned16BitInteger_469()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -87051,10 +86795,9 @@
 
     CHIP_ERROR TestWriteMinValueToANullableRangeRestrictedSigned16BitInteger_470()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16sArgument;
@@ -87079,10 +86822,9 @@
 
     CHIP_ERROR TestWriteJustBelowRangeValueToANullableRangeRestrictedSigned16BitInteger_471()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16sArgument;
@@ -87107,10 +86849,9 @@
 
     CHIP_ERROR TestWriteJustAboveRangeValueToANullableRangeRestrictedSigned16BitInteger_472()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16sArgument;
@@ -87135,10 +86876,9 @@
 
     CHIP_ERROR TestWriteMaxValueToANullableRangeRestrictedSigned16BitInteger_473()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16sArgument;
@@ -87163,10 +86903,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueHasNotChanged_474()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -87188,10 +86927,9 @@
 
     CHIP_ERROR TestWriteMinValidValueToANullableRangeRestrictedSigned16BitInteger_475()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16sArgument;
@@ -87212,10 +86950,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMinValid_476()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -87237,10 +86974,9 @@
 
     CHIP_ERROR TestWriteMaxValidValueToANullableRangeRestrictedSigned16BitInteger_477()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16sArgument;
@@ -87261,10 +86997,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMaxValid_478()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -87286,10 +87021,9 @@
 
     CHIP_ERROR TestWriteMiddleValidValueToANullableRangeRestrictedSigned16BitInteger_479()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16sArgument;
@@ -87310,10 +87044,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsAtMidValid_480()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -87335,10 +87068,9 @@
 
     CHIP_ERROR TestWriteNullValueToANullableRangeRestrictedSigned16BitInteger_481()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nullableRangeRestrictedInt16sArgument;
@@ -87359,10 +87091,9 @@
 
     CHIP_ERROR TestVerifyNullableRangeRestrictedSigned16BitIntegerValueIsNull_482()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNullableRangeRestrictedInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -87383,10 +87114,9 @@
 
     CHIP_ERROR TestWriteAttributeThatReturnsGeneralStatusOnWrite_483()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id generalErrorBooleanArgument;
@@ -87409,10 +87139,9 @@
 
     CHIP_ERROR TestWriteAttributeThatReturnsClusterSpecificStatusOnWrite_484()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id clusterErrorBooleanArgument;
@@ -87437,10 +87166,9 @@
 
     CHIP_ERROR TestReadAttributeThatReturnsGeneralStatusOnRead_485()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneralErrorBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -87457,10 +87185,9 @@
 
     CHIP_ERROR TestReadAttributeThatReturnsClusterSpecificStatusOnRead_486()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterErrorBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -87477,10 +87204,9 @@
 
     CHIP_ERROR TestReadAcceptedCommandListAttribute_487()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -87519,10 +87245,9 @@
 
     CHIP_ERROR TestReadGeneratedCommandListAttribute_488()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -87552,10 +87277,9 @@
 
     CHIP_ERROR TestWriteStructTypedAttribute_489()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id structAttrArgument;
@@ -87583,10 +87307,9 @@
 
     CHIP_ERROR TestReadStructTypedAttribute_490()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -87919,6 +87642,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -87926,10 +87650,9 @@
 
     CHIP_ERROR TestWriteAttributeListWithListOfInt8u_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id listInt8uArgument;
@@ -87955,10 +87678,9 @@
 
     CHIP_ERROR TestReadAttributeListWithPartialListOfInt8uThatShouldBeInIt_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -87978,10 +87700,9 @@
 
     CHIP_ERROR TestReadAttributeListWithPartialListOfInt8uThatShouldNotBeIncluded_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeListInt8uWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -88000,10 +87721,9 @@
 
     CHIP_ERROR TestWriteAttributeListBackToDefaultValue_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id listInt8uArgument;
@@ -88025,10 +87745,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32DefaultValue_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -88049,10 +87768,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap32WithMaskVal1AndMaskVal3_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap32Argument;
@@ -88071,10 +87789,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal2IsNotSet_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -88095,10 +87812,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal1IsSet_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -88119,10 +87835,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskVal3IsSet_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -88143,10 +87858,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32WithMaskVal1AndMaskVal3AndEnsureMaskval1AndMaskVal3AreSet_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -88167,10 +87881,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32uValue_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32uArgument;
@@ -88189,10 +87902,9 @@
 
     CHIP_ERROR TestReadAttributeInt32uValueMinValueConstraints_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -88210,10 +87922,9 @@
 
     CHIP_ERROR TestReadAttributeInt32uValueMaxValueConstraints_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -88231,10 +87942,9 @@
 
     CHIP_ERROR TestReadAttributeInt32uValueNotValueConstraints_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -88252,10 +87962,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32uValueBackToDefaultValue_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32uArgument;
@@ -88274,10 +87983,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringValue_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -88296,10 +88004,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringValueMinLengthConstraints_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -88316,10 +88023,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringValueMaxLengthConstraints_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -88336,10 +88042,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringValueStartsWithConstraints_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -88356,10 +88061,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringValueEndsWithConstraints_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -88376,10 +88080,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringValue_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -88398,10 +88101,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -88419,10 +88121,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringValue_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -88441,10 +88142,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -88462,10 +88162,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringValue_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -88484,10 +88183,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringValueIsLowerCaseIsUpperCaseConstraints_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -88505,10 +88203,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringValue_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -88527,10 +88224,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringValueIsHexStringConstraints_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -88547,10 +88243,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringValue_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -88569,10 +88264,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringValueIsHexStringConstraints_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -88589,10 +88283,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringValueBackToDefaultValue_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -88695,6 +88388,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -88702,6 +88396,7 @@
 
     CHIP_ERROR TestWait100ms_1()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -88800,6 +88495,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -88807,6 +88503,7 @@
 
     CHIP_ERROR TestLogASimpleMessage_1()
     {
+
         chip::app::Clusters::LogCommands::Commands::Log::Type value;
         value.message = chip::Span<const char>("This is a simple messagegarbage: not in length on purpose", 24);
         return Log("alpha", value);
@@ -88814,6 +88511,7 @@
 
     CHIP_ERROR TestDoASimpleUserPromptMessage_2()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("This is a simple messagegarbage: not in length on purpose", 24);
         return UserPrompt("alpha", value);
@@ -89667,6 +89365,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -89675,10 +89374,9 @@
 
     CHIP_ERROR TestSendTestAddArgumentsCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
@@ -89707,10 +89405,9 @@
 
     CHIP_ERROR TestSendTestAddArgumentsCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
@@ -89736,10 +89433,9 @@
 
     CHIP_ERROR TestSendTestAddArgumentsCommand_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
@@ -89764,10 +89460,9 @@
 
     CHIP_ERROR TestReadAttributeBooleanDefaultValue_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -89791,10 +89486,9 @@
 
     CHIP_ERROR TestWriteAttributeBooleanNotDefaultValue_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id booleanArgument;
@@ -89813,10 +89507,9 @@
 
     CHIP_ERROR TestReadAttributeBooleanNotDefaultValue_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -89834,10 +89527,9 @@
 
     CHIP_ERROR TestWriteAttributeBooleanDefaultValue_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id booleanArgument;
@@ -89856,10 +89548,9 @@
 
     CHIP_ERROR TestReadAttributeBooleanFalse_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBooleanWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -89881,10 +89572,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap8DefaultValue_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -89908,10 +89598,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap8NotDefaultValue_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap8Argument;
@@ -89930,10 +89619,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap8NotDefaultValue_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -89951,10 +89639,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap8DefaultValue_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap8Argument;
@@ -89973,10 +89660,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap8DefaultValue_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -89998,10 +89684,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap16DefaultValue_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90025,10 +89710,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap16NotDefaultValue_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap16Argument;
@@ -90047,10 +89731,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap16NotDefaultValue_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90068,10 +89751,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap16DefaultValue_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap16Argument;
@@ -90090,10 +89772,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap16DefaultValue_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90115,10 +89796,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32DefaultValue_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90142,10 +89822,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap32NotDefaultValue_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap32Argument;
@@ -90164,10 +89843,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32NotDefaultValue_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90185,10 +89863,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap32DefaultValue_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap32Argument;
@@ -90207,10 +89884,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap32DefaultValue_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap32WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90232,10 +89908,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap64DefaultValue_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90259,10 +89934,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap64NotDefaultValue_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap64Argument;
@@ -90281,10 +89955,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap64DefaultValue_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90302,10 +89975,9 @@
 
     CHIP_ERROR TestWriteAttributeBitmap64DefaultValue_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bitmap64Argument;
@@ -90324,10 +89996,9 @@
 
     CHIP_ERROR TestReadAttributeBitmap64DefaultValue_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBitmap64WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90349,10 +90020,9 @@
 
     CHIP_ERROR TestReadAttributeInt8uDefaultValue_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90376,10 +90046,9 @@
 
     CHIP_ERROR TestWriteAttributeInt8uNotDefaultValue_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int8uArgument;
@@ -90398,10 +90067,9 @@
 
     CHIP_ERROR TestReadAttributeInt8uNotDefaultValue_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90419,10 +90087,9 @@
 
     CHIP_ERROR TestWriteAttributeInt8uDefaultValue_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int8uArgument;
@@ -90441,10 +90108,9 @@
 
     CHIP_ERROR TestReadAttributeInt8uDefaultValue_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90466,10 +90132,9 @@
 
     CHIP_ERROR TestReadAttributeInt16uDefaultValue_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90493,10 +90158,9 @@
 
     CHIP_ERROR TestWriteAttributeInt16uNotDefaultValue_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int16uArgument;
@@ -90515,10 +90179,9 @@
 
     CHIP_ERROR TestReadAttributeInt16uNotDefaultValue_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90536,10 +90199,9 @@
 
     CHIP_ERROR TestWriteAttributeInt16uDefaultValue_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int16uArgument;
@@ -90558,10 +90220,9 @@
 
     CHIP_ERROR TestReadAttributeInt16uDefaultValue_38()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90583,10 +90244,9 @@
 
     CHIP_ERROR TestReadAttributeInt32uDefaultValue_39()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90610,10 +90270,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32uNotDefaultValue_40()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32uArgument;
@@ -90632,10 +90291,9 @@
 
     CHIP_ERROR TestReadAttributeInt32uNotDefaultValue_41()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90653,10 +90311,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32uDefaultValue_42()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32uArgument;
@@ -90675,10 +90332,9 @@
 
     CHIP_ERROR TestReadAttributeInt32uDefaultValue_43()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90700,10 +90356,9 @@
 
     CHIP_ERROR TestReadAttributeInt64uDefaultValue_44()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90727,10 +90382,9 @@
 
     CHIP_ERROR TestWriteAttributeInt64uNotDefaultValue_45()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int64uArgument;
@@ -90749,10 +90403,9 @@
 
     CHIP_ERROR TestReadAttributeInt64uNotDefaultValue_46()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90770,10 +90423,9 @@
 
     CHIP_ERROR TestWriteAttributeInt64uDefaultValue_47()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int64uArgument;
@@ -90792,10 +90444,9 @@
 
     CHIP_ERROR TestReadAttributeInt64uDefaultValue_48()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64uWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90817,10 +90468,9 @@
 
     CHIP_ERROR TestReadAttributeInt8sDefaultValue_49()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90844,10 +90494,9 @@
 
     CHIP_ERROR TestWriteAttributeInt8sNotDefaultValue_50()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int8sArgument;
@@ -90866,10 +90515,9 @@
 
     CHIP_ERROR TestReadAttributeInt8sNotDefaultValue_51()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90887,10 +90535,9 @@
 
     CHIP_ERROR TestWriteAttributeInt8sDefaultValue_52()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int8sArgument;
@@ -90909,10 +90556,9 @@
 
     CHIP_ERROR TestReadAttributeInt8sDefaultValue_53()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt8sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90934,10 +90580,9 @@
 
     CHIP_ERROR TestReadAttributeInt16sDefaultValue_54()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -90961,10 +90606,9 @@
 
     CHIP_ERROR TestWriteAttributeInt16sNotDefaultValue_55()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int16sArgument;
@@ -90983,10 +90627,9 @@
 
     CHIP_ERROR TestReadAttributeInt16sNotDefaultValue_56()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91004,10 +90647,9 @@
 
     CHIP_ERROR TestWriteAttributeInt16sDefaultValue_57()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int16sArgument;
@@ -91026,10 +90668,9 @@
 
     CHIP_ERROR TestReadAttributeInt16sDefaultValue_58()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt16sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91051,10 +90692,9 @@
 
     CHIP_ERROR TestReadAttributeInt32sDefaultValue_59()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91078,10 +90718,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32sNotDefaultValue_60()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32sArgument;
@@ -91100,10 +90739,9 @@
 
     CHIP_ERROR TestReadAttributeInt32sNotDefaultValue_61()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91121,10 +90759,9 @@
 
     CHIP_ERROR TestWriteAttributeInt32sDefaultValue_62()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int32sArgument;
@@ -91143,10 +90780,9 @@
 
     CHIP_ERROR TestReadAttributeInt32sDefaultValue_63()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt32sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91168,10 +90804,9 @@
 
     CHIP_ERROR TestReadAttributeInt64sDefaultValue_64()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91195,10 +90830,9 @@
 
     CHIP_ERROR TestWriteAttributeIntsNotDefaultValue_65()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int64sArgument;
@@ -91217,10 +90851,9 @@
 
     CHIP_ERROR TestReadAttributeInt64sNotDefaultValue_66()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91238,10 +90871,9 @@
 
     CHIP_ERROR TestWriteAttributeInt64sDefaultValue_67()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id int64sArgument;
@@ -91260,10 +90892,9 @@
 
     CHIP_ERROR TestReadAttributeInt64sDefaultValue_68()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeInt64sWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91285,10 +90916,9 @@
 
     CHIP_ERROR TestReadAttributeEnum8DefaultValue_69()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91312,10 +90942,9 @@
 
     CHIP_ERROR TestWriteAttributeEnum8NotDefaultValue_70()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id enum8Argument;
@@ -91334,10 +90963,9 @@
 
     CHIP_ERROR TestReadAttributeEnum8NotDefaultValue_71()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91355,10 +90983,9 @@
 
     CHIP_ERROR TestWriteAttributeEnum8DefaultValue_72()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id enum8Argument;
@@ -91377,10 +91004,9 @@
 
     CHIP_ERROR TestReadAttributeEnum8DefaultValue_73()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum8WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91402,10 +91028,9 @@
 
     CHIP_ERROR TestReadAttributeEnum16DefaultValue_74()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91429,10 +91054,9 @@
 
     CHIP_ERROR TestWriteAttributeEnum16NotDefaultValue_75()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id enum16Argument;
@@ -91451,10 +91075,9 @@
 
     CHIP_ERROR TestReadAttributeEnum16NotDefaultValue_76()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91472,10 +91095,9 @@
 
     CHIP_ERROR TestWriteAttributeEnum16DefaultValue_77()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id enum16Argument;
@@ -91494,10 +91116,9 @@
 
     CHIP_ERROR TestReadAttributeEnum16DefaultValue_78()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEnum16WithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91519,10 +91140,9 @@
 
     CHIP_ERROR TestReadAttributeEpochUsDefaultValue_79()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91546,10 +91166,9 @@
 
     CHIP_ERROR TestWriteAttributeEpochUsNotDefaultValue_80()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id epochUsArgument;
@@ -91568,10 +91187,9 @@
 
     CHIP_ERROR TestReadAttributeEpochUsNotDefaultValue_81()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91589,10 +91207,9 @@
 
     CHIP_ERROR TestWriteAttributeEpochUsDefaultValue_82()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id epochUsArgument;
@@ -91611,10 +91228,9 @@
 
     CHIP_ERROR TestReadAttributeEpochUsDefaultValue_83()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochUsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91636,10 +91252,9 @@
 
     CHIP_ERROR TestReadAttributeEpochSDefaultValue_84()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91663,10 +91278,9 @@
 
     CHIP_ERROR TestWriteAttributeEpochSNotDefaultValue_85()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id epochSArgument;
@@ -91685,10 +91299,9 @@
 
     CHIP_ERROR TestReadAttributeEpochSNotDefaultValue_86()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91706,10 +91319,9 @@
 
     CHIP_ERROR TestWriteAttributeEpochSDefaultValue_87()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id epochSArgument;
@@ -91728,10 +91340,9 @@
 
     CHIP_ERROR TestReadAttributeEpochSDefaultValue_88()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeEpochSWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91753,10 +91364,9 @@
 
     CHIP_ERROR TestReadAttributeVendorIdDefaultValue_89()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91780,10 +91390,9 @@
 
     CHIP_ERROR TestWriteAttributeVendorIdNotDefaultValue_90()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id vendorIdArgument;
@@ -91802,10 +91411,9 @@
 
     CHIP_ERROR TestReadAttributeVendorIdNotDefaultValue_91()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91823,10 +91431,9 @@
 
     CHIP_ERROR TestWriteAttributeVendorIdDefaultValue_92()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id vendorIdArgument;
@@ -91845,10 +91452,9 @@
 
     CHIP_ERROR TestReadAttributeVendorIdDefaultValue_93()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -91870,10 +91476,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringDefaultValue_94()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -91897,10 +91502,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringDefaultValueAndCompareToSavedValue_95()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -91921,10 +91525,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringNotDefaultValue_96()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -91944,10 +91547,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringNotDefaultValue_97()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -91973,10 +91575,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringNotDefaultValueAndCompareToSavedValue_98()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -91999,10 +91600,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringNotDefaultValueFromSavedValue_99()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -92021,10 +91621,9 @@
 
     CHIP_ERROR TestReadAttributeCharStringNotDefaultValueAndCompareToExpectedValue_100()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCharStringWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -92045,10 +91644,9 @@
 
     CHIP_ERROR TestWriteAttributeCharStringDefaultValue_101()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id charStringArgument;
@@ -92068,10 +91666,9 @@
 
     CHIP_ERROR TestReadAttributeOctetStringDefaultValue_102()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -92095,10 +91692,9 @@
 
     CHIP_ERROR TestReadAttributeOctetStringDefaultValueAndCompareToSavedValue_103()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -92119,10 +91715,9 @@
 
     CHIP_ERROR TestWriteAttributeOctetStringNotDefaultValue_104()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id octetStringArgument;
@@ -92142,10 +91737,9 @@
 
     CHIP_ERROR TestReadAttributeOctetStringNotDefaultValue_105()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -92172,10 +91766,9 @@
 
     CHIP_ERROR TestReadAttributeOctetStringNotDefaultValueAndCompareToSavedValue_106()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -92198,10 +91791,9 @@
 
     CHIP_ERROR TestWriteAttributeOctetStringNotDefaultValueFromSavedValue_107()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id octetStringArgument;
@@ -92221,10 +91813,9 @@
 
     CHIP_ERROR TestReadAttributeOctetStringNotDefaultValueAndCompareToExpectedValue_108()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOctetStringWithCompletion:^(NSData * _Nullable value, NSError * _Nullable err) {
@@ -92246,10 +91837,9 @@
 
     CHIP_ERROR TestWriteAttributeOctetStringDefaultValue_109()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id octetStringArgument;
@@ -92363,6 +91953,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -92371,10 +91962,9 @@
 
     CHIP_ERROR TestSendTestAddArgumentsCommand_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
@@ -92403,10 +91993,9 @@
 
     CHIP_ERROR TestSendTestAddArgumentsCommand_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUnitTesting * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device
-                                                                                     endpointID:@(1)
-                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUnitTesting alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRUnitTestingClusterTestAddArgumentsParams alloc] init];
@@ -92538,6 +92127,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -92545,10 +92135,9 @@
 
     CHIP_ERROR TestReadAttributeDeviceList_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDeviceTypeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -92571,10 +92160,9 @@
 
     CHIP_ERROR TestReadAttributeServerList_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeServerListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -92622,10 +92210,9 @@
 
     CHIP_ERROR TestReadAttributeClientList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClientListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -92647,10 +92234,9 @@
 
     CHIP_ERROR TestReadAttributePartsList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDescriptor * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device
-                                                                                   endpointID:@(0)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDescriptor alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePartsListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -92869,6 +92455,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -92876,8 +92463,9 @@
 
     CHIP_ERROR TestReadLocation_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLocationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -92898,8 +92486,9 @@
 
     CHIP_ERROR TestWriteLocation_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id locationArgument;
@@ -92918,8 +92507,9 @@
 
     CHIP_ERROR TestReadBackLocation_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLocationWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -92940,8 +92530,9 @@
 
     CHIP_ERROR TestRestoreInitialLocationValue_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id locationArgument;
@@ -92960,8 +92551,9 @@
 
     CHIP_ERROR TestReadAttributeListValue_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -93007,8 +92599,9 @@
 
     CHIP_ERROR TestReadNodeLabel_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -93029,8 +92622,9 @@
 
     CHIP_ERROR TestWriteNodeLabel_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nodeLabelArgument;
@@ -93049,8 +92643,9 @@
 
     CHIP_ERROR TestReadBackNodeLabel_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -93071,8 +92666,9 @@
 
     CHIP_ERROR TestReadLocalConfigDisabled_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -93093,8 +92689,9 @@
 
     CHIP_ERROR TestWriteLocalConfigDisabled_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id localConfigDisabledArgument;
@@ -93113,8 +92710,9 @@
 
     CHIP_ERROR TestReadBackLocalConfigDisabled_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -93135,12 +92733,14 @@
 
     CHIP_ERROR TestRebootTheDevice_12()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestConnectToTheDeviceAgain_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -93148,8 +92748,9 @@
 
     CHIP_ERROR TestReadBackNodeLabelAfterReboot_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -93170,8 +92771,9 @@
 
     CHIP_ERROR TestRestoreInitialNodeLabelValue_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nodeLabelArgument;
@@ -93190,8 +92792,9 @@
 
     CHIP_ERROR TestReadBackLocalConfigDisabledAfterReboot_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLocalConfigDisabledWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -93212,8 +92815,9 @@
 
     CHIP_ERROR TestRestoreInitialLocalConfigDisabledValue_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id localConfigDisabledArgument;
@@ -93369,6 +92973,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -93376,9 +92981,11 @@
 
     CHIP_ERROR TestReadNumberOfCommissionedFabrics_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -93401,9 +93008,11 @@
 
     CHIP_ERROR TestReadCurrentFabricIndex_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -93425,9 +93034,11 @@
 
     CHIP_ERROR TestOpenCommissioningWindowFromAlpha_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -93446,6 +93057,7 @@
 
     CHIP_ERROR TestCommissionFromBeta_4()
     {
+
         chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
         value.nodeId = 74565ULL;
         value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
@@ -93454,6 +93066,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_5()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = 74565ULL;
         return WaitForCommissionee("beta", value);
@@ -93463,9 +93076,11 @@
 
     CHIP_ERROR TestReportSubscribeFabricsAttributeFromBeta_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestFabricRemovalWhileSubscribed_Fabrics_Reported = ^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -93483,15 +93098,17 @@
 
     CHIP_ERROR TestSubscribeFabricsAttributeFromBeta_7()
     {
+
         MTRBaseDevice * device = GetDevice("beta");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         uint16_t minIntervalArgument = 2U;
         uint16_t maxIntervalArgument = 5U;
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
-                                                                          maxInterval:@(maxIntervalArgument)];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
+                                                                   maxInterval:@(maxIntervalArgument)];
         params.filterByFabric = true;
         params.replaceExistingSubscriptions = true;
         [cluster subscribeAttributeFabricsWithParams:params
@@ -93516,9 +93133,11 @@
 
     CHIP_ERROR TestRemoveSingleOwnFabric_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
@@ -93832,6 +93451,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -93839,10 +93459,11 @@
 
     CHIP_ERROR TestWriteBreadcrumb12_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id breadcrumbArgument;
@@ -93861,10 +93482,11 @@
 
     CHIP_ERROR TestReadBackBreadcrumb12_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -93885,10 +93507,11 @@
 
     CHIP_ERROR TestWriteBreadcrumb22_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id breadcrumbArgument;
@@ -93907,10 +93530,11 @@
 
     CHIP_ERROR TestReadBackBreadcrumb22_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -93931,12 +93555,14 @@
 
     CHIP_ERROR TestRebootToResetBreadcrumb_5()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestConnectToTheDeviceAgain_6()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -93944,10 +93570,11 @@
 
     CHIP_ERROR TestReadBackBreadcrumbAfterRebootAndEnsureItWasNotPersisted_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -93968,10 +93595,11 @@
 
     CHIP_ERROR TestSetBreadcrumbToNonzeroValue_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id breadcrumbArgument;
@@ -93990,10 +93618,11 @@
 
     CHIP_ERROR TestCheckBreadcrumbSetWorked_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94014,10 +93643,11 @@
 
     CHIP_ERROR TestSendCommissioningCompleteWithoutArmedFailSafe_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster commissioningCompleteWithCompletion:^(
@@ -94039,10 +93669,11 @@
 
     CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByInvalidCommissioningComplete_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94063,9 +93694,11 @@
 
     CHIP_ERROR TestOpenCommissioningWindowFromAlpha_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -94084,10 +93717,11 @@
 
     CHIP_ERROR TestTryToArmFailSafe_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
@@ -94113,10 +93747,11 @@
 
     CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithCommissioningWindowOpen_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94137,10 +93772,11 @@
 
     CHIP_ERROR TestResetBreadcrumbTo0SoWeCanCommission_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id breadcrumbArgument;
@@ -94159,6 +93795,7 @@
 
     CHIP_ERROR TestCommissionFromBeta_16()
     {
+
         chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
         value.nodeId = 74565ULL;
         value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
@@ -94167,6 +93804,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_17()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = 74565ULL;
         return WaitForCommissionee("beta", value);
@@ -94174,10 +93812,11 @@
 
     CHIP_ERROR TestArmFailSafe_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
@@ -94203,10 +93842,11 @@
 
     CHIP_ERROR TestCheckBreadcrumbWasProperlySetByArmFailSafe_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94227,10 +93867,11 @@
 
     CHIP_ERROR TestTryToArmFailSafeFromWrongFabric_20()
     {
+
         MTRBaseDevice * device = GetDevice("beta");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
@@ -94256,10 +93897,11 @@
 
     CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByArmFailSafeWithExistingFailSafeArmed_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94280,10 +93922,11 @@
 
     CHIP_ERROR TestSendCommissioningCompleteFromWrongFabric_22()
     {
+
         MTRBaseDevice * device = GetDevice("beta");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster commissioningCompleteWithCompletion:^(
@@ -94305,10 +93948,11 @@
 
     CHIP_ERROR TestCheckBreadcrumbWasNotTouchedByCommissioningCompleteFromWrongFabric_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94329,10 +93973,11 @@
 
     CHIP_ERROR TestCloseOutTheFailSafeGracefully_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster commissioningCompleteWithCompletion:^(
@@ -94354,10 +93999,11 @@
 
     CHIP_ERROR TestCheckBreadcrumbWasResetTo0ByCommissioningComplete_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94378,10 +94024,11 @@
 
     CHIP_ERROR TestArmFailSafeAgain_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
@@ -94407,10 +94054,11 @@
 
     CHIP_ERROR TestCheckBreadcrumbWasSetByArmingFailSafeAgain_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94431,10 +94079,11 @@
 
     CHIP_ERROR TestForceExpireTheFailSafe_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
@@ -94460,10 +94109,11 @@
 
     CHIP_ERROR TestCheckBreadcrumbWasResetByExpiringTheFailSafe_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeBreadcrumbWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94484,10 +94134,11 @@
 
     CHIP_ERROR TestValidatePresenceOfSupportsConcurrentConnection_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSupportsConcurrentConnectionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94588,6 +94239,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -94595,10 +94247,9 @@
 
     CHIP_ERROR TestSendIdentifyCommandAndExpectSuccessResponse_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterIdentify * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device
-                                                                               endpointID:@(0)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterIdentify alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRIdentifyClusterIdentifyParams alloc] init];
@@ -94743,6 +94394,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -94750,9 +94402,11 @@
 
     CHIP_ERROR TestReadNumberOfSupportedFabrics_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSupportedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94771,9 +94425,11 @@
 
     CHIP_ERROR TestReadNumberOfCommissionedFabrics_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94793,9 +94449,11 @@
 
     CHIP_ERROR TestReadCurrentFabricIndex_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -94817,9 +94475,11 @@
 
     CHIP_ERROR TestRemoveNonexistentFabric_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
@@ -94844,12 +94504,14 @@
 
     CHIP_ERROR TestReadFabricListBeforeSettingLabel_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster readAttributeFabricsWithParams:params
                                      completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -94875,9 +94537,11 @@
 
     CHIP_ERROR TestSetTheFabricLabel_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTROperationalCredentialsClusterUpdateFabricLabelParams alloc] init];
@@ -94907,12 +94571,14 @@
 
     CHIP_ERROR TestReadFabricListAfterSettingLabel_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster readAttributeFabricsWithParams:params
                                      completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -95234,6 +94900,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -95241,10 +94908,9 @@
 
     CHIP_ERROR TestReadDescription_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeDescriptionWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -95265,10 +94931,9 @@
 
     CHIP_ERROR TestReadStandardNamespace_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStandardNamespaceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95290,10 +94955,9 @@
 
     CHIP_ERROR TestReadSupportedModes_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSupportedModesWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -95332,10 +94996,9 @@
 
     CHIP_ERROR TestReadCurrentMode_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95356,10 +95019,9 @@
 
     CHIP_ERROR TestReadStartUpMode_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStartUpModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95381,10 +95043,9 @@
 
     CHIP_ERROR TestReadOnMode_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95405,10 +95066,9 @@
 
     CHIP_ERROR TestChangeToSupportedMode_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
@@ -95428,10 +95088,9 @@
 
     CHIP_ERROR TestVerifyCurrentModeChange_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95455,10 +95114,9 @@
 
     CHIP_ERROR TestChangeToUnsupportedMode_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
@@ -95480,8 +95138,9 @@
 
     CHIP_ERROR TestToggleOnOff_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -95497,8 +95156,9 @@
 
     CHIP_ERROR TestToggleOnOff_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -95514,10 +95174,9 @@
 
     CHIP_ERROR TestVerifyCurrentModeDoesNotChangeWhenOnModeIsNull_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95538,10 +95197,9 @@
 
     CHIP_ERROR TestChangeToUnsupportedOnMode_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onModeArgument;
@@ -95564,10 +95222,9 @@
 
     CHIP_ERROR TestChangeOnMode_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onModeArgument;
@@ -95587,10 +95244,9 @@
 
     CHIP_ERROR TestVerifyOnMode_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95615,8 +95271,9 @@
 
     CHIP_ERROR TestToggleOnOff_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -95632,8 +95289,9 @@
 
     CHIP_ERROR TestToggleOnOff_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -95649,10 +95307,9 @@
 
     CHIP_ERROR TestVerifyCurrentModeChangesIfOnModeIsNotNull_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95673,10 +95330,9 @@
 
     CHIP_ERROR TestChangeToUnsupportedStartUpMode_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id startUpModeArgument;
@@ -95699,10 +95355,9 @@
 
     CHIP_ERROR TestChangeToSupportedStartUpMode_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id startUpModeArgument;
@@ -95721,10 +95376,9 @@
 
     CHIP_ERROR TestVerifyStartUpModeChange_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeStartUpModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95746,10 +95400,9 @@
 
     CHIP_ERROR TestChangeCurrentModeToAnotherValue_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRModeSelectClusterChangeToModeParams alloc] init];
@@ -95768,10 +95421,9 @@
 
     CHIP_ERROR TestChangeOnMode_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onModeArgument;
@@ -95790,8 +95442,9 @@
 
     CHIP_ERROR TestSetStartUpOnOff_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id startUpOnOffArgument;
@@ -95810,12 +95463,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_25()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_26()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -95823,10 +95478,9 @@
 
     CHIP_ERROR TestVerifyCurrentModeChangeBasedOnOnModeAsItOverwritesStartUpMode_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -95847,10 +95501,9 @@
 
     CHIP_ERROR TestChangeOnModeToNull_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onModeArgument;
@@ -95869,12 +95522,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_29()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_30()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -95882,10 +95537,9 @@
 
     CHIP_ERROR TestVerifyCurrentModeChangeBasedOnNewStartUpMode_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterModeSelect * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterModeSelect alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -96004,6 +95658,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -96011,9 +95666,11 @@
 
     CHIP_ERROR TestReadNumberOfCommissionedFabrics_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCommissionedFabricsWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -96036,9 +95693,11 @@
 
     CHIP_ERROR TestReadCurrentFabricIndex_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -96060,9 +95719,11 @@
 
     CHIP_ERROR TestRemoveSingleOwnFabric_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
@@ -96309,6 +95970,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -96316,18 +95978,21 @@
 
     CHIP_ERROR TestStopTheDefaultAccessory_1()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
         return Stop("alpha", value);
     }
 
     CHIP_ERROR TestStartTheDefaultAccessoryWithNoCommandLineOptions_2()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         return Start("alpha", value);
     }
 
     CHIP_ERROR TestStopTheDefaultAccessoryByKey_3()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
@@ -96336,6 +96001,7 @@
 
     CHIP_ERROR TestStartTheDefaultAccessoryWithDiscriminatorCommandLineOption_4()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         value.discriminator.Emplace();
         value.discriminator.Value() = 1111U;
@@ -96344,12 +96010,14 @@
 
     CHIP_ERROR TestStopTheDefaultAccessory_5()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
         return Stop("alpha", value);
     }
 
     CHIP_ERROR TestStartTheDefaultAccessoryWithDiscriminatorAndPortCommandLineOptions_6()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         value.discriminator.Emplace();
         value.discriminator.Value() = 1111U;
@@ -96360,12 +96028,14 @@
 
     CHIP_ERROR TestStopTheDefaultAccessory_7()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
         return Stop("alpha", value);
     }
 
     CHIP_ERROR TestStartTheDefaultAccessoryWithMinCommissioningTimeoutOnly_8()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         value.minCommissioningTimeout.Emplace();
         value.minCommissioningTimeout.Value() = 10U;
@@ -96374,12 +96044,14 @@
 
     CHIP_ERROR TestStopTheDefaultAccessory_9()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
         return Stop("alpha", value);
     }
 
     CHIP_ERROR TestStartTheDefaultAccessoryByKeyWithAllCommandLineOptions_10()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
@@ -96396,6 +96068,7 @@
 
     CHIP_ERROR TestStartASecondAccessoryWithAllCommandLineOptions_11()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
@@ -96410,6 +96083,7 @@
 
     CHIP_ERROR TestCommissionSecondAccessoryFromAlpha_12()
     {
+
         chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
         value.nodeId = 3735928559ULL;
         value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0IX4122-.548G00", 22);
@@ -96418,6 +96092,7 @@
 
     CHIP_ERROR TestWaitForTheSecondCommissionedDeviceToBeRetrievedForAlpha_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = 3735928559ULL;
         return WaitForCommissionee("alpha", value);
@@ -96425,6 +96100,7 @@
 
     CHIP_ERROR TestStopTheSecondAccessory_14()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
@@ -96433,6 +96109,7 @@
 
     CHIP_ERROR TestStartASecondAccessoryWithDifferentKvs_15()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
@@ -96447,12 +96124,14 @@
 
     CHIP_ERROR TestRebootTheDefaultAccessory_16()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestRebootTheDefaultAccessoryByKey_17()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
@@ -96461,6 +96140,7 @@
 
     CHIP_ERROR TestRebootTheSecondAccessory_18()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
@@ -96469,12 +96149,14 @@
 
     CHIP_ERROR TestFactoryResetTheDefaultAccessory_19()
     {
+
         chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
         return FactoryReset("alpha", value);
     }
 
     CHIP_ERROR TestFactoryResetTheDefaultAccessoryByKey_20()
     {
+
         chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("defaultgarbage: not in length on purpose", 7);
@@ -96483,6 +96165,7 @@
 
     CHIP_ERROR TestFactoryResetTheSecondAccessory_21()
     {
+
         chip::app::Clusters::SystemCommands::Commands::FactoryReset::Type value;
         value.registerKey.Emplace();
         value.registerKey.Value() = chip::Span<const char>("chip-lock-appgarbage: not in length on purpose", 13);
@@ -96624,6 +96307,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -96631,10 +96315,9 @@
 
     CHIP_ERROR TestWriteEmptyBindingTable_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bindingArgument;
@@ -96656,13 +96339,12 @@
 
     CHIP_ERROR TestReadEmptyBindingTable_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster readAttributeBindingWithParams:params
                                      completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -96683,10 +96365,9 @@
 
     CHIP_ERROR TestWriteInvalidBindingTable_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bindingArgument;
@@ -96722,10 +96403,9 @@
 
     CHIP_ERROR TestWriteBindingTableEndpoint1_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bindingArgument;
@@ -96762,13 +96442,12 @@
 
     CHIP_ERROR TestReadBindingTableEndpoint1_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster readAttributeBindingWithParams:params
                                      completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -96807,10 +96486,9 @@
 
     CHIP_ERROR TestWriteBindingTableEndpoint0_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(0)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id bindingArgument;
@@ -96837,13 +96515,12 @@
 
     CHIP_ERROR TestReadBindingTableEndpoint0_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(0)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster readAttributeBindingWithParams:params
                                      completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -96870,13 +96547,12 @@
 
     CHIP_ERROR TestVerifyEndpoint1NotChanged_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBinding * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device
-                                                                             endpointID:@(1)
-                                                                                  queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBinding alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster readAttributeBindingWithParams:params
                                      completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -97048,6 +96724,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -97055,10 +96732,9 @@
 
     CHIP_ERROR TestCommitUserLabelList_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(0)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -97096,10 +96772,9 @@
 
     CHIP_ERROR TestVerifyCommittedUserLabelList_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(0)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -97131,10 +96806,9 @@
 
     CHIP_ERROR TestClearUserLabelList_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(0)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -97156,10 +96830,9 @@
 
     CHIP_ERROR TestReadUserLabelList_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(0)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -97180,10 +96853,9 @@
 
     CHIP_ERROR TestWriteUserLabelList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(0)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -97221,12 +96893,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_6()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_7()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -97234,10 +96908,9 @@
 
     CHIP_ERROR TestVerifyUserLabelListAfterReboot_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(0)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLabelListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -97360,6 +97033,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -97367,10 +97041,9 @@
 
     CHIP_ERROR TestAttemptToWriteOverlyLongItemForLabel_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(0)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -97400,10 +97073,9 @@
 
     CHIP_ERROR TestAttemptToWriteOverlyLongItemForValue_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterUserLabel * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device
-                                                                                 endpointID:@(0)
-                                                                                      queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterUserLabel alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id labelListArgument;
@@ -97564,12 +97236,14 @@
 
     CHIP_ERROR TestRebootTargetDevice_0()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Reboot::Type value;
         return Reboot("alpha", value);
     }
 
     CHIP_ERROR TestWaitForTheAlphaDeviceToBeRetrieved_1()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -97577,12 +97251,14 @@
 
     CHIP_ERROR TestQueryFabricsList_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster readAttributeFabricsWithParams:params
                                      completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -97606,10 +97282,11 @@
 
     CHIP_ERROR TestArmFailSafeOnTargetDeviceWithTimeout0_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGeneralCommissioning * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
-                                                                                                       endpointID:@(0)
-                                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGeneralCommissioning alloc] initWithDevice:device
+                                                                                endpointID:@(0)
+                                                                                     queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGeneralCommissioningClusterArmFailSafeParams alloc] init];
@@ -97635,8 +97312,9 @@
 
     CHIP_ERROR TestReadsNodeLabelMandatoryAttributeOfTargetDevice_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -97657,9 +97335,11 @@
 
     CHIP_ERROR TestInvokeAddTrustedRootCertificateWithoutFailSafe_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTROperationalCredentialsClusterAddTrustedRootCertificateParams alloc] init];
@@ -97682,9 +97362,11 @@
 
     CHIP_ERROR TestInvokeAddNOCWithoutFailSafe_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTROperationalCredentialsClusterAddNOCParams alloc] init];
@@ -97709,9 +97391,11 @@
 
     CHIP_ERROR TestInvokeUpdateNOCWithoutFailSafe_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTROperationalCredentialsClusterUpdateNOCParams alloc] init];
@@ -97733,9 +97417,11 @@
 
     CHIP_ERROR TestInvokeCSRRequestWithoutFailSafe_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTROperationalCredentialsClusterCSRRequestParams alloc] init];
@@ -98004,6 +97690,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -98011,10 +97698,9 @@
 
     CHIP_ERROR TestWriteFanMode_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id fanModeArgument;
@@ -98033,10 +97719,9 @@
 
     CHIP_ERROR TestReadBackFanMode_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFanModeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98057,10 +97742,9 @@
 
     CHIP_ERROR TestWriteFanModeSequence_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id fanModeSequenceArgument;
@@ -98079,10 +97763,9 @@
 
     CHIP_ERROR TestReadBackFanModeSequence_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFanModeSequenceWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98103,10 +97786,9 @@
 
     CHIP_ERROR TestWritePercentSetting_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id percentSettingArgument;
@@ -98125,10 +97807,9 @@
 
     CHIP_ERROR TestReadBackPercentSetting_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98150,10 +97831,9 @@
 
     CHIP_ERROR TestReadBackSpeedSetting_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98175,10 +97855,9 @@
 
     CHIP_ERROR TestReadBackSpeedCurrent_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSpeedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98199,10 +97878,9 @@
 
     CHIP_ERROR TestWritePercentSetting_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id percentSettingArgument;
@@ -98221,10 +97899,9 @@
 
     CHIP_ERROR TestReadBackPercentSetting_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98246,10 +97923,9 @@
 
     CHIP_ERROR TestWriteSpeedSetting_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id speedSettingArgument;
@@ -98268,10 +97944,9 @@
 
     CHIP_ERROR TestReadBackSpeedSetting_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98293,10 +97968,9 @@
 
     CHIP_ERROR TestReadBackPercentSetting_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98318,10 +97992,9 @@
 
     CHIP_ERROR TestReadBackPercentCurrent_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePercentCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98342,10 +98015,9 @@
 
     CHIP_ERROR TestWriteSpeedSetting_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id speedSettingArgument;
@@ -98364,10 +98036,9 @@
 
     CHIP_ERROR TestReadBackSpeedSetting_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98389,10 +98060,9 @@
 
     CHIP_ERROR TestWriteFanMode_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id fanModeArgument;
@@ -98411,10 +98081,9 @@
 
     CHIP_ERROR TestReadBackPercentSetting_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98436,10 +98105,9 @@
 
     CHIP_ERROR TestReadBackPercentCurrent_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePercentCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98460,10 +98128,9 @@
 
     CHIP_ERROR TestReadBackSpeedSetting_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98485,10 +98152,9 @@
 
     CHIP_ERROR TestReadBackSpeedCurrent_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSpeedCurrentWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98509,10 +98175,9 @@
 
     CHIP_ERROR TestWriteFanMode_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id fanModeArgument;
@@ -98531,10 +98196,9 @@
 
     CHIP_ERROR TestReadBackPercentSetting_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributePercentSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98555,10 +98219,9 @@
 
     CHIP_ERROR TestReadBackSpeedSetting_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterFanControl * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device
-                                                                                   endpointID:@(1)
-                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterFanControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeSpeedSettingWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -98731,6 +98394,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -98738,10 +98402,9 @@
 
     CHIP_ERROR TestConstraintErrorPaseReservedForFutureTcAcl24Step29_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -98770,7 +98433,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Constraint error: PASE reserved for future (TC-ACL-2.4 step 29) Error: %@", err);
 
@@ -98787,10 +98450,9 @@
 
     CHIP_ERROR TestConstraintErrorInvalidCombinationAdministerGroupTcAcl24Step31_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -98820,7 +98482,7 @@
             aclArgument = temp_0;
         }
         [cluster
-            writeAttributeAclWithValue:aclArgument
+            writeAttributeACLWithValue:aclArgument
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Constraint error: Invalid combination administer + group (TC-ACL-2.4 step 31) Error: %@",
                                     err);
@@ -98838,10 +98500,9 @@
 
     CHIP_ERROR TestConstraintErrorInvalidAuthModeTcAcl24Step33_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -98870,7 +98531,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Constraint error:  Invalid auth mode (TC-ACL-2.4 step 33) Error: %@", err);
 
@@ -98887,10 +98548,9 @@
 
     CHIP_ERROR TestConstraintErrorInvalidSubjectTcAcl24Step34_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -98920,7 +98580,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Constraint error:  Invalid subject (TC-ACL-2.4 step 34) Error: %@", err);
 
@@ -98937,10 +98597,9 @@
 
     CHIP_ERROR TestConstraintErrorInvalidTargetTcAcl24Step38_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -98974,7 +98633,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Constraint error:  Invalid target (TC-ACL-2.4 step 38) Error: %@", err);
 
@@ -98991,10 +98650,9 @@
 
     CHIP_ERROR TestConstraintErrorTargetHasBothEndpointAndDeviceTypeTcAcl24Step42_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -99029,7 +98687,7 @@
             aclArgument = temp_0;
         }
         [cluster
-            writeAttributeAclWithValue:aclArgument
+            writeAttributeACLWithValue:aclArgument
                             completion:^(NSError * _Nullable err) {
                                 NSLog(@"Constraint error:  target has both endpoint and device type (TC-ACL-2.4 step 42) Error: %@",
                                     err);
@@ -99047,10 +98705,9 @@
 
     CHIP_ERROR TestConstraintErrorInvalidPrivilegeValueStep32_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -99076,7 +98733,7 @@
 
             aclArgument = temp_0;
         }
-        [cluster writeAttributeAclWithValue:aclArgument
+        [cluster writeAttributeACLWithValue:aclArgument
                                  completion:^(NSError * _Nullable err) {
                                      NSLog(@"Constraint error: Invalid privilege value step 32) Error: %@", err);
 
@@ -99093,10 +98750,9 @@
 
     CHIP_ERROR TestConstraintErrorInvalidSubject0xFFFFFfffFfffFfffTcAcl24Step35_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -99127,7 +98783,7 @@
             aclArgument = temp_0;
         }
         [cluster
-            writeAttributeAclWithValue:aclArgument
+            writeAttributeACLWithValue:aclArgument
                             completion:^(NSError * _Nullable err) {
                                 NSLog(
                                     @"Constraint error: invalid subject 0xFFFF_FFFF_FFFF_FFFF (TC-ACL-2.4 step 35) Error: %@", err);
@@ -99145,10 +98801,9 @@
 
     CHIP_ERROR TestConstraintErrorInvalidSubject0xFFFFFffd00000000TcAcl24Step36_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -99179,7 +98834,7 @@
             aclArgument = temp_0;
         }
         [cluster
-            writeAttributeAclWithValue:aclArgument
+            writeAttributeACLWithValue:aclArgument
                             completion:^(NSError * _Nullable err) {
                                 NSLog(
                                     @"Constraint error: invalid subject 0xFFFF_FFFD_0000_0000 (TC-ACL-2.4 step 36) Error: %@", err);
@@ -99197,10 +98852,9 @@
 
     CHIP_ERROR TestConstraintErrorInvalidSubject0xFFFFFfffFfff0000TcAcl24Step37_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAccessControl * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device
-                                                                                         endpointID:@(0)
-                                                                                              queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id aclArgument;
@@ -99231,7 +98885,7 @@
             aclArgument = temp_0;
         }
         [cluster
-            writeAttributeAclWithValue:aclArgument
+            writeAttributeACLWithValue:aclArgument
                             completion:^(NSError * _Nullable err) {
                                 NSLog(
                                     @"Constraint error: invalid subject 0xFFFF_FFFF_FFFF_0000 (TC-ACL-2.4 step 37) Error: %@", err);
@@ -99550,6 +99204,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -99557,10 +99212,9 @@
 
     CHIP_ERROR TestSendsAMoveToLevelCommandToSetCurrentLevelToMinValue_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -99582,6 +99236,7 @@
 
     CHIP_ERROR TestWait100Ms_2()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -99589,10 +99244,9 @@
 
     CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99614,10 +99268,9 @@
 
     CHIP_ERROR TestWriteOnOffTransitionTimeAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onOffTransitionTimeArgument;
@@ -99636,6 +99289,7 @@
 
     CHIP_ERROR TestWait100Ms_5()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -99643,10 +99297,9 @@
 
     CHIP_ERROR TestReadOnOffTransitionTimeAttribute_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffTransitionTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99667,10 +99320,9 @@
 
     CHIP_ERROR TestWriteOnLevelAttribute_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onLevelArgument;
@@ -99689,6 +99341,7 @@
 
     CHIP_ERROR TestWait100Ms_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -99696,10 +99349,9 @@
 
     CHIP_ERROR TestReadOnLevelAttribute_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99721,10 +99373,9 @@
 
     CHIP_ERROR TestReadMinValueAttribute_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMinLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99745,8 +99396,9 @@
 
     CHIP_ERROR TestSendOnCommand_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -99762,8 +99414,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99784,6 +99437,7 @@
 
     CHIP_ERROR TestWaitOnOffTransitionTime_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -99791,10 +99445,9 @@
 
     CHIP_ERROR TestIfOnLevelIsDefinedCheckCurrentLevelIsOnLevelValue_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99816,8 +99469,9 @@
 
     CHIP_ERROR TestSendOffCommand_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -99833,8 +99487,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99855,6 +99510,7 @@
 
     CHIP_ERROR TestWaitOnOffTransitionTime_17()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 0UL;
         return WaitForMs("alpha", value);
@@ -99862,10 +99518,9 @@
 
     CHIP_ERROR TestIfOnLevelIsDefinedCheckCurrentLevelIsMinValue_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99887,10 +99542,9 @@
 
     CHIP_ERROR TestSendsAMoveToLevelCommandToSetCurrentLevelToAMidValue_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRLevelControlClusterMoveToLevelParams alloc] init];
@@ -99912,6 +99566,7 @@
 
     CHIP_ERROR TestWait100Ms_20()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -99919,10 +99574,9 @@
 
     CHIP_ERROR TestReadsCurrentLevelAttributeFromDut_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99944,10 +99598,9 @@
 
     CHIP_ERROR TestSetOnLevelAttributeToNull_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id onLevelArgument;
@@ -99966,6 +99619,7 @@
 
     CHIP_ERROR TestWait100Ms_23()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -99973,10 +99627,9 @@
 
     CHIP_ERROR TestReadOnLevelAttribute_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -99997,8 +99650,9 @@
 
     CHIP_ERROR TestSendOnCommand_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -100014,8 +99668,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsTrueAfterOnCommand_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100036,6 +99691,7 @@
 
     CHIP_ERROR TestWaitOnOffTransitionTime_27()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 100UL;
         return WaitForMs("alpha", value);
@@ -100043,10 +99699,9 @@
 
     CHIP_ERROR TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100068,8 +99723,9 @@
 
     CHIP_ERROR TestSendOffCommand_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -100085,8 +99741,9 @@
 
     CHIP_ERROR TestCheckOnOffAttributeValueIsFalseAfterOffCommand_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeOnOffWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100107,6 +99764,7 @@
 
     CHIP_ERROR TestWaitOnOffTransitionTime_31()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 0UL;
         return WaitForMs("alpha", value);
@@ -100114,10 +99772,9 @@
 
     CHIP_ERROR TestIfOnLevelIsNotDefinedCheckCurrentLevelIsRestored_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterLevelControl * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device
-                                                                                       endpointID:@(1)
-                                                                                            queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterLevelControl alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentLevelWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100411,6 +100068,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -100419,9 +100077,11 @@
 
     CHIP_ERROR TestGetAlphasFabricIndex_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100441,9 +100101,11 @@
 
     CHIP_ERROR TestCheckThatCommissioningWindowIsNotOpen_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100464,9 +100126,11 @@
 
     CHIP_ERROR TestCheckThatThereIsNoAdminFabricIndex_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100487,9 +100151,11 @@
 
     CHIP_ERROR TestCheckThatThereIsNoAdminVendorId_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100510,9 +100176,11 @@
 
     CHIP_ERROR TestOpenCommissioningWindowFromAlpha_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -100531,9 +100199,11 @@
 
     CHIP_ERROR TestCheckThatCommissioningWindowIsOpen_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100554,9 +100224,11 @@
 
     CHIP_ERROR TestCheckTheAdminFabricIndex_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100582,9 +100254,11 @@
 
     CHIP_ERROR TestCheckTheAdminVendorIdIsNotNull_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100604,9 +100278,11 @@
 
     CHIP_ERROR TestCloseCommissioningWindow_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
@@ -100622,9 +100298,11 @@
 
     CHIP_ERROR TestCheckThatCommissioningWindowIsAgainNotOpen_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100645,9 +100323,11 @@
 
     CHIP_ERROR TestCheckThatAgainThereIsNoAdminFabricIndex_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100668,9 +100348,11 @@
 
     CHIP_ERROR TestCheckThatAgainThereIsNoAdminVendorId_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100691,9 +100373,11 @@
 
     CHIP_ERROR TestOpenCommissioningWindowFromAlphaAgain_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -100712,6 +100396,7 @@
 
     CHIP_ERROR TestCommissionFromBeta_14()
     {
+
         chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
         value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
         value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
@@ -100720,6 +100405,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_15()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
         return WaitForCommissionee("beta", value);
@@ -100727,9 +100413,11 @@
 
     CHIP_ERROR TestCheckThatCommissioningWindowIsNotOpenForTheThirdTime_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100750,9 +100438,11 @@
 
     CHIP_ERROR TestCheckThatThereIsNoAdminFabricIndexForTheThirdTime_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100773,9 +100463,11 @@
 
     CHIP_ERROR TestCheckThatThereIsNoAdminVendorIdForTheThirdTime_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100797,9 +100489,11 @@
 
     CHIP_ERROR TestGetBetasFabricIndex_19()
     {
+
         MTRBaseDevice * device = GetDevice("beta");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100819,9 +100513,11 @@
 
     CHIP_ERROR TestOpenCommissioningWindowFromBeta_20()
     {
+
         MTRBaseDevice * device = GetDevice("beta");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -100840,9 +100536,11 @@
 
     CHIP_ERROR TestCheckThatCommissioningWindowIsOpenAgain_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100863,9 +100561,11 @@
 
     CHIP_ERROR TestCheckTheAdminFabricIndexAgain_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100892,9 +100592,11 @@
 
     CHIP_ERROR TestCheckTheAdminVendorIdIsNotNullAgain_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100917,9 +100619,11 @@
 
     CHIP_ERROR TestRemoveBetaFabric_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTROperationalCredentialsClusterRemoveFabricParams alloc] init];
@@ -100939,9 +100643,11 @@
 
     CHIP_ERROR TestCheckThatCommissioningWindowIsStillOpen_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWindowStatusWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100962,9 +100668,11 @@
 
     CHIP_ERROR TestCheckTheAdminFabricIndexGotReset_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -100985,9 +100693,11 @@
 
     CHIP_ERROR TestCheckTheAdminVendorIdDidNotGetReset_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAdminVendorIdWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -101218,12 +100928,14 @@
 
     CHIP_ERROR TestStopTargetDevice_0()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Stop::Type value;
         return Stop("alpha", value);
     }
 
     CHIP_ERROR TestStartTargetDeviceWithTheProvidedDiscriminatorForBasicCommissioningAdvertisement_1()
     {
+
         chip::app::Clusters::SystemCommands::Commands::Start::Type value;
         value.discriminator.Emplace();
         value.discriminator.Value() = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840U;
@@ -101232,6 +100944,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForAlpha_2()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -101239,6 +100952,7 @@
 
     CHIP_ERROR TestCommissionFromAlphaWhenTheCommissioningWindowIsNotOpened_3()
     {
+
         chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
         value.nodeId = mNodeIdForDuplicateCommissioning.HasValue() ? mNodeIdForDuplicateCommissioning.Value() : 17ULL;
         value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
@@ -101247,9 +100961,11 @@
 
     CHIP_ERROR TestOpenCommissioningWindowFromAlpha_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -101268,6 +100984,7 @@
 
     CHIP_ERROR TestCommissionFromAlphaAgain_5()
     {
+
         chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
         value.nodeId = mNodeIdForDuplicateCommissioning.HasValue() ? mNodeIdForDuplicateCommissioning.Value() : 17ULL;
         value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
@@ -101276,12 +100993,14 @@
 
     CHIP_ERROR TestCheckThatWeJustHaveTheOneFabricAndDidNotAddANewOne_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = false;
         [cluster readAttributeFabricsWithParams:params
                                      completion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -101302,9 +101021,11 @@
 
     CHIP_ERROR TestCloseCommissioningWindowAfterFailedCommissioning_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
@@ -101320,9 +101041,11 @@
 
     CHIP_ERROR TestOpenCommissioningWindowFromAlphaAgain_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -101341,6 +101064,7 @@
 
     CHIP_ERROR TestCommissionFromBeta_9()
     {
+
         chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
         value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
         value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
@@ -101349,6 +101073,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForBeta_10()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId2.HasValue() ? mNodeId2.Value() : 51966ULL;
         return WaitForCommissionee("beta", value);
@@ -101356,9 +101081,11 @@
 
     CHIP_ERROR TestOpenCommissioningWindowFromBeta_11()
     {
+
         MTRBaseDevice * device = GetDevice("beta");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -101377,6 +101104,7 @@
 
     CHIP_ERROR TestCommissionFromGamma_12()
     {
+
         chip::app::Clusters::CommissionerCommands::Commands::PairWithCode::Type value;
         value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
         value.payload = mPayload.HasValue() ? mPayload.Value() : chip::Span<const char>("MT:-24J0AFN00KA0648G00", 22);
@@ -101385,6 +101113,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrievedForGamma_13()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId3.HasValue() ? mNodeId3.Value() : 12586990ULL;
         return WaitForCommissionee("gamma", value);
@@ -101393,8 +101122,9 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeNodeLabelFromAlpha_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -101418,8 +101148,9 @@
 
     CHIP_ERROR TestWriteTheMandatoryAttributeNodeLabelFromBeta_15()
     {
+
         MTRBaseDevice * device = GetDevice("beta");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nodeLabelArgument;
@@ -101438,8 +101169,9 @@
 
     CHIP_ERROR TestReadTheMandatoryAttributeNodeLabelFromGamma_16()
     {
+
         MTRBaseDevice * device = GetDevice("gamma");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNodeLabelWithCompletion:^(NSString * _Nullable value, NSError * _Nullable err) {
@@ -101457,8 +101189,9 @@
 
     CHIP_ERROR TestWriteTheMandatoryAttributeNodeLabelBackToDefault_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterBasic * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterBasic alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id nodeLabelArgument;
@@ -101665,6 +101398,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -101672,10 +101406,11 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -101697,10 +101432,11 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -101722,10 +101458,11 @@
 
     CHIP_ERROR TestGivenDGSWSF00WatermarksEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -101742,10 +101479,11 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -101768,10 +101506,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeThreadMetricsInAttributeList_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -101790,10 +101529,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeCurrentHeapFreeInAttributeList_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -101812,10 +101552,11 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeCurrentHeapUsedInAttributeList_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -101834,10 +101575,11 @@
 
     CHIP_ERROR TestThReadsFeatureDependentAttributeCurrentHeapHighWatermarkInAttributeList_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -101856,10 +101598,11 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -101878,10 +101621,11 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -101903,10 +101647,11 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterSoftwareDiagnostics * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
-                                                                                                     endpointID:@(0)
-                                                                                                          queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterSoftwareDiagnostics alloc] initWithDevice:device
+                                                                               endpointID:@(0)
+                                                                                    queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -102054,6 +101799,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -102061,8 +101807,9 @@
 
     CHIP_ERROR TestSetOnOffAttributeToFalse_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -102080,8 +101827,9 @@
 
     CHIP_ERROR TestReportSubscribeOnOffAttribute_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_OnOff_OnOff_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -102103,14 +101851,15 @@
 
     CHIP_ERROR TestSubscribeOnOffAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         uint16_t minIntervalArgument = 2U;
         uint16_t maxIntervalArgument = 5U;
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
-                                                                          maxInterval:@(maxIntervalArgument)];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
+                                                                   maxInterval:@(maxIntervalArgument)];
         params.filterByFabric = true;
         params.replaceExistingSubscriptions = true;
         [cluster subscribeAttributeOnOffWithParams:params
@@ -102135,8 +101884,9 @@
 
     CHIP_ERROR TestTurnOnTheLightToSeeAttributeChange_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster onWithCompletion:^(NSError * _Nullable err) {
@@ -102152,8 +101902,9 @@
 
     CHIP_ERROR TestCheckForAttributeReport_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_OnOff_OnOff_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -102174,8 +101925,9 @@
 
     CHIP_ERROR TestTurnOffTheLightToSeeAttributeChange_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster offWithCompletion:^(NSError * _Nullable err) {
@@ -102191,8 +101943,9 @@
 
     CHIP_ERROR TestCheckForAttributeReport_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOnOff * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOnOff alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_OnOff_OnOff_Reported = ^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -102425,6 +102178,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -102433,9 +102187,11 @@
 
     CHIP_ERROR TestGetOurfabricIndex_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterOperationalCredentials * cluster =
-            [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterOperationalCredentials alloc] initWithDevice:device
+                                                                                  endpointID:@(0)
+                                                                                       queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeCurrentFabricIndexWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -102457,9 +102213,11 @@
 
     CHIP_ERROR TestReportSubscribeWindowStatusAttribute_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported
@@ -102482,15 +102240,17 @@
 
     CHIP_ERROR TestSubscribeWindowStatusAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         uint16_t minIntervalArgument = 2U;
         uint16_t maxIntervalArgument = 50U;
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
-                                                                          maxInterval:@(maxIntervalArgument)];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
+                                                                   maxInterval:@(maxIntervalArgument)];
         params.filterByFabric = true;
         params.replaceExistingSubscriptions = true;
         [cluster subscribeAttributeWindowStatusWithParams:params
@@ -102515,9 +102275,11 @@
 
     CHIP_ERROR TestOpenTheCommissioningWindow1_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -102536,9 +102298,11 @@
 
     CHIP_ERROR TestCheckForFirstAttributeReportForWindowStatus_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported
@@ -102560,9 +102324,11 @@
 
     CHIP_ERROR TestCloseTheCommissioningWindow1_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
@@ -102578,9 +102344,11 @@
 
     CHIP_ERROR TestCheckForSecondAttributeReportForWindowStatus_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_AdministratorCommissioning_WindowStatus_Reported
@@ -102604,9 +102372,11 @@
 
     CHIP_ERROR TestReportSubscribeAdminVendorIdAttribute_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported
@@ -102629,15 +102399,17 @@
 
     CHIP_ERROR TestSubscribeAdminVendorIdAttribute_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         uint16_t minIntervalArgument = 2U;
         uint16_t maxIntervalArgument = 50U;
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
-                                                                          maxInterval:@(maxIntervalArgument)];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
+                                                                   maxInterval:@(maxIntervalArgument)];
         params.filterByFabric = true;
         params.replaceExistingSubscriptions = true;
         [cluster subscribeAttributeAdminVendorIdWithParams:params
@@ -102662,9 +102434,11 @@
 
     CHIP_ERROR TestOpenTheCommissioningWindow2_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -102683,9 +102457,11 @@
 
     CHIP_ERROR TestCheckForFirstAttributeReportForAdminVendorId_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported = ^(
@@ -102708,9 +102484,11 @@
 
     CHIP_ERROR TestCloseTheCommissioningWindow2_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
@@ -102726,9 +102504,11 @@
 
     CHIP_ERROR TestCheckForSecondAttributeReportForAdminVendorId_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_AdministratorCommissioning_AdminVendorId_Reported
@@ -102752,9 +102532,11 @@
 
     CHIP_ERROR TestReportSubscribeAdminFabricIndexAttribute_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported
@@ -102777,15 +102559,17 @@
 
     CHIP_ERROR TestSubscribeAdminFabricIndexAttribute_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         uint16_t minIntervalArgument = 2U;
         uint16_t maxIntervalArgument = 50U;
-        MTRSubscribeParams * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
-                                                                          maxInterval:@(maxIntervalArgument)];
+        __auto_type * params = [[MTRSubscribeParams alloc] initWithMinInterval:@(minIntervalArgument)
+                                                                   maxInterval:@(maxIntervalArgument)];
         params.filterByFabric = true;
         params.replaceExistingSubscriptions = true;
         [cluster subscribeAttributeAdminFabricIndexWithParams:params
@@ -102810,9 +102594,11 @@
 
     CHIP_ERROR TestOpenTheCommissioningWindow3_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRAdministratorCommissioningClusterOpenBasicCommissioningWindowParams alloc] init];
@@ -102831,9 +102617,11 @@
 
     CHIP_ERROR TestCheckForFirstAttributeReportForAdminFabricIndex_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported
@@ -102860,9 +102648,11 @@
 
     CHIP_ERROR TestCloseTheCommissioningWindow2_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster revokeCommissioningWithCompletion:^(NSError * _Nullable err) {
@@ -102878,9 +102668,11 @@
 
     CHIP_ERROR TestCheckForSecondAttributeReportForAdminFabricIndex_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterAdministratorCommissioning * cluster =
-            [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device endpointID:@(0) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterAdministratorCommissioning alloc] initWithDevice:device
+                                                                                      endpointID:@(0)
+                                                                                           queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         test_TestSubscribe_AdministratorCommissioning_AdminFabricIndex_Reported
@@ -103840,6 +103632,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -103847,10 +103640,9 @@
 
     CHIP_ERROR TestReadAvailableUserSlotAndVerifyResponseFields_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -103920,10 +103712,9 @@
 
     CHIP_ERROR TestGetNumberOfSupportedUsersAndVerifyDefaultValue_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -103947,10 +103738,9 @@
 
     CHIP_ERROR TestReadFailsForUserWithIndex0_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -103971,10 +103761,9 @@
 
     CHIP_ERROR TestReadFailsForUserWithIndexGreaterThanNumberOfUsersSupported_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -103995,10 +103784,9 @@
 
     CHIP_ERROR TestCreateNewUserWithDefaultParameters_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104023,10 +103811,9 @@
 
     CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -104101,10 +103888,9 @@
 
     CHIP_ERROR TestSetUserAtTheOccupiedIndexFailsWithAppropriateResponse_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104131,10 +103917,9 @@
 
     CHIP_ERROR TestModifyUserNameForExistingUser_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104159,10 +103944,9 @@
 
     CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -104237,10 +104021,9 @@
 
     CHIP_ERROR TestModifyUserUniqueIdForExistingUser_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104265,10 +104048,9 @@
 
     CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -104344,10 +104126,9 @@
 
     CHIP_ERROR TestModifyUserStatusForExistingUser_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104372,10 +104153,9 @@
 
     CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -104451,10 +104231,9 @@
 
     CHIP_ERROR TestModifyUserTypeForExistingUser_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104479,10 +104258,9 @@
 
     CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -104558,10 +104336,9 @@
 
     CHIP_ERROR TestModifyCredentialRuleForExistingUser_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104586,10 +104363,9 @@
 
     CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -104665,10 +104441,9 @@
 
     CHIP_ERROR TestModifyAllFieldsForExistingUser_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104693,10 +104468,9 @@
 
     CHIP_ERROR TestReadTheModifiedUserBackAndVerifyItsFields_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -104772,10 +104546,9 @@
 
     CHIP_ERROR TestAddAnotherUserWithNonDefaultFields_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104800,10 +104573,9 @@
 
     CHIP_ERROR TestReadTheNewUserBackAndVerifyItsFields_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -104879,10 +104651,9 @@
 
     CHIP_ERROR TestTryToAddAUserWithUserStatus0_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -104909,10 +104680,9 @@
 
     CHIP_ERROR TestMakeSureTheUserDidNotGetCreated_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -104981,10 +104751,9 @@
 
     CHIP_ERROR TestTryToAddAUserWithUserStatus2_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -105011,10 +104780,9 @@
 
     CHIP_ERROR TestMakeSureTheUserDidNotGetCreated_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -105083,10 +104851,9 @@
 
     CHIP_ERROR TestTryToAddAUserWithUserStatus3_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -105111,10 +104878,9 @@
 
     CHIP_ERROR TestReadTheNewThirdUserBackAndVerifyItsFields_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -105190,10 +104956,9 @@
 
     CHIP_ERROR TestCreateUserInTheLastSlot_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -105218,10 +104983,9 @@
 
     CHIP_ERROR TestReadTheLastUserBackAndVerifyItsFields_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -105296,10 +105060,9 @@
 
     CHIP_ERROR TestUserCreationInThe0SlotFails_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -105326,10 +105089,9 @@
 
     CHIP_ERROR TestUserCreationInTheOutOfBoundsSlotFails_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -105356,10 +105118,9 @@
 
     CHIP_ERROR TestClearFirstUser_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -105378,10 +105139,9 @@
 
     CHIP_ERROR TestReadClearedUserAndVerifyItIsAvailable_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -105451,10 +105211,9 @@
 
     CHIP_ERROR TestCreateNewUserInTheClearedSlot_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -105479,10 +105238,9 @@
 
     CHIP_ERROR TestReadTheUserInThePreviouslyClearedSlotAndVerifyItsFields_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -105558,10 +105316,9 @@
 
     CHIP_ERROR TestClearUserWithIndex0Fails_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -105583,10 +105340,9 @@
 
     CHIP_ERROR TestClearUserWithOutOfBoundsIndexFails_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -105608,10 +105364,9 @@
 
     CHIP_ERROR TestClearAllUsers_38()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -105630,10 +105385,9 @@
 
     CHIP_ERROR TestReadFirstClearedUserAndVerifyItIsAvailable_39()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -105702,10 +105456,9 @@
 
     CHIP_ERROR TestReadLastClearedUserAndVerifyItIsAvailable_40()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -105775,10 +105528,9 @@
 
     CHIP_ERROR TestGetNumberOfSupportedPinCredentialsAndVerifyDefaultValue_41()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfPINUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -105802,10 +105554,9 @@
 
     CHIP_ERROR TestCheckThatPinCredentialDoesNotExist_42()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -105853,10 +105604,9 @@
 
     CHIP_ERROR TestReadingPinCredentialWithIndex0ReturnsNoCredential_43()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -105904,10 +105654,9 @@
 
     CHIP_ERROR TestReadingPinCredentialWithOutOfBoundsIndexReturnsNoCredential_44()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -105957,10 +105706,9 @@
 
     CHIP_ERROR TestVerifyThatAUserWithUserStatus0CannotBeAddedViaSetCredential_45()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106004,10 +105752,9 @@
 
     CHIP_ERROR TestVerifyThatAUserWithUserStatus2CannotBeAddedViaSetCredential_46()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106051,10 +105798,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndUser_47()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106099,10 +105845,9 @@
 
     CHIP_ERROR TestVerifyCreatedUser_48()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -106182,10 +105927,9 @@
 
     CHIP_ERROR TestVerifyCreatedPinCredential_49()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -106236,10 +105980,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndUserWithIndex0Fails_50()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106283,10 +106026,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndUserWithOutOfBoundsIndexFails_51()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106331,10 +106073,9 @@
 
     CHIP_ERROR TestGetNumberOfSupportedRfidCredentialsAndVerifyDefaultValue_52()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfRFIDUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -106358,10 +106099,9 @@
 
     CHIP_ERROR TestReadingRfidCredentialWithIndex0ReturnsNoCredentialDuplicateWithBugWorkaround_53()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -106406,10 +106146,9 @@
 
     CHIP_ERROR TestReadingRfidCredentialWithOutOfBoundsIndexReturnsNoCredential_54()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -106459,10 +106198,9 @@
 
     CHIP_ERROR TestCheckThatRfidCredentialDoesNotExist_55()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -106510,10 +106248,9 @@
 
     CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_56()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106557,10 +106294,9 @@
 
     CHIP_ERROR TestVerifyModifiedUser_57()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -106644,10 +106380,9 @@
 
     CHIP_ERROR TestVerifyCreatedCredential_58()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -106698,10 +106433,9 @@
 
     CHIP_ERROR TestCreateNewRfidCredentialAndUserWithIndex0Fails_59()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106745,10 +106479,9 @@
 
     CHIP_ERROR TestCreateNewRfidCredentialAndUserWithOutOfBoundsIndexFails_60()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106792,10 +106525,9 @@
 
     CHIP_ERROR TestCreateNewCredentialAndTryToAddItTo0User_61()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106839,10 +106571,9 @@
 
     CHIP_ERROR TestCreateNewCredentialAndTryToAddItToOutOfBoundsUser_62()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106886,10 +106617,9 @@
 
     CHIP_ERROR TestCreateNewPinWithTooShortData_63()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106933,10 +106663,9 @@
 
     CHIP_ERROR TestCreateNewPinWithTooLongData_64()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -106980,10 +106709,9 @@
 
     CHIP_ERROR TestCreateNewRfidWithTooShortData_65()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107027,10 +106755,9 @@
 
     CHIP_ERROR TestCreateNewPinWithProgrammingUserTypeFails_66()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107074,10 +106801,9 @@
 
     CHIP_ERROR TestCreateNewRfidWithTooShortData_67()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107121,10 +106847,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialWithDataTheWouldCauseDuplicate_68()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107168,10 +106893,9 @@
 
     CHIP_ERROR TestCreateNewRfidCredentialWithDataTheWouldCauseDuplicate_69()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107215,10 +106939,9 @@
 
     CHIP_ERROR TestModifyCredentialDataOfExistingPinCredential_70()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107262,10 +106985,9 @@
 
     CHIP_ERROR TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithOldData_71()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107310,10 +107032,9 @@
 
     CHIP_ERROR TestVerifyThatCredentialWasChangedByCreatingNewCredentialWithNewData_72()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107357,10 +107078,9 @@
 
     CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_73()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107404,10 +107124,9 @@
 
     CHIP_ERROR TestVerifyModifiedUser_74()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -107496,10 +107215,9 @@
 
     CHIP_ERROR TestCreateNewRfidCredentialAndAddItToExistingUser_75()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -107543,10 +107261,9 @@
 
     CHIP_ERROR TestVerifyModifiedUser_76()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -107639,10 +107356,9 @@
 
     CHIP_ERROR TestClearFirstPinCredential_77()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -107664,10 +107380,9 @@
 
     CHIP_ERROR TestReadBackTheCredentialAndMakeSureItIsDeleted_78()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -107716,10 +107431,9 @@
 
     CHIP_ERROR TestReadTheUserBackAndMakeSurePinCredentialIsDeleted_79()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -107808,10 +107522,9 @@
 
     CHIP_ERROR TestClearTheSecondPinCredential_80()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -107833,10 +107546,9 @@
 
     CHIP_ERROR TestReadBackTheCredentialAndMakeSureItIsDeleted_81()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -107885,10 +107597,9 @@
 
     CHIP_ERROR TestReadTheUserBackAndMakeSureRelatedUserIsDeleted_82()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -107957,10 +107668,9 @@
 
     CHIP_ERROR TestCreateNewRfidCredentialWithUser_83()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -108005,10 +107715,9 @@
 
     CHIP_ERROR TestClearAllTheRfidCredentials_84()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -108030,10 +107739,9 @@
 
     CHIP_ERROR TestReadBackTheFistRfidCredentialAndMakeSureItIsDeleted_85()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -108082,10 +107790,9 @@
 
     CHIP_ERROR TestReadBackTheSecondRfidCredentialAndMakeSureItIsDeleted_86()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -108134,10 +107841,9 @@
 
     CHIP_ERROR TestReadBackTheThirdRfidCredentialAndMakeSureItIsDeleted_87()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -108186,10 +107892,9 @@
 
     CHIP_ERROR TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItHasOnlyPinCredential_88()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -108270,10 +107975,9 @@
 
     CHIP_ERROR TestReadTheUserRelatedWithSecondRfidBackAndMakeSureItIsDeleted_89()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -108342,10 +108046,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialWithUser_90()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -108390,10 +108093,9 @@
 
     CHIP_ERROR TestCreateNewRfidCredentialWithUser_91()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -108438,10 +108140,9 @@
 
     CHIP_ERROR TestCreateAnotherRfidCredentialWithUser_92()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -108486,10 +108187,9 @@
 
     CHIP_ERROR TestClearAllTheCredentials_93()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -108508,10 +108208,9 @@
 
     CHIP_ERROR TestReadBackTheFirstPinCredentialAndMakeSureItIsDeleted_94()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -108559,10 +108258,9 @@
 
     CHIP_ERROR TestReadBackTheFirstRfidCredentialAndMakeSureItIsDeleted_95()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -108610,10 +108308,9 @@
 
     CHIP_ERROR TestReadBackTheSecondPinCredentialAndMakeSureItIsDeleted_96()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -108661,10 +108358,9 @@
 
     CHIP_ERROR TestReadTheUserRelatedWithFirstPinBackAndMakeSureItIsDeleted_97()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -108733,10 +108429,9 @@
 
     CHIP_ERROR TestReadTheUserRelatedWithFirstRfidBackAndMakeSureItIsDeleted_98()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -108805,10 +108500,9 @@
 
     CHIP_ERROR TestReadTheUserRelatedWithSecondPinBackAndMakeSureItIsDeleted_99()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -108877,10 +108571,9 @@
 
     CHIP_ERROR TestReadTheUserRelatedWithLastRfidBackAndMakeSureItIsDeleted_100()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -108949,10 +108642,9 @@
 
     CHIP_ERROR TestCreateNewProgrammingPinCredentialWithInvalidIndex_101()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -108995,10 +108687,9 @@
 
     CHIP_ERROR TestCreateNewProgrammingPinCredentialWithValidIndex_102()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -109042,10 +108733,9 @@
 
     CHIP_ERROR TestVerifyCreatedUser_103()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -109125,10 +108815,9 @@
 
     CHIP_ERROR TestVerifyCreatedProgrammingPinCredential_104()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -109179,10 +108868,9 @@
 
     CHIP_ERROR TestModifyTheProgrammingPinCredential_105()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -109225,10 +108913,9 @@
 
     CHIP_ERROR TestClearingProgrammingPinFails_106()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -109253,10 +108940,9 @@
 
     CHIP_ERROR TestClearingProgrammingPinWithInvalidIndexFails_107()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -109281,10 +108967,9 @@
 
     CHIP_ERROR TestClearingPinCredentialWithZeroIndexFails_108()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -109309,10 +108994,9 @@
 
     CHIP_ERROR TestClearingPinCredentialWithOutOfBoundIndexFails_109()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -109338,10 +109022,9 @@
 
     CHIP_ERROR TestClearingRfidCredentialWithZeroIndexFails_110()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -109366,10 +109049,9 @@
 
     CHIP_ERROR TestClearingRfidCredentialWithOutOfBoundIndexFails_111()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -109395,10 +109077,9 @@
 
     CHIP_ERROR TestClearTheProgrammingPinUser_112()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -109417,10 +109098,9 @@
 
     CHIP_ERROR TestMakeSureProgrammingPinUserIsDeleted_113()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -109489,10 +109169,9 @@
 
     CHIP_ERROR TestMakeSureProgrammingPinCredentialIsDeleted_114()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -109540,10 +109219,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndUser_115()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -109588,10 +109266,9 @@
 
     CHIP_ERROR TestCreateSecondPinCredentialAndAddItToExistingUser_116()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -109635,10 +109312,9 @@
 
     CHIP_ERROR TestCreateThirdPinCredentialAndAddItToExistingUser_117()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -109682,10 +109358,9 @@
 
     CHIP_ERROR TestCreateFourthPinCredentialAndAddItToExistingUser_118()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -109729,10 +109404,9 @@
 
     CHIP_ERROR TestCreateFifthPinCredentialAndAddItToExistingUser_119()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -109776,10 +109450,9 @@
 
     CHIP_ERROR TestTryToCreateSixthPinCredentialAndMakeSureItFails_120()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -109823,10 +109496,9 @@
 
     CHIP_ERROR TestFinalCleanUp_121()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -110183,6 +109855,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -110190,10 +109863,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWithoutPin_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110211,10 +109883,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110236,10 +109907,9 @@
 
     CHIP_ERROR TestTryToLockTheDoorWithoutAPin_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -110257,10 +109927,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110282,10 +109951,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -110330,10 +109998,9 @@
 
     CHIP_ERROR TestSetTheWrongCodeEntryLimitToBigValueSoThatWeCanTestIncorrectPinEntry_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id wrongCodeEntryLimitArgument;
@@ -110354,10 +110021,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPin_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110379,10 +110045,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110404,10 +110069,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWithValidPin_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110426,10 +110090,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110451,10 +110114,9 @@
 
     CHIP_ERROR TestTryToLockTheDoorWithInvalidPin_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -110476,10 +110138,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110501,10 +110162,9 @@
 
     CHIP_ERROR TestTryToLockTheDoorWithValidPin_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -110523,10 +110183,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110548,10 +110207,9 @@
 
     CHIP_ERROR TestSetOperatingModeToNoRemoteLockUnlock_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id operatingModeArgument;
@@ -110570,10 +110228,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWhenOperatingModeIsNoRemoteLockUnlock_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110594,10 +110251,9 @@
 
     CHIP_ERROR TestSetOperatingModeToNormal_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id operatingModeArgument;
@@ -110616,10 +110272,9 @@
 
     CHIP_ERROR TestReadTheLockoutTimeout_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110640,10 +110295,9 @@
 
     CHIP_ERROR TestSetTheWrongCodeEntryLimitToSmallValueSoWeCanTestLockout_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id wrongCodeEntryLimitArgument;
@@ -110665,10 +110319,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPinForTheFirstTime_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110690,10 +110343,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPinForTheSecondTime_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110715,10 +110367,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWithInvalidPinForTheThirdTime_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110740,10 +110391,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWithValidPinAndMakeSureItFailsDueToLockout_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110765,6 +110415,7 @@
 
     CHIP_ERROR TestWaitForTheLockoutToEnd_24()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 10000UL;
         return WaitForMs("alpha", value);
@@ -110772,10 +110423,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWithValidPinAndMakeSureItSucceeds_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110794,10 +110444,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110819,10 +110468,9 @@
 
     CHIP_ERROR TestLockTheDoorBackPriorToNextTests_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -110841,10 +110489,9 @@
 
     CHIP_ERROR TestCreateADisabledUserAndCredential_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -110889,10 +110536,9 @@
 
     CHIP_ERROR TestTryToUnlockTheDoorWithDisabledUserPin_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110914,10 +110560,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110939,10 +110584,9 @@
 
     CHIP_ERROR TestUnlockTheDoorWithEnabledUserPin_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -110961,10 +110605,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToUnlocked_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -110986,10 +110629,9 @@
 
     CHIP_ERROR TestTryToLockTheDoorWithDisabledUserPin_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -111011,10 +110653,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueStaysUnlocked_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -111036,10 +110677,9 @@
 
     CHIP_ERROR TestLockTheDoorWithEnabledUserPin_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -111058,10 +110698,9 @@
 
     CHIP_ERROR TestVerifyThatLockStateAttributeValueIsSetToLocked_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -111083,10 +110722,9 @@
 
     CHIP_ERROR TestCleanAllTheUsersAndCredentials_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -112072,6 +111710,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -112079,10 +111718,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndScheduleUser_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -112128,10 +111766,9 @@
 
     CHIP_ERROR TestGetNumberOfSupportedUsers_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -112156,10 +111793,9 @@
 
     CHIP_ERROR TestGetMaxNumberOfWeekDaySchedulesForUserAndVerifyDefaultValue_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithCompletion:^(
@@ -112185,10 +111821,9 @@
 
     CHIP_ERROR TestGetMaxNumberOfYearDaySchedulesForUserAndVerifyDefaultValue_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfYearDaySchedulesSupportedPerUserWithCompletion:^(
@@ -112214,10 +111849,9 @@
 
     CHIP_ERROR TestGetMaxNumberOfHolidaySchedulesAndVerifyDefaultValue_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster
@@ -112242,10 +111876,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWith0Index_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112273,10 +111906,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithOutOfBoundsIndex_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112304,10 +111936,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWith0UserIndex_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112335,10 +111966,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithOutOfBoundsUserIndex_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112366,10 +111996,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleForNonExistingUser_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112397,10 +112026,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWith0DaysMask_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112428,10 +112056,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleForSundayAndMonday_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112459,10 +112086,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleForSundayWednesdayAndSaturday_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112490,10 +112116,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithInvalidStartHour_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112521,10 +112146,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithInvalidStartMinute_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112552,10 +112176,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithInvalidEndHour_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112583,10 +112206,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithInvalidEndMinute_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112614,10 +112236,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithStartHourLaterThatEndHour_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112645,10 +112266,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithStartMinuteLaterThatEndMinuteWhenHoursAreEqual_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -112678,10 +112298,9 @@
 
     CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -112717,10 +112336,9 @@
 
     CHIP_ERROR TestGetWeekDayScheduleWith0Index_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -112756,10 +112374,9 @@
 
     CHIP_ERROR TestGetWeekDayScheduleWithOutOfBoundsIndex_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -112796,10 +112413,9 @@
 
     CHIP_ERROR TestGetWeekDayScheduleWith0UserIndex_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -112835,10 +112451,9 @@
 
     CHIP_ERROR TestGetWeekDayScheduleWithOutOfBoundsUserIndex_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -112875,10 +112490,9 @@
 
     CHIP_ERROR TestGetWeekDayScheduleWithNonExistingUserIndex_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -112914,10 +112528,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleWith0Index_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -112942,10 +112555,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleWithOutOfBoundsIndex_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -112970,10 +112582,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleWith0UserIndex_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -112998,10 +112609,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleWithOutOfBoundsUserIndex_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -113026,10 +112636,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleForNonExistingUser_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -113054,10 +112663,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleWithStartHourLaterThatEndHour_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -113082,10 +112690,9 @@
 
     CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -113121,10 +112728,9 @@
 
     CHIP_ERROR TestGetYearDayScheduleWith0Index_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -113160,10 +112766,9 @@
 
     CHIP_ERROR TestGetYearDayScheduleWithOutOfBoundsIndex_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -113200,10 +112805,9 @@
 
     CHIP_ERROR TestGetYearDayScheduleWith0UserIndex_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -113239,10 +112843,9 @@
 
     CHIP_ERROR TestGetYearDayScheduleWithOutOfBoundsUserIndex_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -113279,10 +112882,9 @@
 
     CHIP_ERROR TestGetYearDayScheduleWithNonExistingUserIndex_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -113318,10 +112920,9 @@
 
     CHIP_ERROR TestCreateHolidayScheduleWith0Index_38()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
@@ -113346,10 +112947,9 @@
 
     CHIP_ERROR TestCreateHolidayScheduleWithOutOfBoundsIndex_39()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
@@ -113374,10 +112974,9 @@
 
     CHIP_ERROR TestCreateHolidayScheduleWithStartHourLaterThatEndHour_40()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
@@ -113402,10 +113001,9 @@
 
     CHIP_ERROR TestCreateHolidayScheduleWithInvalidOperatingMode_41()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
@@ -113430,10 +113028,9 @@
 
     CHIP_ERROR TestMakeSureThatPreviousOperationsDidNotCreateASchedule_42()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -113463,10 +113060,9 @@
 
     CHIP_ERROR TestGetHolidayScheduleWith0Index_43()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -113496,10 +113092,9 @@
 
     CHIP_ERROR TestGetHolidayScheduleWithOutOfBoundsIndex_44()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -113530,10 +113125,9 @@
 
     CHIP_ERROR TestCreateHolidayScheduleWithValidParameters_45()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
@@ -113555,10 +113149,9 @@
 
     CHIP_ERROR TestVerifyCreatedSchedule_46()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -113603,10 +113196,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithValidParameters_47()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -113631,10 +113223,9 @@
 
     CHIP_ERROR TestVerifyCreatedSchedule_48()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -113695,10 +113286,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleWithValidParameters_49()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -113720,10 +113310,9 @@
 
     CHIP_ERROR TestVerifyCreatedSchedule_50()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -113769,10 +113358,9 @@
 
     CHIP_ERROR TestClearWeekDayScheduleWith0Index_51()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
@@ -113796,10 +113384,9 @@
 
     CHIP_ERROR TestClearWeekDayScheduleWithOutOfBoundsIndex_52()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
@@ -113823,10 +113410,9 @@
 
     CHIP_ERROR TestClearWeekDayScheduleWith0UserIndex_53()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
@@ -113850,10 +113436,9 @@
 
     CHIP_ERROR TestClearWeekDayScheduleWithOutOfBoundsUserIndex_54()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
@@ -113877,10 +113462,9 @@
 
     CHIP_ERROR TestClearWeekDayScheduleWithNonExistingUser_55()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
@@ -113904,10 +113488,9 @@
 
     CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_56()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -113968,10 +113551,9 @@
 
     CHIP_ERROR TestMakeSureThatYearDayScheduleWasNotDeleted_57()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -114017,10 +113599,9 @@
 
     CHIP_ERROR TestMakeSureThatHolidayScheduleWasNotDeleted_58()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -114065,10 +113646,9 @@
 
     CHIP_ERROR TestClearYearDayScheduleWith0Index_59()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -114092,10 +113672,9 @@
 
     CHIP_ERROR TestClearYearDayScheduleWithOutOfBoundsIndex_60()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -114119,10 +113698,9 @@
 
     CHIP_ERROR TestClearYearDayScheduleWith0UserIndex_61()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -114146,10 +113724,9 @@
 
     CHIP_ERROR TestClearYearDayScheduleWithOutOfBoundsUserIndex_62()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -114173,10 +113750,9 @@
 
     CHIP_ERROR TestClearYearDayScheduleWithNonExistingUser_63()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -114200,10 +113776,9 @@
 
     CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_64()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -114264,10 +113839,9 @@
 
     CHIP_ERROR TestMakeSureThatYearDayScheduleWasNotDeleted_65()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -114313,10 +113887,9 @@
 
     CHIP_ERROR TestMakeSureThatHolidayScheduleWasNotDeleted_66()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -114361,10 +113934,9 @@
 
     CHIP_ERROR TestClearHolidayScheduleWith0Index_67()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
@@ -114387,10 +113959,9 @@
 
     CHIP_ERROR TestClearHolidayScheduleWithOutOfBoundsIndex_68()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
@@ -114413,10 +113984,9 @@
 
     CHIP_ERROR TestMakeSureThatWeekDayScheduleWasNotDeleted_69()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -114477,10 +114047,9 @@
 
     CHIP_ERROR TestMakeSureThatYearDayScheduleWasNotDeleted_70()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -114526,10 +114095,9 @@
 
     CHIP_ERROR TestMakeSureThatHolidayScheduleWasNotDeleted_71()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -114574,10 +114142,9 @@
 
     CHIP_ERROR TestCreateAnotherWeekDayScheduleWithValidParameters_72()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -114602,10 +114169,9 @@
 
     CHIP_ERROR TestVerifyCreatedWeekDaySchedule_73()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -114666,10 +114232,9 @@
 
     CHIP_ERROR TestCreateAnotherYearDayScheduleWithValidParameters_74()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -114691,10 +114256,9 @@
 
     CHIP_ERROR TestVerifyCreatedYearDaySchedule_75()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -114740,10 +114304,9 @@
 
     CHIP_ERROR TestCreateAnotherHolidayScheduleWithValidParameters_76()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
@@ -114765,10 +114328,9 @@
 
     CHIP_ERROR TestVerifyCreatedHolidaySchedule_77()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -114813,10 +114375,9 @@
 
     CHIP_ERROR TestClearASingleWeekDayScheduleForTheFirstUser_78()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
@@ -114836,10 +114397,9 @@
 
     CHIP_ERROR TestVerifyClearedWeekDaySchedule_79()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -114875,10 +114435,9 @@
 
     CHIP_ERROR TestClearAllRemainingWeekDaySchedulesForTheFirstUser_80()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
@@ -114898,10 +114457,9 @@
 
     CHIP_ERROR TestVerifyClearedWeekSchedule_81()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -114937,10 +114495,9 @@
 
     CHIP_ERROR TestMakeSureThatFirstYearDayScheduleWasNotDeleted_82()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -114986,10 +114543,9 @@
 
     CHIP_ERROR TestMakeSureThatSecondYearDayScheduleWasNotDeleted_83()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -115035,10 +114591,9 @@
 
     CHIP_ERROR TestMakeSureThatFirstHolidayScheduleWasNotDeleted_84()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -115083,10 +114638,9 @@
 
     CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasNotDeleted_85()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -115131,10 +114685,9 @@
 
     CHIP_ERROR TestCreateAnotherWeekDayScheduleWithValidParameters_86()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -115159,10 +114712,9 @@
 
     CHIP_ERROR TestClearASingleYearDayScheduleForTheFirstUser_87()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -115182,10 +114734,9 @@
 
     CHIP_ERROR TestVerifyClearedYearDaySchedule_88()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -115221,10 +114772,9 @@
 
     CHIP_ERROR TestClearAllRemainingYearSchedulesForTheFirstUser_89()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -115244,10 +114794,9 @@
 
     CHIP_ERROR TestVerifyThatSecondYearDayScheduleWasCleared_90()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -115283,10 +114832,9 @@
 
     CHIP_ERROR TestVerifyCreatedWeekDaySchedule_91()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -115347,10 +114895,9 @@
 
     CHIP_ERROR TestClearAllRemainingWeekDaySchedulesForTheFirstUser_92()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
@@ -115370,10 +114917,9 @@
 
     CHIP_ERROR TestCreateNewUserWithoutCredentialSoWeCanAddMoreSchedulesToIt_93()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -115398,10 +114944,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithValidParametersForFirstUser_94()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -115426,10 +114971,9 @@
 
     CHIP_ERROR TestVerifyCreatedWeekDayScheduleForFirstUser_95()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -115490,10 +115034,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleForFirstUser_96()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -115515,10 +115058,9 @@
 
     CHIP_ERROR TestVerifyCreatedYearDayScheduleForFirst_97()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -115564,10 +115106,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleWithValidParametersForSecondUser_98()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -115592,10 +115133,9 @@
 
     CHIP_ERROR TestVerifyCreatedWeekDayScheduleForFirstUser_99()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -115656,10 +115196,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleForSecondUser_100()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -115681,10 +115220,9 @@
 
     CHIP_ERROR TestVerifyCreatedYearDayScheduleForFirst_101()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -115730,10 +115268,9 @@
 
     CHIP_ERROR TestCleanupTheUser_102()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -115752,10 +115289,9 @@
 
     CHIP_ERROR TestMakeSureClearingFirstUserAlsoClearedWeekDaySchedules_103()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -115791,10 +115327,9 @@
 
     CHIP_ERROR TestMakeSureClearingFirstUserAlsoClearedYearDaySchedules_104()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -115830,10 +115365,9 @@
 
     CHIP_ERROR TestMakeSureClearingSecondUserAlsoClearedWeekDaySchedules_105()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -115869,10 +115403,9 @@
 
     CHIP_ERROR TestMakeSureClearingSecondUserAlsoClearedYearDaySchedules_106()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -115908,10 +115441,9 @@
 
     CHIP_ERROR TestMakeSureThatFirstHolidayScheduleWasNotDeleted_107()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -115956,10 +115488,9 @@
 
     CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasNotDeleted_108()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -116004,10 +115535,9 @@
 
     CHIP_ERROR TestCreateAnotherHolidayScheduleAtTheLastSlot_109()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetHolidayScheduleParams alloc] init];
@@ -116029,10 +115559,9 @@
 
     CHIP_ERROR TestVerifyCreatedHolidaySchedule_110()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -116078,10 +115607,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndScheduleUser_111()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -116126,10 +115654,9 @@
 
     CHIP_ERROR TestCreateWeekDayScheduleForFirstUser_112()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -116154,10 +115681,9 @@
 
     CHIP_ERROR TestCreateYearDayScheduleForFirstUser_113()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -116179,10 +115705,9 @@
 
     CHIP_ERROR TestClearASingleHolidaySchedule_114()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
@@ -116201,10 +115726,9 @@
 
     CHIP_ERROR TestMakeSureThatFirstHolidayScheduleWasNotDeleted_115()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -116249,10 +115773,9 @@
 
     CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasDeleted_116()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -116282,10 +115805,9 @@
 
     CHIP_ERROR TestMakeSureThatThirdHolidayScheduleWasNotDeleted_117()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -116331,10 +115853,9 @@
 
     CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_118()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -116395,10 +115916,9 @@
 
     CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_119()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -116444,10 +115964,9 @@
 
     CHIP_ERROR TestClearAllRemainingHolidaySchedules_120()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearHolidayScheduleParams alloc] init];
@@ -116466,10 +115985,9 @@
 
     CHIP_ERROR TestMakeSureThatFirstHolidayIsStillDeleted_121()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -116499,10 +116017,9 @@
 
     CHIP_ERROR TestMakeSureThatSecondHolidayScheduleWasDeleted_122()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -116532,10 +116049,9 @@
 
     CHIP_ERROR TestMakeSureThatThirdHolidayScheduleWasNotDeleted_123()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetHolidayScheduleParams alloc] init];
@@ -116566,10 +116082,9 @@
 
     CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearWeekDaySchedule_124()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -116630,10 +116145,9 @@
 
     CHIP_ERROR TestMakeSureClearingHolidayScheduleDidNotClearYearDaySchedule_125()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -116679,10 +116193,9 @@
 
     CHIP_ERROR TestFinalCleanup_126()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -117245,6 +116758,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -117252,10 +116766,9 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117277,10 +116790,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117302,10 +116814,9 @@
 
     CHIP_ERROR TestGivenDrlksf00pinEnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117322,10 +116833,9 @@
 
     CHIP_ERROR TestGivenDrlksf01ridEnsureFeaturemapHasTheCorrectBitSet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117342,10 +116852,9 @@
 
     CHIP_ERROR TestGivenDrlksf02fgpEnsureFeaturemapHasTheCorrectBitSet_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117362,10 +116871,9 @@
 
     CHIP_ERROR TestGivenDrlksf04wdschEnsureFeaturemapHasTheCorrectBitSet_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117382,10 +116890,9 @@
 
     CHIP_ERROR TestGivenDrlksf05dpsEnsureFeaturemapHasTheCorrectBitSet_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117402,10 +116909,9 @@
 
     CHIP_ERROR TestGivenDrlksf06faceEnsureFeaturemapHasTheCorrectBitSet_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117422,10 +116928,9 @@
 
     CHIP_ERROR TestGivenDrlksf07cotaEnsureFeaturemapHasTheCorrectBitSet_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117442,10 +116947,9 @@
 
     CHIP_ERROR TestGivenDrlksf08usrEnsureFeaturemapHasTheCorrectBitSet_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117462,10 +116966,9 @@
 
     CHIP_ERROR TestGivenDRLKSF0aYDSCHEnsureFeaturemapHasTheCorrectBitSet_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117482,10 +116985,9 @@
 
     CHIP_ERROR TestGivenDRLKSF0bHDSCHEnsureFeaturemapHasTheCorrectBitSet_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -117502,10 +117004,9 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117533,10 +117034,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDRLKSF05AttributesInAttributeList_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117555,10 +117055,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDRLKSF08AttributesInAttributeList_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117579,10 +117078,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDRLKSF00AttributesInAttributeList_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117603,10 +117101,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDRLKSF01AttributesInAttributeList_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117627,10 +117124,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDRLKSF04AttributeInAttributeList_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117649,10 +117145,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDRLKSF0aAttributeInAttributeList_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117671,10 +117166,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDRLKSF0bAttributeInAttributeList_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117693,10 +117187,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDRLKSF00OrDrlksf01AttributesInAttributeList_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117716,10 +117209,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentDRLKSF07OrDrlksf00AttributeInAttributeList_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117738,10 +117230,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeLanguageInAttributeList_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117760,10 +117251,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeLEDSettingsInAttributeList_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117782,10 +117272,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeAutoRelockTimeInAttributeList_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117804,10 +117293,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeSoundVolumeInAttributeList_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117826,10 +117314,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeDefaultConfigurationRegisterInAttributeList_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117848,10 +117335,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeEnableLocalProgrammingInAttributeList_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117870,10 +117356,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeEnableOneTouchLockingInAttributeList_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117892,10 +117377,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeEnableInsideStatusLEDInAttributeList_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117914,10 +117398,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeEnablePrivacyModeButtonInAttributeList_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117936,10 +117419,9 @@
 
     CHIP_ERROR TestThReadsOptionalAttributeLocalProgrammingFeaturesInAttributeList_32()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117958,10 +117440,9 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_33()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -117981,10 +117462,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF04InAcceptedCommandList_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -118005,10 +117485,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF0aInAcceptedCommandList_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -118029,10 +117508,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF0bInAcceptedCommandList_36()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -118053,10 +117531,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentCommandsDRLKSF08InAcceptedCommandList_37()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -118080,10 +117557,9 @@
 
     CHIP_ERROR TestThReadsOptionalCommandsDRLKSC03RspInAcceptedCommandList_38()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -118102,10 +117578,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF04InGeneratedCommandList_39()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -118124,10 +117599,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF0aInGeneratedCommandList_40()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -118146,10 +117620,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF0bInGeneratedCommandList_41()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -118168,10 +117641,9 @@
 
     CHIP_ERROR TestThReadsFeatureDependentCommandDRLKSF08InGeneratedCommandList_42()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -118555,6 +118027,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -118562,10 +118035,9 @@
 
     CHIP_ERROR TestCreateNewUser_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -118590,10 +118062,9 @@
 
     CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -118669,10 +118140,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -118716,10 +118186,9 @@
 
     CHIP_ERROR TestVerifyCreatedPinCredential_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -118770,10 +118239,9 @@
 
     CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id requirePINforRemoteOperationArgument;
@@ -118794,10 +118262,9 @@
 
     CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id requirePINforRemoteOperationArgument;
@@ -118824,10 +118291,9 @@
 
     CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -118848,10 +118314,9 @@
 
     CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithoutPINCode_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -118869,10 +118334,9 @@
 
     CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithValidPINCode_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -118891,10 +118355,9 @@
 
     CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id requirePINforRemoteOperationArgument;
@@ -118915,10 +118378,9 @@
 
     CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id requirePINforRemoteOperationArgument;
@@ -118945,10 +118407,9 @@
 
     CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -118969,10 +118430,9 @@
 
     CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithValidPINCode_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -118991,10 +118451,9 @@
 
     CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithoutValidPINCode_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -119016,10 +118475,9 @@
 
     CHIP_ERROR TestThSendsLockDoorCommandToTheDutWithoutAnyArgumentPINCode_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterLockDoorParams alloc] init];
@@ -119040,10 +118498,9 @@
 
     CHIP_ERROR TestThReadsTheWrongCodeEntryLimitAttributeFromTheDut_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeWrongCodeEntryLimitWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -119060,6 +118517,7 @@
     CHIP_ERROR
     TestThSendsAnUnlockDoorCommandFromTheDutWithInvalidPINCodeRepeatThisStepPIXITDRLKWrongCodeEntryLimitTimesAndVerifyThatDutSendsFailureResponseToTheTh_17()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -119069,6 +118527,7 @@
 
     CHIP_ERROR TestThSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCodeAndVerifyTheDutResponse_18()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -119079,6 +118538,7 @@
     CHIP_ERROR
     TestWaitForPIXITDRLKUserCodeTemporaryDisableTimeTHThenSendsAnUnlockDoorCommandFromUser1ToTheDutWithTheValidPINCode_19()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -119088,10 +118548,9 @@
 
     CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id wrongCodeEntryLimitArgument;
@@ -119112,10 +118571,9 @@
 
     CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id wrongCodeEntryLimitArgument;
@@ -119140,10 +118598,9 @@
 
     CHIP_ERROR TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDut_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -119160,10 +118617,9 @@
     CHIP_ERROR
     TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyThatTheDutSendsSuccessResponse_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id userCodeTemporaryDisableTimeArgument;
@@ -119186,10 +118642,9 @@
     CHIP_ERROR
     TestThWritesUserCodeTemporaryDisableTimeAttributeValueAsBetween1And255OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id userCodeTemporaryDisableTimeArgument;
@@ -119215,10 +118670,9 @@
 
     CHIP_ERROR TestCleanTheCreatedUser_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -119237,10 +118691,9 @@
 
     CHIP_ERROR TestCleanupTheCreatedCredential_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -119721,6 +119174,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -119728,10 +119182,9 @@
 
     CHIP_ERROR TestCreateNewUser_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -119756,10 +119209,9 @@
 
     CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -119835,10 +119287,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -119882,10 +119333,9 @@
 
     CHIP_ERROR TestVerifyCreatedPinCredential_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -119936,10 +119386,9 @@
 
     CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id requirePINforRemoteOperationArgument;
@@ -119960,10 +119409,9 @@
 
     CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id requirePINforRemoteOperationArgument;
@@ -119990,10 +119438,9 @@
 
     CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -120014,10 +119461,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120035,10 +119481,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120057,10 +119502,9 @@
 
     CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id requirePINforRemoteOperationArgument;
@@ -120081,10 +119525,9 @@
 
     CHIP_ERROR TestThWritesTheRequirePINforRemoteOperationAttributeValueAsFalseOnTheDutAndVerifyDutRespondsWithUnsupportedWrite_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id requirePINforRemoteOperationArgument;
@@ -120111,10 +119554,9 @@
 
     CHIP_ERROR TestThReadsTheRequirePINforRemoteOperationAttributeFromTheDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeRequirePINforRemoteOperationWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -120135,10 +119577,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120157,10 +119598,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120182,10 +119622,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithoutPINCode_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120206,10 +119645,9 @@
 
     CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyThatTheDutSendsSuccessResponse_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id wrongCodeEntryLimitArgument;
@@ -120230,10 +119668,9 @@
 
     CHIP_ERROR TestThWritesWrongCodeEntryLimitAttributeValueAs3OnTheDutAndVerifyDutRespondsWithUnsupportedWrite_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id wrongCodeEntryLimitArgument;
@@ -120258,10 +119695,9 @@
 
     CHIP_ERROR TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id userCodeTemporaryDisableTimeArgument;
@@ -120283,10 +119719,9 @@
 
     CHIP_ERROR TestThWritesUserCodeTemporaryDisableTimeAttributeValueAs15SecondsOnTheDutAndVerifyThatTheDutSendsSuccessResponse_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id userCodeTemporaryDisableTimeArgument;
@@ -120312,10 +119747,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120337,10 +119771,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120362,10 +119795,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120387,10 +119819,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithInvalidPINCode_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120412,10 +119843,9 @@
 
     CHIP_ERROR TestThReadsTheUserCodeTemporaryDisableTimeAttributeFromTheDutAndCheckAttributeIsTriggered_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeUserCodeTemporaryDisableTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -120437,10 +119867,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCode_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockDoorParams alloc] init];
@@ -120462,10 +119891,9 @@
 
     CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id autoRelockTimeArgument;
@@ -120486,10 +119914,9 @@
 
     CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_27()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id autoRelockTimeArgument;
@@ -120510,10 +119937,9 @@
 
     CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs10SecondsOnTheDut_28()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id autoRelockTimeArgument;
@@ -120538,10 +119964,9 @@
 
     CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_29()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id autoRelockTimeArgument;
@@ -120566,10 +119991,9 @@
 
     CHIP_ERROR TestThReadsTheAutoRelockTimeAttributeFromTheDut_30()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAutoRelockTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -120590,10 +120014,9 @@
 
     CHIP_ERROR TestThReadsTheAutoRelockTimeAttributeFromTheDut_31()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAutoRelockTimeWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -120614,6 +120037,7 @@
 
     CHIP_ERROR TestThSendsTheUnlockDoorCommandToTheDutWithValidPINCodeAndVerifyThatDutSendsSuccessResponseToTheTh_32()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -120623,6 +120047,7 @@
 
     CHIP_ERROR TestThReadsLockStateAttributeAfterAutoRelockTimeExpiresAndVerifyThatTheDutIsLocked_33()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -120632,10 +120057,9 @@
 
     CHIP_ERROR TestCleanupTheCreatedUser_34()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -120654,10 +120078,9 @@
 
     CHIP_ERROR TestCleanTheCreatedCredential_35()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -120857,6 +120280,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -120864,10 +120288,9 @@
 
     CHIP_ERROR TestCreateNewUser_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -120892,10 +120315,9 @@
 
     CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -120971,10 +120393,9 @@
 
     CHIP_ERROR TestCreateNewPinCredentialAndLockUnlockUser_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -121018,10 +120439,9 @@
 
     CHIP_ERROR TestVerifyCreatedPinCredential_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -121072,10 +120492,9 @@
 
     CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id autoRelockTimeArgument;
@@ -121096,10 +120515,9 @@
 
     CHIP_ERROR TestThWritesAutoRelockTimeAttributeValueAs60SecondsOnTheDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id autoRelockTimeArgument;
@@ -121124,10 +120542,9 @@
 
     CHIP_ERROR TestThSendsTheUnlockWithTimeoutArgumentValueAs60Seconds_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterUnlockWithTimeoutParams alloc] init];
@@ -121147,6 +120564,7 @@
 
     CHIP_ERROR TestWait60s_8()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForMs::Type value;
         value.ms = 60000UL;
         return WaitForMs("alpha", value);
@@ -121154,10 +120572,9 @@
 
     CHIP_ERROR TestThReadsLockStateAttribute_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeLockStateWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -121179,10 +120596,9 @@
 
     CHIP_ERROR TestCleanupTheCreatedUser_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -121201,10 +120617,9 @@
 
     CHIP_ERROR TestCleanTheCreatedCredential_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -121412,6 +120827,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -121419,10 +120835,9 @@
 
     CHIP_ERROR TestCreateNewUser_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -121447,10 +120862,9 @@
 
     CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -121527,10 +120941,9 @@
 
     CHIP_ERROR TestThReadsNumberOfWeekDaySchedulesSupportedPerUserAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfWeekDaySchedulesSupportedPerUserWithCompletion:^(
@@ -121556,10 +120969,9 @@
 
     CHIP_ERROR TestThReadsNumberOfTotalUsersSupportedAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -121581,10 +120993,9 @@
 
     CHIP_ERROR TestThSendSetWeekDayScheduleCommand_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -121609,10 +121020,9 @@
 
     CHIP_ERROR TestThSendGetWeekDayScheduleCommandToDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -121678,10 +121088,9 @@
 
     CHIP_ERROR TestThSendSetWeekDayScheduleCommand_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetWeekDayScheduleParams alloc] init];
@@ -121709,10 +121118,9 @@
 
     CHIP_ERROR TestThSendGetWeekDayScheduleCommandToDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -121768,10 +121176,9 @@
 
     CHIP_ERROR TestThSendsClearWeekDayScheduleCommandToDut_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearWeekDayScheduleParams alloc] init];
@@ -121791,10 +121198,9 @@
 
     CHIP_ERROR TestThSendsGetWeekDayScheduleCommandToDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetWeekDayScheduleParams alloc] init];
@@ -121850,10 +121256,9 @@
 
     CHIP_ERROR TestCleanupTheCreatedUser_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -122120,6 +121525,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -122127,10 +121533,9 @@
 
     CHIP_ERROR TestCreateNewUser_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -122155,10 +121560,9 @@
 
     CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -122235,10 +121639,9 @@
 
     CHIP_ERROR TestThReadsNumberOfYearDaySchedulesSupportedPerUserAttribute_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfYearDaySchedulesSupportedPerUserWithCompletion:^(
@@ -122264,10 +121667,9 @@
 
     CHIP_ERROR TestThReadsNumberOfTotalUsersSupportedAttribute_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -122289,10 +121691,9 @@
 
     CHIP_ERROR TestThSendsSetYearDayScheduleCommandToDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -122314,10 +121715,9 @@
 
     CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -122369,10 +121769,9 @@
 
     CHIP_ERROR TestThSendSetYearDayScheduleCommandToDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -122397,10 +121796,9 @@
 
     CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -122444,10 +121842,9 @@
 
     CHIP_ERROR TestCreateAUserWithUserIndexAs5_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -122472,10 +121869,9 @@
 
     CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -122520,10 +121916,9 @@
 
     CHIP_ERROR TestThSendsClearYearDayScheduleToDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -122543,10 +121938,9 @@
 
     CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -122590,10 +121984,9 @@
 
     CHIP_ERROR TestThSendsSetYearDayScheduleCommandToDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetYearDayScheduleParams alloc] init];
@@ -122615,10 +122008,9 @@
 
     CHIP_ERROR TestThSendsGetYearDayScheduleCommandToDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetYearDayScheduleParams alloc] init];
@@ -122670,10 +122062,9 @@
 
     CHIP_ERROR TestThSendsClearYearDayScheduleToDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -122697,10 +122088,9 @@
 
     CHIP_ERROR TestClearAYearDayScheduleForTheFirstUser_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearYearDayScheduleParams alloc] init];
@@ -122720,10 +122110,9 @@
 
     CHIP_ERROR TestCleanupTheCreatedUser_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -123030,6 +122419,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -123037,10 +122427,9 @@
 
     CHIP_ERROR TestCreateNewUserWithDefaultParameters_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -123065,10 +122454,9 @@
 
     CHIP_ERROR TestReadTheUserBackAndVerifyItsFields_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetUserParams alloc] init];
@@ -123145,10 +122533,9 @@
 
     CHIP_ERROR TestThReadsNumberOfTotalUsersSupportedAttributeAndSavesForFutureUse_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeNumberOfTotalUsersSupportedWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -123170,10 +122557,9 @@
 
     CHIP_ERROR TestThSendsSetCredentialCommandToDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -123217,10 +122603,9 @@
 
     CHIP_ERROR TestThSendsGetCredentialStatusCommand_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -123267,10 +122652,9 @@
 
     CHIP_ERROR TestThSendsSetCredentialCommandToDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -123314,10 +122698,9 @@
 
     CHIP_ERROR TestThSendsSetCredentialCommandToDut_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -123362,6 +122745,7 @@
     CHIP_ERROR
     TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithStatusAsDuplicateOrOccupied_8()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -123372,6 +122756,7 @@
     CHIP_ERROR
     TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_9()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -123382,6 +122767,7 @@
     CHIP_ERROR
     TestThSendsSetCredentialCommandToDutAndVerifyThatTheDutSendsSetCredentialResponseCommandWithResponseAsOccupiedIfTheCredentialIndexIsRepeated_10()
     {
+
         chip::app::Clusters::LogCommands::Commands::UserPrompt::Type value;
         value.message = chip::Span<const char>("Please enter 'y' for successgarbage: not in length on purpose", 28);
         value.expectedValue.Emplace();
@@ -123391,10 +122777,9 @@
 
     CHIP_ERROR TestThSendsClearCredentialCommandToDut_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -123416,10 +122801,9 @@
 
     CHIP_ERROR TestThSendsGetCredentialStatusCommandToDut_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -123467,10 +122851,9 @@
 
     CHIP_ERROR TestThSendsSetUserCommandToDut_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetUserParams alloc] init];
@@ -123495,10 +122878,9 @@
 
     CHIP_ERROR TestThSendsSetCredentialCommandToDut_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterSetCredentialParams alloc] init];
@@ -123542,10 +122924,9 @@
 
     CHIP_ERROR TestThSendsClearCredentialCommandToDut_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -123567,10 +122948,9 @@
 
     CHIP_ERROR TestThSendsGetCredentialStatusCommand_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -123618,10 +122998,9 @@
 
     CHIP_ERROR TestThSendsGetCredentialStatusCommand_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterGetCredentialStatusParams alloc] init];
@@ -123669,10 +123048,9 @@
 
     CHIP_ERROR TestThSendsClearCredentialCommandToDut_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearCredentialParams alloc] init];
@@ -123697,10 +123075,9 @@
 
     CHIP_ERROR TestCleanupTheFirstCreatedUser_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -123719,10 +123096,9 @@
 
     CHIP_ERROR TestCleanupTheSecondCreatedUser_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterDoorLock * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device
-                                                                               endpointID:@(1)
-                                                                                    queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterDoorLock alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRDoorLockClusterClearUserParams alloc] init];
@@ -124000,6 +123376,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -124007,8 +123384,9 @@
 
     CHIP_ERROR TestViewGroup0Invalid_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124037,8 +123415,9 @@
 
     CHIP_ERROR TestViewFirstGroupNotFound_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124067,8 +123446,9 @@
 
     CHIP_ERROR TestAddFirstGroupNoKeys_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
@@ -124098,10 +123478,11 @@
 
     CHIP_ERROR TestAddKeySet_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
@@ -124137,10 +123518,11 @@
 
     CHIP_ERROR TestWriteGroupKeys_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id groupKeyMapArgument;
@@ -124172,8 +123554,9 @@
 
     CHIP_ERROR TestAddFirstGroupNew_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
@@ -124203,8 +123586,9 @@
 
     CHIP_ERROR TestViewFirstGroupNew_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124238,8 +123622,9 @@
 
     CHIP_ERROR TestViewSecondGroupNotFound_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124268,8 +123653,9 @@
 
     CHIP_ERROR TestGetGroupMembership1All_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
@@ -124303,8 +123689,9 @@
 
     CHIP_ERROR TestAddSecondGroupNew_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
@@ -124334,8 +123721,9 @@
 
     CHIP_ERROR TestViewSecondGroupNew_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124369,8 +123757,9 @@
 
     CHIP_ERROR TestViewGroup3NotFound_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124399,8 +123788,9 @@
 
     CHIP_ERROR TestViewFirstGroupExisting_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124434,8 +123824,9 @@
 
     CHIP_ERROR TestViewSecondGroupExisting_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124469,8 +123860,9 @@
 
     CHIP_ERROR TestGetGroupMembership2_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
@@ -124507,8 +123899,9 @@
 
     CHIP_ERROR TestRemoveGroup0Invalid_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
@@ -124537,8 +123930,9 @@
 
     CHIP_ERROR TestRemoveGroup4NotFound_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
@@ -124567,8 +123961,9 @@
 
     CHIP_ERROR TestRemoveSecondGroupExisting_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
@@ -124597,8 +123992,9 @@
 
     CHIP_ERROR TestViewFirstGroupNotRemoved_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124632,8 +124028,9 @@
 
     CHIP_ERROR TestViewSecondGroupRemoved_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124662,8 +124059,9 @@
 
     CHIP_ERROR TestGetGroupMembership3_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
@@ -124701,8 +124099,9 @@
 
     CHIP_ERROR TestRemoveAll_22()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
@@ -124718,8 +124117,9 @@
 
     CHIP_ERROR TestViewFirstGroupRemoved_23()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124748,8 +124148,9 @@
 
     CHIP_ERROR TestViewSecondGroupStillRemoved_24()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124778,8 +124179,9 @@
 
     CHIP_ERROR TestViewGroup3Removed_25()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterViewGroupParams alloc] init];
@@ -124808,8 +124210,9 @@
 
     CHIP_ERROR TestGetGroupMembership4_26()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterGetGroupMembershipParams alloc] init];
@@ -125071,6 +124474,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -125078,10 +124482,11 @@
 
     CHIP_ERROR TestReadMaxGroupsPerFabric_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxGroupsPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -125099,10 +124504,11 @@
 
     CHIP_ERROR TestReadMaxGroupKeysPerFabric_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeMaxGroupKeysPerFabricWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -125120,10 +124526,11 @@
 
     CHIP_ERROR TestKeySetWrite1_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
@@ -125159,10 +124566,11 @@
 
     CHIP_ERROR TestKeySetWrite2_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetWriteParams alloc] init];
@@ -125198,10 +124606,11 @@
 
     CHIP_ERROR TestKeySetRead_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
@@ -125248,10 +124657,11 @@
 
     CHIP_ERROR TestWriteGroupKeysInvalid_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id groupKeyMapArgument;
@@ -125282,10 +124692,11 @@
 
     CHIP_ERROR TestWriteGroupKeysTooMany_7()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id groupKeyMapArgument;
@@ -125331,10 +124742,11 @@
 
     CHIP_ERROR TestWriteGroupKeys_8()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         id groupKeyMapArgument;
@@ -125371,13 +124783,14 @@
 
     CHIP_ERROR TestReadGroupKeys_9()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster
             readAttributeGroupKeyMapWithParams:params
@@ -125424,8 +124837,9 @@
 
     CHIP_ERROR TestAddGroup1_10()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
@@ -125455,8 +124869,9 @@
 
     CHIP_ERROR TestAddGroup2_11()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterAddGroupParams alloc] init];
@@ -125486,13 +124901,14 @@
 
     CHIP_ERROR TestReadGroupTable_12()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster
             readAttributeGroupTableWithParams:params
@@ -125530,10 +124946,11 @@
 
     CHIP_ERROR TestKeySetRemove1_13()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
@@ -125552,10 +124969,11 @@
 
     CHIP_ERROR TestKeySetReadRemoved_14()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
@@ -125578,10 +124996,11 @@
 
     CHIP_ERROR TestKeySetReadNotRemoved_15()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
@@ -125628,8 +125047,9 @@
 
     CHIP_ERROR TestRemoveGroup1_16()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupsClusterRemoveGroupParams alloc] init];
@@ -125658,13 +125078,14 @@
 
     CHIP_ERROR TestReadGroupTable2_17()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster
             readAttributeGroupTableWithParams:params
@@ -125694,8 +125115,9 @@
 
     CHIP_ERROR TestRemoveAll_18()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster removeAllGroupsWithCompletion:^(NSError * _Nullable err) {
@@ -125711,13 +125133,14 @@
 
     CHIP_ERROR TestReadGroupTable3_19()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
-        MTRReadParams * params = [[MTRReadParams alloc] init];
+        __auto_type * params = [[MTRReadParams alloc] init];
         params.filterByFabric = true;
         [cluster
             readAttributeGroupTableWithParams:params
@@ -125739,10 +125162,11 @@
 
     CHIP_ERROR TestKeySetRemove2_20()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetRemoveParams alloc] init];
@@ -125761,10 +125185,11 @@
 
     CHIP_ERROR TestKeySetReadAlsoRemoved_21()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroupKeyManagement * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
-                                                                                                   endpointID:@(0)
-                                                                                                        queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroupKeyManagement alloc] initWithDevice:device
+                                                                              endpointID:@(0)
+                                                                                   queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         __auto_type * params = [[MTRGroupKeyManagementClusterKeySetReadParams alloc] init];
@@ -125914,6 +125339,7 @@
 
     CHIP_ERROR TestWaitForTheCommissionedDeviceToBeRetrieved_0()
     {
+
         chip::app::Clusters::DelayCommands::Commands::WaitForCommissionee::Type value;
         value.nodeId = mNodeId.HasValue() ? mNodeId.Value() : 305414945ULL;
         return WaitForCommissionee("alpha", value);
@@ -125921,8 +125347,9 @@
 
     CHIP_ERROR TestThReadsTheClusterRevisionFromDut_1()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeClusterRevisionWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -125944,8 +125371,9 @@
 
     CHIP_ERROR TestThReadsTheFeatureMapFromDut_2()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -125967,8 +125395,9 @@
 
     CHIP_ERROR TestGivenGsf00EnsureFeaturemapHasTheCorrectBitSet_3()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeFeatureMapWithCompletion:^(NSNumber * _Nullable value, NSError * _Nullable err) {
@@ -125985,8 +125414,9 @@
 
     CHIP_ERROR TestThReadsAttributeListFromDut_4()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAttributeListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -126010,8 +125440,9 @@
 
     CHIP_ERROR TestThReadsAcceptedCommandListFromDut_5()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeAcceptedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
@@ -126035,8 +125466,9 @@
 
     CHIP_ERROR TestThReadsGeneratedCommandListFromDut_6()
     {
+
         MTRBaseDevice * device = GetDevice("alpha");
-        MTRBaseClusterGroups * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
+        __auto_type * cluster = [[MTRBaseClusterGroups alloc] initWithDevice:device endpointID:@(1) queue:mCallbackQueue];
         VerifyOrReturnError(cluster != nil, CHIP_ERROR_INCORRECT_STATE);
 
         [cluster readAttributeGeneratedCommandListWithCompletion:^(NSArray * _Nullable value, NSError * _Nullable err) {
